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
}