@samitouri / QOSamiQemu / commits / 68457a8c2e

i386/kvm: unregister smram listeners prior to vm file descriptor change

We will re-register smram listeners after the VM file descriptors has changed. We need to unregister them first to make sure addresses and reference counters work properly. Signed-off-by: Ani Sinha <anisinha@redhat.com> Link: https://lore.kernel.org/r/20260225035000.385950-10-anisinha@redhat.com Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

Ani Sinha committed Feb 25, 2026 at 09:19 UTC 68457a8c2e9467720c766446957a98ac2a17f034
1 file changed +17
target/i386/kvm/kvm.c
+17
@@ -112,6 +112,11 @@ typedef struct {
112 static void kvm_init_msrs(X86CPU *cpu);
113 static int kvm_filter_msr(KVMState *s, uint32_t msr, QEMURDMSRHandler *rdmsr,
114 QEMUWRMSRHandler *wrmsr);
115 +static int unregister_smram_listener(NotifierWithReturn *notifier,
116 + void *data, Error** errp);
117 +NotifierWithReturn kvm_vmfd_change_notifier = {
118 + .notify = unregister_smram_listener,
119 +};
120
121 const KVMCapabilityInfo kvm_arch_required_capabilities[] = {
122 KVM_CAP_INFO(SET_TSS_ADDR),
@@ -2885,6 +2890,17 @@ static void register_smram_listener(Notifier *n, void *unused)
2890 }
2891 }
2892
2893 +static int unregister_smram_listener(NotifierWithReturn *notifier,
2894 + void *data, Error** errp)
2895 +{
2896 + if (!((VmfdChangeNotifier *)data)->pre) {
2897 + return 0;
2898 + }
2899 +
2900 + memory_listener_unregister(&smram_listener.listener);
2901 + return 0;
2902 +}
2903 +
2904 /* It should only be called in cpu's hotplug callback */
2905 void kvm_smm_cpu_address_space_init(X86CPU *cpu)
2906 {
@@ -3538,6 +3554,7 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
3554 }
3555
3556 pmu_cap = kvm_check_extension(s, KVM_CAP_PMU_CAPABILITY);
3557 + kvm_vmfd_add_change_notifier(&kvm_vmfd_change_notifier);
3558
3559 return 0;
3560 }