On Wed, Aug 25, 2021, Sean Christopherson wrote: > On Wed, Aug 25, 2021, Like Xu wrote: > > On 24/8/2021 3:37 am, Sean Christopherson wrote: > > > @@ -11061,6 +11061,8 @@ int kvm_arch_hardware_setup(void *opaque) > > > memcpy(&kvm_x86_ops, ops->runtime_ops, sizeof(kvm_x86_ops)); > > > kvm_ops_static_call_update(); > > > + if (ops->intel_pt_intr_in_guest && ops->intel_pt_intr_in_guest()) > > > + kvm_guest_cbs.handle_intel_pt_intr = kvm_handle_intel_pt_intr; > > > > Emm, it's still buggy. > > > > The guest "unknown NMI" from the host Intel PT can still be reproduced > > after the following operation: > > > > rmmod kvm_intel > > modprobe kvm-intel pt_mode=1 ept=1 > > rmmod kvm_intel > > modprobe kvm-intel pt_mode=1 ept=0 > > > > Since the handle_intel_pt_intr is not reset to NULL in kvm_arch_hardware_unsetup(), > > and the previous function pointer still exists in the generic KVM data structure. > > Ooof, good catch. Any preference between nullifying handle_intel_pt_intr in > setup() vs. unsetup()? I think I like the idea of "unwinding" during unsetup(), > even though it splits the logic a bit. Never mind, I figured out a way to clean all this up and land the PT interrupt handler in vmx.c where it belongs. Getting there is a bit of a journey, but it's very doable. That means unwinding in unsetup() is the preferred approach, otherwise there would be potential for leaving a dangling pointer if a different vendor module was succesfully loaded.