On Tue, Mar 9, 2021 at 9:10 AM Sean Christopherson <seanjc@xxxxxxxxxx> wrote: > > Initialize x86_pmu.guest_get_msrs to return 0/NULL to handle the "nop" > case. Patching in perf_guest_get_msrs_nop() during setup does not work > if there is no PMU, as setup bails before updating the static calls, > leaving x86_pmu.guest_get_msrs NULL and thus a complete nop. Ultimately, > this causes VMX abort on VM-Exit due to KVM putting random garbage from > the stack into the MSR load list. > > Add a comment in KVM to note that nr_msrs is valid if and only if the > return value is non-NULL. > > Fixes: abd562df94d1 ("x86/perf: Use static_call for x86_pmu.guest_get_msrs") > Cc: Like Xu <like.xu@xxxxxxxxxxxxxxx> > Cc: Paolo Bonzini <pbonzini@xxxxxxxxxx> > Cc: Jim Mattson <jmattson@xxxxxxxxxx> > Reported-by: Dmitry Vyukov <dvyukov@xxxxxxxxxx> > Reported-by: syzbot+cce9ef2dd25246f815ee@xxxxxxxxxxxxxxxxxxxxxxxxx > Suggested-by: Peter Zijlstra <peterz@xxxxxxxxxxxxx> > Signed-off-by: Sean Christopherson <seanjc@xxxxxxxxxx> > --- > > v2: > - Use __static_call_return0 to return NULL instead of manually checking > the hook at invocation. [Peter] > - Rebase to tip/sched/core, commit 4117cebf1a9f ("psi: Optimize task > switch inside shared cgroups"). > ... > diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c > index 50810d471462..32cf8287d4a7 100644 > --- a/arch/x86/kvm/vmx/vmx.c > +++ b/arch/x86/kvm/vmx/vmx.c > @@ -6580,8 +6580,8 @@ static void atomic_switch_perf_msrs(struct vcpu_vmx *vmx) > int i, nr_msrs; > struct perf_guest_switch_msr *msrs; > > + /* Note, nr_msrs may be garbage if perf_guest_get_msrs() returns NULL. */ You could drop the scary comment with a profligate initialization of nr_msrs to 0. [Apologies to those seeing this twice. I blame gmail.]