On 2024-04-11 4:43 p.m., Sean Christopherson wrote: >>> And peeking ahead, IIUC perf effectively _forces_ a passthrough model when >>> has_vpmu_passthrough_cap() is true, which is wrong. There needs to be a user/admin >>> opt-in (or opt-out) to that behavior, at a kernel/perf level, not just at a KVM >>> level. Hmm, or is perf relying on KVM to do that right thing? I.e. relying on >>> KVM to do perf_guest_{enter,exit}() if and only if the PMU can support the >>> passthrough model. >>> >> Yes, perf relies on KVM to tell if a guest is entering the passthrough mode. >> >>> If that's the case, most of the has_vpmu_passthrough_cap() checks are gratiutous >>> and confusing, e.g. just WARN if KVM (or some other module) tries to trigger a >>> PMU context switch when it's not supported by perf. >> If there is only non supported PMUs running in the host, perf wouldn't >> do any context switch. The guest can feel free to use the core PMU. We >> should not WARN for this case. > I'm struggling to wrap my head around this. If there is no supported PMU in the > host, how can there be a core PMU for the guest to use? KVM virtualizes a PMU > if and only if kvm_init_pmu_capability() reports a compatible PMU, and IIUC that > reporting is done based on the core PMU. > > Specifically, I want to ensure we don't screw is passing through PMU MSR access, > e.g. because KVM thinks perf will context switch those MSRs, but perf doesn't Perf only context switches the MSRs of the PMU with the PERF_PMU_CAP_VPMU_PASSTHROUGH flag. (Only the core PMU for this RFC). For other PMUs without the PERF_PMU_CAP_VPMU_PASSTHROUGH, perf does nothing in perf_guest_enter/exit(). KVM can rely on the flag to decide whether to enable the passthrough mode for the PMU. Thanks, Kan