Various subsystems might need to take some steps before the KVM file descriptor for a virtual machine is changed. So a new notifier is added to inform them that kvm VM file descriptor is about to change.
Subsequent patches will add callback implementations for specific components that need this notification. Signed-off-by: Ani Sinha <[email protected]> --- accel/kvm/kvm-all.c | 25 +++++++++++++++++++++++++ accel/stubs/kvm-stub.c | 8 ++++++++ include/system/kvm.h | 15 +++++++++++++++ 3 files changed, 48 insertions(+) diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c index 679cf04375..5b854c9866 100644 --- a/accel/kvm/kvm-all.c +++ b/accel/kvm/kvm-all.c @@ -127,6 +127,9 @@ static NotifierList kvm_irqchip_change_notifiers = static NotifierWithReturnList register_vmfd_changed_notifiers = NOTIFIER_WITH_RETURN_LIST_INITIALIZER(register_vmfd_changed_notifiers); +static NotifierWithReturnList register_vmfd_pre_change_notifiers = + NOTIFIER_WITH_RETURN_LIST_INITIALIZER(register_vmfd_pre_change_notifiers); + struct KVMResampleFd { int gsi; EventNotifier *resample_event; @@ -2193,6 +2196,22 @@ static int kvm_vmfd_change_notify(Error **errp) &vmfd_notifier, errp); } +void kvm_vmfd_add_pre_change_notifier(NotifierWithReturn *n) +{ + notifier_with_return_list_add(®ister_vmfd_pre_change_notifiers, n); +} + +void kvm_vmfd_remove_pre_change_notifier(NotifierWithReturn *n) +{ + notifier_with_return_remove(n); +} + +static int kvm_vmfd_pre_change_notify(Error **errp) +{ + return notifier_with_return_list_notify(®ister_vmfd_pre_change_notifiers, + NULL, errp); +} + int kvm_irqchip_get_virq(KVMState *s) { int next_virq; @@ -2644,6 +2663,12 @@ static int kvm_reset_vmfd(MachineState *ms) memory_listener_unregister(&kml->listener); memory_listener_unregister(&kvm_io_listener); + ret = kvm_vmfd_pre_change_notify(&err); + if (ret < 0) { + return ret; + } + assert(!err); + if (s->vmfd >= 0) { close(s->vmfd); } diff --git a/accel/stubs/kvm-stub.c b/accel/stubs/kvm-stub.c index a6e8a6e16c..7f4e3c4050 100644 --- a/accel/stubs/kvm-stub.c +++ b/accel/stubs/kvm-stub.c @@ -79,6 +79,14 @@ void kvm_irqchip_change_notify(void) { } +void kvm_vmfd_add_pre_change_notifier(NotifierWithReturn *n) +{ +} + +void kvm_vmfd_remove_pre_change_notifier(NotifierWithReturn *n) +{ +} + void kvm_vmfd_add_change_notifier(NotifierWithReturn *n) { } diff --git a/include/system/kvm.h b/include/system/kvm.h index 6844ebd56d..cb5db9ff67 100644 --- a/include/system/kvm.h +++ b/include/system/kvm.h @@ -586,4 +586,19 @@ void kvm_vmfd_add_change_notifier(NotifierWithReturn *n); */ void kvm_vmfd_remove_change_notifier(NotifierWithReturn *n); +/** + * kvm_vmfd_add_pre_change_notifier - register a notifier to get notified when + * kvm vm file descriptor is about to be changed as a part of the confidential + * guest "reset" process. + * @n: notifier with return value. + */ +void kvm_vmfd_add_pre_change_notifier(NotifierWithReturn *n); + +/** + * kvm_vmfd_remove_pre_change_notifier - de-register a notifier previously + * registered with kvm_vmfd_add_pre_change_notifier. + * @n: the notifier that was previously registered. + */ +void kvm_vmfd_remove_pre_change_notifier(NotifierWithReturn *n); + #endif -- 2.42.0
