On Tue, Jan 27, 2026 at 10:47 AM Ani Sinha <[email protected]> wrote: > > On confidential guests when the KVM virtual machine file descriptor changes as > a part of the reset process, event file descriptors needs to be reassociated > with the new KVM VM file descriptor. This is achieved with the help of a > callback handler that gets called when KVM VM file descriptor changes during > the confidential guest reset process. > > This patch is untested on confidential guests and only exists for > completeness.
I have been able to exercise this code in a non-coco environment and also will add a functional test for it in the next spin-up. So I will adjust this comment to reflect that the code has been exercised/tested in non-coco and will keep the change. > > Signed-off-by: Ani Sinha <[email protected]> > --- > hw/hyperv/vmbus.c | 36 ++++++++++++++++++++++++++++++++++++ > 1 file changed, 36 insertions(+) > > diff --git a/hw/hyperv/vmbus.c b/hw/hyperv/vmbus.c > index c5bab5d245..ff1b6f805c 100644 > --- a/hw/hyperv/vmbus.c > +++ b/hw/hyperv/vmbus.c > @@ -20,6 +20,7 @@ > #include "hw/hyperv/vmbus-bridge.h" > #include "hw/core/sysbus.h" > #include "exec/cpu-common.h" > +#include "system/kvm.h" > #include "exec/target_page.h" > #include "trace.h" > > @@ -248,6 +249,12 @@ struct VMBus { > * interrupt page > */ > EventNotifier notifier; > + > + /* > + * Notifier to inform when vmfd is changed as a part of confidential > guest > + * reset mechanism. > + */ > + NotifierWithReturn vmbus_vmfd_change_notifier; > }; > > static bool gpadl_full(VMBusGpadl *gpadl) > @@ -2347,6 +2354,32 @@ static void vmbus_dev_unrealize(DeviceState *dev) > free_channels(vdev); > } > > +/* > + * If the KVM fd changes because of VM reset in confidential guests, > + * reassociate event fd with the new KVM fd. > + */ > +static int vmbus_handle_vmfd_change(NotifierWithReturn *notifier, > + void *data, Error** errp) > +{ > + VMBus *vmbus = container_of(notifier, VMBus, > + vmbus_vmfd_change_notifier); > + int ret = 0; > + > + /* we are not interested in pre vmfd change notification */ > + if (((VmfdChangeNotifier *)data)->pre) { > + return 0; > + } > + > + ret = hyperv_set_event_flag_handler(VMBUS_EVENT_CONNECTION_ID, > + &vmbus->notifier); > + /* if we are only using userland event handler, it may already exist */ > + if (ret != 0 && ret != -EEXIST) { > + error_setg(errp, "hyperv set event handler failed with %d", ret); > + } > + > + return ret; > +} > + > static const Property vmbus_dev_props[] = { > DEFINE_PROP_UUID("instanceid", VMBusDevice, instanceid), > }; > @@ -2429,6 +2462,9 @@ static void vmbus_realize(BusState *bus, Error **errp) > goto clear_event_notifier; > } > > + vmbus->vmbus_vmfd_change_notifier.notify = vmbus_handle_vmfd_change; > + kvm_vmfd_add_change_notifier(&vmbus->vmbus_vmfd_change_notifier); > + > return; > > clear_event_notifier: > -- > 2.42.0 >
