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 :|