what a correct use for virConnectDomainEventRegisterAny API, how to Obtain a stable expected result

Daniel P. Berrangé berrange at redhat.com
Tue Apr 14 10:00:49 UTC 2020


On Mon, Apr 13, 2020 at 05:32:38PM +0800, thomas.kuang wrote:
> HI, everyone:
> 
> 
> My target  deal with network hotplug use virDomainDetachDeviceFlags. Because when the API return ,the network maybe doesn’t remove from my vm guest os.
> 
> So I use virConnectDomainEventRegisterAny  to register an event ID: VIR_DOMAIN_EVENT_ID_DEVICE_REMOVED ,
> 
>  my process as follow:
> 
> cb_para->call_id=virConnectDomainEventRegisterAny(cb_para->conn,cb_para->dom,VIR_DOMAIN_EVENT_ID_DEVICE_REMOVED, VIR_DOMAIN_EVENT_CALLBACK(vnf_control_del_network_cb), cb_para, vnf_control_del_network_cb_free); 
> 
> 
> 
>     flags |= VIR_DOMAIN_AFFECT_CONFIG;
>     if (virDomainIsActive(dom) == 1) {
>         flags |= VIR_DOMAIN_AFFECT_LIVE;
>     }
> 
>     ret = virDomainDetachDeviceFlags(dom, xml, flags);
> 
> 
>  
> 
> above code write in thread loop ,then in the same loop :
> 
>  
> 
>        while (1) {
> 
>               mission = vnf_mission_queue_get(task);
> 
>               if (mission == NULL) {
> 
>                      sleep(1);
> 
>                      continue;
> 
>               } 
> 
>               vnf_op_process(&mission->info); // this will deal with network hotplug,will call virConnectDomainEventRegisterAny  then call  virDomainDetachDeviceFlags
> 
>               if (mission) {
> 
>                      vnf_mission_free(mission);
> 
>               } 
> 
>               if(virEventRunDefaultImpl() < 0) { // at here process  the registered callback for event-registered
> 
>                     printf();....
> 
> 
>               }     
> 
>        }
> 
> My problem is: some time  , the virEventRunDefaultImpl can trigger the
> vnf_control_del_network_cb  callback ,but some time  there is nothing,
> as if the VIR_DOMAIN_EVENT_ID_DEVICE_REMOVED has lost.
> what cause the Unpredictable behavior ?  what is a correct use for
> virConnectDomainEventRegisterAny ?

The virDomainDetachDeviceFlags API is asynchronous and requires a cooperative
guest to complete. It merely injects an ACPI PCI unplug request to the guest
OS.  If the guest OS doesn't honour this request (because it is in early
bootup, or is in BIOS, or is crashed, or is configured to disable hotplug,
or is maliciously not responding), then the device will never be unplugged,
and so you'll never get an event.

So the first thing for you todo is to validate that the device really is
being unplugged in the guest OS, and in QEMU.

To check QEMU run:

  virsh qemu-monitor-command --hmp $GUEST "info pci"

and look to see if the PCI device is still listed in the output.

Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|




More information about the libvir-list mailing list