From nobody Wed May 14 20:38:55 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1527160591241196.98601623263858; Thu, 24 May 2018 04:16:31 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id ABEC730BBF8F; Thu, 24 May 2018 11:16:29 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 69E47308BDA3; Thu, 24 May 2018 11:16:29 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id E3B1B18033ED; Thu, 24 May 2018 11:16:28 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w4OBErG6017458 for ; Thu, 24 May 2018 07:14:53 -0400 Received: by smtp.corp.redhat.com (Postfix) id 2F09B10AF9E9; Thu, 24 May 2018 11:14:53 +0000 (UTC) Received: from moe.brq.redhat.com (unknown [10.43.2.192]) by smtp.corp.redhat.com (Postfix) with ESMTP id AB74E10AF9E8 for ; Thu, 24 May 2018 11:14:52 +0000 (UTC) From: Michal Privoznik To: libvir-list@redhat.com Date: Thu, 24 May 2018 13:13:37 +0200 Message-Id: In-Reply-To: References: In-Reply-To: References: X-Scanned-By: MIMEDefang 2.78 on 10.11.54.3 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v2 10/12] qemu_hotplug: Allow asynchronous detach X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.84 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.48]); Thu, 24 May 2018 11:16:30 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" The virDomainDetachDeviceAlias API is designed so that it only sends detach request to qemu. It's user's responsibility to wait for DEVICE_DELETED event, not libvirt's. Add @async flag to qemuDomainDetach*Device() functions so that caller can chose if detach is semi-synchronous (old virDomainDetachDeviceFlags()) or fully asynchronous (new virDomainDetachDeviceFlags()). Signed-off-by: Michal Privoznik Reviewed-by: J=EF=BF=BDn Tomko --- src/qemu/qemu_driver.c | 32 +++---- src/qemu/qemu_hotplug.c | 231 ++++++++++++++++++++++++++++++++------------= ---- src/qemu/qemu_hotplug.h | 33 ++++--- tests/qemuhotplugtest.c | 13 +-- 4 files changed, 203 insertions(+), 106 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 2347e71cfb..81a9833b39 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -7726,14 +7726,15 @@ qemuDomainAttachDeviceLive(virDomainObjPtr vm, static int qemuDomainDetachDeviceControllerLive(virQEMUDriverPtr driver, virDomainObjPtr vm, - virDomainDeviceDefPtr dev) + virDomainDeviceDefPtr dev, + bool async) { virDomainControllerDefPtr cont =3D dev->data.controller; int ret =3D -1; =20 switch (cont->type) { case VIR_DOMAIN_CONTROLLER_TYPE_SCSI: - ret =3D qemuDomainDetachControllerDevice(driver, vm, dev); + ret =3D qemuDomainDetachControllerDevice(driver, vm, dev, async); break; default : virReportError(VIR_ERR_OPERATION_UNSUPPORTED, @@ -7746,46 +7747,47 @@ qemuDomainDetachDeviceControllerLive(virQEMUDriverP= tr driver, static int qemuDomainDetachDeviceLive(virDomainObjPtr vm, virDomainDeviceDefPtr dev, - virQEMUDriverPtr driver) + virQEMUDriverPtr driver, + bool async) { int ret =3D -1; =20 switch ((virDomainDeviceType)dev->type) { case VIR_DOMAIN_DEVICE_DISK: - ret =3D qemuDomainDetachDeviceDiskLive(driver, vm, dev); + ret =3D qemuDomainDetachDeviceDiskLive(driver, vm, dev, async); break; case VIR_DOMAIN_DEVICE_CONTROLLER: - ret =3D qemuDomainDetachDeviceControllerLive(driver, vm, dev); + ret =3D qemuDomainDetachDeviceControllerLive(driver, vm, dev, asyn= c); break; case VIR_DOMAIN_DEVICE_LEASE: ret =3D qemuDomainDetachLease(driver, vm, dev->data.lease); break; case VIR_DOMAIN_DEVICE_NET: - ret =3D qemuDomainDetachNetDevice(driver, vm, dev); + ret =3D qemuDomainDetachNetDevice(driver, vm, dev, async); break; case VIR_DOMAIN_DEVICE_HOSTDEV: - ret =3D qemuDomainDetachHostDevice(driver, vm, dev); + ret =3D qemuDomainDetachHostDevice(driver, vm, dev, async); break; case VIR_DOMAIN_DEVICE_CHR: - ret =3D qemuDomainDetachChrDevice(driver, vm, dev->data.chr); + ret =3D qemuDomainDetachChrDevice(driver, vm, dev->data.chr, async= ); break; case VIR_DOMAIN_DEVICE_RNG: - ret =3D qemuDomainDetachRNGDevice(driver, vm, dev->data.rng); + ret =3D qemuDomainDetachRNGDevice(driver, vm, dev->data.rng, async= ); break; case VIR_DOMAIN_DEVICE_MEMORY: - ret =3D qemuDomainDetachMemoryDevice(driver, vm, dev->data.memory); + ret =3D qemuDomainDetachMemoryDevice(driver, vm, dev->data.memory,= async); break; case VIR_DOMAIN_DEVICE_SHMEM: - ret =3D qemuDomainDetachShmemDevice(driver, vm, dev->data.shmem); + ret =3D qemuDomainDetachShmemDevice(driver, vm, dev->data.shmem, a= sync); break; case VIR_DOMAIN_DEVICE_WATCHDOG: - ret =3D qemuDomainDetachWatchdog(driver, vm, dev->data.watchdog); + ret =3D qemuDomainDetachWatchdog(driver, vm, dev->data.watchdog, a= sync); break; case VIR_DOMAIN_DEVICE_INPUT: - ret =3D qemuDomainDetachInputDevice(vm, dev->data.input); + ret =3D qemuDomainDetachInputDevice(vm, dev->data.input, async); break; case VIR_DOMAIN_DEVICE_REDIRDEV: - ret =3D qemuDomainDetachRedirdevDevice(driver, vm, dev->data.redir= dev); + ret =3D qemuDomainDetachRedirdevDevice(driver, vm, dev->data.redir= dev, async); break; =20 case VIR_DOMAIN_DEVICE_FS: @@ -8716,7 +8718,7 @@ qemuDomainDetachDeviceLiveAndConfig(virQEMUDriverPtr = driver, } =20 if (flags & VIR_DOMAIN_AFFECT_LIVE) { - if (qemuDomainDetachDeviceLive(vm, dev_copy, driver) < 0) + if (qemuDomainDetachDeviceLive(vm, dev_copy, driver, false) < 0) goto cleanup; /* * update domain status forcibly because the domain status may be diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index e84dc909b9..5b5c27b011 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -4740,7 +4740,8 @@ qemuDomainSignalDeviceRemoval(virDomainObjPtr vm, static int qemuDomainDetachVirtioDiskDevice(virQEMUDriverPtr driver, virDomainObjPtr vm, - virDomainDiskDefPtr detach) + virDomainDiskDefPtr detach, + bool async) { int ret =3D -1; qemuDomainObjPrivatePtr priv =3D vm->privateData; @@ -4757,7 +4758,8 @@ qemuDomainDetachVirtioDiskDevice(virQEMUDriverPtr dri= ver, goto cleanup; } =20 - qemuDomainMarkDeviceForRemoval(vm, &detach->info); + if (!async) + qemuDomainMarkDeviceForRemoval(vm, &detach->info); =20 qemuDomainObjEnterMonitor(driver, vm); if (qemuMonitorDelDevice(priv->mon, detach->info.alias) < 0) { @@ -4769,18 +4771,24 @@ qemuDomainDetachVirtioDiskDevice(virQEMUDriverPtr d= river, if (qemuDomainObjExitMonitor(driver, vm) < 0) goto cleanup; =20 - if ((ret =3D qemuDomainWaitForDeviceRemoval(vm)) =3D=3D 1) - ret =3D qemuDomainRemoveDiskDevice(driver, vm, detach); + if (async) { + ret =3D 0; + } else { + if ((ret =3D qemuDomainWaitForDeviceRemoval(vm)) =3D=3D 1) + ret =3D qemuDomainRemoveDiskDevice(driver, vm, detach); + } =20 cleanup: - qemuDomainResetDeviceRemoval(vm); + if (!async) + qemuDomainResetDeviceRemoval(vm); return ret; } =20 static int qemuDomainDetachDiskDevice(virQEMUDriverPtr driver, virDomainObjPtr vm, - virDomainDiskDefPtr detach) + virDomainDiskDefPtr detach, + bool async) { int ret =3D -1; qemuDomainObjPrivatePtr priv =3D vm->privateData; @@ -4788,7 +4796,8 @@ qemuDomainDetachDiskDevice(virQEMUDriverPtr driver, if (qemuDomainDiskBlockJobIsActive(detach)) goto cleanup; =20 - qemuDomainMarkDeviceForRemoval(vm, &detach->info); + if (!async) + qemuDomainMarkDeviceForRemoval(vm, &detach->info); =20 qemuDomainObjEnterMonitor(driver, vm); if (qemuMonitorDelDevice(priv->mon, detach->info.alias) < 0) { @@ -4800,11 +4809,16 @@ qemuDomainDetachDiskDevice(virQEMUDriverPtr driver, if (qemuDomainObjExitMonitor(driver, vm) < 0) goto cleanup; =20 - if ((ret =3D qemuDomainWaitForDeviceRemoval(vm)) =3D=3D 1) - ret =3D qemuDomainRemoveDiskDevice(driver, vm, detach); + if (async) { + ret =3D 0; + } else { + if ((ret =3D qemuDomainWaitForDeviceRemoval(vm)) =3D=3D 1) + ret =3D qemuDomainRemoveDiskDevice(driver, vm, detach); + } =20 cleanup: - qemuDomainResetDeviceRemoval(vm); + if (!async) + qemuDomainResetDeviceRemoval(vm); return ret; } =20 @@ -4824,7 +4838,8 @@ qemuFindDisk(virDomainDefPtr def, const char *dst) int qemuDomainDetachDeviceDiskLive(virQEMUDriverPtr driver, virDomainObjPtr vm, - virDomainDeviceDefPtr dev) + virDomainDeviceDefPtr dev, + bool async) { virDomainDiskDefPtr disk; int ret =3D -1; @@ -4841,10 +4856,10 @@ qemuDomainDetachDeviceDiskLive(virQEMUDriverPtr dri= ver, case VIR_DOMAIN_DISK_DEVICE_DISK: case VIR_DOMAIN_DISK_DEVICE_LUN: if (disk->bus =3D=3D VIR_DOMAIN_DISK_BUS_VIRTIO) - ret =3D qemuDomainDetachVirtioDiskDevice(driver, vm, disk); + ret =3D qemuDomainDetachVirtioDiskDevice(driver, vm, disk, asy= nc); else if (disk->bus =3D=3D VIR_DOMAIN_DISK_BUS_SCSI || disk->bus =3D=3D VIR_DOMAIN_DISK_BUS_USB) - ret =3D qemuDomainDetachDiskDevice(driver, vm, disk); + ret =3D qemuDomainDetachDiskDevice(driver, vm, disk, async); else virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", _("This type of disk cannot be hot unplugged")); @@ -4922,7 +4937,8 @@ static bool qemuDomainControllerIsBusy(virDomainObjPt= r vm, =20 int qemuDomainDetachControllerDevice(virQEMUDriverPtr driver, virDomainObjPtr vm, - virDomainDeviceDefPtr dev) + virDomainDeviceDefPtr dev, + bool async) { int idx, ret =3D -1; virDomainControllerDefPtr detach =3D NULL; @@ -4974,7 +4990,8 @@ int qemuDomainDetachControllerDevice(virQEMUDriverPtr= driver, goto cleanup; } =20 - qemuDomainMarkDeviceForRemoval(vm, &detach->info); + if (!async) + qemuDomainMarkDeviceForRemoval(vm, &detach->info); =20 qemuDomainObjEnterMonitor(driver, vm); if (qemuMonitorDelDevice(priv->mon, detach->info.alias)) { @@ -4984,18 +5001,24 @@ int qemuDomainDetachControllerDevice(virQEMUDriverP= tr driver, if (qemuDomainObjExitMonitor(driver, vm) < 0) goto cleanup; =20 - if ((ret =3D qemuDomainWaitForDeviceRemoval(vm)) =3D=3D 1) - ret =3D qemuDomainRemoveControllerDevice(driver, vm, detach); + if (async) { + ret =3D 0; + } else { + if ((ret =3D qemuDomainWaitForDeviceRemoval(vm)) =3D=3D 1) + ret =3D qemuDomainRemoveControllerDevice(driver, vm, detach); + } =20 cleanup: - qemuDomainResetDeviceRemoval(vm); + if (!async) + qemuDomainResetDeviceRemoval(vm); return ret; } =20 static int qemuDomainDetachHostPCIDevice(virQEMUDriverPtr driver, virDomainObjPtr vm, - virDomainHostdevDefPtr detach) + virDomainHostdevDefPtr detach, + bool async) { qemuDomainObjPrivatePtr priv =3D vm->privateData; virDomainHostdevSubsysPCIPtr pcisrc =3D &detach->source.subsys.u.pci; @@ -5009,7 +5032,8 @@ qemuDomainDetachHostPCIDevice(virQEMUDriverPtr driver, return -1; } =20 - qemuDomainMarkDeviceForRemoval(vm, detach->info); + if (!async) + qemuDomainMarkDeviceForRemoval(vm, detach->info); =20 qemuDomainObjEnterMonitor(driver, vm); ret =3D qemuMonitorDelDevice(priv->mon, detach->info->alias); @@ -5022,7 +5046,8 @@ qemuDomainDetachHostPCIDevice(virQEMUDriverPtr driver, static int qemuDomainDetachHostUSBDevice(virQEMUDriverPtr driver, virDomainObjPtr vm, - virDomainHostdevDefPtr detach) + virDomainHostdevDefPtr detach, + bool async) { qemuDomainObjPrivatePtr priv =3D vm->privateData; int ret; @@ -5033,7 +5058,8 @@ qemuDomainDetachHostUSBDevice(virQEMUDriverPtr driver, return -1; } =20 - qemuDomainMarkDeviceForRemoval(vm, detach->info); + if (!async) + qemuDomainMarkDeviceForRemoval(vm, detach->info); =20 qemuDomainObjEnterMonitor(driver, vm); ret =3D qemuMonitorDelDevice(priv->mon, detach->info->alias); @@ -5046,7 +5072,8 @@ qemuDomainDetachHostUSBDevice(virQEMUDriverPtr driver, static int qemuDomainDetachHostSCSIDevice(virQEMUDriverPtr driver, virDomainObjPtr vm, - virDomainHostdevDefPtr detach) + virDomainHostdevDefPtr detach, + bool async) { qemuDomainObjPrivatePtr priv =3D vm->privateData; int ret =3D -1; @@ -5057,7 +5084,8 @@ qemuDomainDetachHostSCSIDevice(virQEMUDriverPtr drive= r, return -1; } =20 - qemuDomainMarkDeviceForRemoval(vm, detach->info); + if (!async) + qemuDomainMarkDeviceForRemoval(vm, detach->info); =20 qemuDomainObjEnterMonitor(driver, vm); ret =3D qemuMonitorDelDevice(priv->mon, detach->info->alias); @@ -5071,7 +5099,8 @@ qemuDomainDetachHostSCSIDevice(virQEMUDriverPtr drive= r, static int qemuDomainDetachSCSIVHostDevice(virQEMUDriverPtr driver, virDomainObjPtr vm, - virDomainHostdevDefPtr detach) + virDomainHostdevDefPtr detach, + bool async) { qemuDomainObjPrivatePtr priv =3D vm->privateData; int ret =3D -1; @@ -5082,7 +5111,8 @@ qemuDomainDetachSCSIVHostDevice(virQEMUDriverPtr driv= er, return -1; } =20 - qemuDomainMarkDeviceForRemoval(vm, detach->info); + if (!async) + qemuDomainMarkDeviceForRemoval(vm, detach->info); =20 qemuDomainObjEnterMonitor(driver, vm); ret =3D qemuMonitorDelDevice(priv->mon, detach->info->alias); @@ -5097,7 +5127,8 @@ qemuDomainDetachSCSIVHostDevice(virQEMUDriverPtr driv= er, static int qemuDomainDetachMediatedDevice(virQEMUDriverPtr driver, virDomainObjPtr vm, - virDomainHostdevDefPtr detach) + virDomainHostdevDefPtr detach, + bool async) { int ret =3D -1; qemuDomainObjPrivatePtr priv =3D vm->privateData; @@ -5108,7 +5139,8 @@ qemuDomainDetachMediatedDevice(virQEMUDriverPtr drive= r, return -1; } =20 - qemuDomainMarkDeviceForRemoval(vm, detach->info); + if (!async) + qemuDomainMarkDeviceForRemoval(vm, detach->info); =20 qemuDomainObjEnterMonitor(driver, vm); ret =3D qemuMonitorDelDevice(priv->mon, detach->info->alias); @@ -5122,7 +5154,8 @@ qemuDomainDetachMediatedDevice(virQEMUDriverPtr drive= r, static int qemuDomainDetachThisHostDevice(virQEMUDriverPtr driver, virDomainObjPtr vm, - virDomainHostdevDefPtr detach) + virDomainHostdevDefPtr detach, + bool async) { int ret =3D -1; =20 @@ -5131,19 +5164,19 @@ qemuDomainDetachThisHostDevice(virQEMUDriverPtr dri= ver, =20 switch (detach->source.subsys.type) { case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI: - ret =3D qemuDomainDetachHostPCIDevice(driver, vm, detach); + ret =3D qemuDomainDetachHostPCIDevice(driver, vm, detach, async); break; case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB: - ret =3D qemuDomainDetachHostUSBDevice(driver, vm, detach); + ret =3D qemuDomainDetachHostUSBDevice(driver, vm, detach, async); break; case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI: - ret =3D qemuDomainDetachHostSCSIDevice(driver, vm, detach); + ret =3D qemuDomainDetachHostSCSIDevice(driver, vm, detach, async); break; case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST: - ret =3D qemuDomainDetachSCSIVHostDevice(driver, vm, detach); + ret =3D qemuDomainDetachSCSIVHostDevice(driver, vm, detach, async); break; case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV: - ret =3D qemuDomainDetachMediatedDevice(driver, vm, detach); + ret =3D qemuDomainDetachMediatedDevice(driver, vm, detach, async); break; default: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, @@ -5155,11 +5188,13 @@ qemuDomainDetachThisHostDevice(virQEMUDriverPtr dri= ver, if (ret < 0) { if (virDomainObjIsActive(vm)) virDomainAuditHostdev(vm, detach, "detach", false); - } else if ((ret =3D qemuDomainWaitForDeviceRemoval(vm)) =3D=3D 1) { + } else if (!async && + (ret =3D qemuDomainWaitForDeviceRemoval(vm)) =3D=3D 1) { ret =3D qemuDomainRemoveHostDevice(driver, vm, detach); } =20 - qemuDomainResetDeviceRemoval(vm); + if (!async) + qemuDomainResetDeviceRemoval(vm); =20 return ret; } @@ -5167,7 +5202,8 @@ qemuDomainDetachThisHostDevice(virQEMUDriverPtr drive= r, /* search for a hostdev matching dev and detach it */ int qemuDomainDetachHostDevice(virQEMUDriverPtr driver, virDomainObjPtr vm, - virDomainDeviceDefPtr dev) + virDomainDeviceDefPtr dev, + bool async) { virDomainHostdevDefPtr hostdev =3D dev->data.hostdev; virDomainHostdevSubsysPtr subsys =3D &hostdev->source.subsys; @@ -5242,16 +5278,17 @@ int qemuDomainDetachHostDevice(virQEMUDriverPtr dri= ver, * function so that mac address / virtualport are reset */ if (detach->parent.type =3D=3D VIR_DOMAIN_DEVICE_NET) - return qemuDomainDetachNetDevice(driver, vm, &detach->parent); + return qemuDomainDetachNetDevice(driver, vm, &detach->parent, asyn= c); else - return qemuDomainDetachThisHostDevice(driver, vm, detach); + return qemuDomainDetachThisHostDevice(driver, vm, detach, async); } =20 =20 int qemuDomainDetachShmemDevice(virQEMUDriverPtr driver, virDomainObjPtr vm, - virDomainShmemDefPtr dev) + virDomainShmemDefPtr dev, + bool async) { int ret =3D -1; ssize_t idx =3D -1; @@ -5282,7 +5319,8 @@ qemuDomainDetachShmemDevice(virQEMUDriverPtr driver, return -1; } =20 - qemuDomainMarkDeviceForRemoval(vm, &shmem->info); + if (!async) + qemuDomainMarkDeviceForRemoval(vm, &shmem->info); =20 qemuDomainObjEnterMonitor(driver, vm); if (qemuMonitorDelDevice(priv->mon, shmem->info.alias) < 0) { @@ -5304,7 +5342,8 @@ qemuDomainDetachShmemDevice(virQEMUDriverPtr driver, int qemuDomainDetachWatchdog(virQEMUDriverPtr driver, virDomainObjPtr vm, - virDomainWatchdogDefPtr dev) + virDomainWatchdogDefPtr dev, + bool async) { int ret =3D -1; virDomainWatchdogDefPtr watchdog =3D vm->def->watchdog; @@ -5336,7 +5375,8 @@ qemuDomainDetachWatchdog(virQEMUDriverPtr driver, return -1; } =20 - qemuDomainMarkDeviceForRemoval(vm, &watchdog->info); + if (!async) + qemuDomainMarkDeviceForRemoval(vm, &watchdog->info); =20 qemuDomainObjEnterMonitor(driver, vm); if (qemuMonitorDelDevice(priv->mon, watchdog->info.alias) < 0) { @@ -5358,7 +5398,8 @@ qemuDomainDetachWatchdog(virQEMUDriverPtr driver, int qemuDomainDetachRedirdevDevice(virQEMUDriverPtr driver, virDomainObjPtr vm, - virDomainRedirdevDefPtr dev) + virDomainRedirdevDefPtr dev, + bool async) { int ret =3D -1; qemuDomainObjPrivatePtr priv =3D vm->privateData; @@ -5379,7 +5420,8 @@ qemuDomainDetachRedirdevDevice(virQEMUDriverPtr drive= r, return -1; } =20 - qemuDomainMarkDeviceForRemoval(vm, &tmpRedirdevDef->info); + if (!async) + qemuDomainMarkDeviceForRemoval(vm, &tmpRedirdevDef->info); =20 qemuDomainObjEnterMonitor(driver, vm); if (qemuMonitorDelDevice(priv->mon, tmpRedirdevDef->info.alias) < 0) { @@ -5389,11 +5431,16 @@ qemuDomainDetachRedirdevDevice(virQEMUDriverPtr dri= ver, if (qemuDomainObjExitMonitor(driver, vm) < 0) goto cleanup; =20 - if ((ret =3D qemuDomainWaitForDeviceRemoval(vm)) =3D=3D 1) - ret =3D qemuDomainRemoveRedirdevDevice(driver, vm, tmpRedirdevDef); + if (async) { + ret =3D 0; + } else { + if ((ret =3D qemuDomainWaitForDeviceRemoval(vm)) =3D=3D 1) + ret =3D qemuDomainRemoveRedirdevDevice(driver, vm, tmpRedirdev= Def); + } =20 cleanup: - qemuDomainResetDeviceRemoval(vm); + if (!async) + qemuDomainResetDeviceRemoval(vm); return ret; } =20 @@ -5401,7 +5448,8 @@ qemuDomainDetachRedirdevDevice(virQEMUDriverPtr drive= r, int qemuDomainDetachNetDevice(virQEMUDriverPtr driver, virDomainObjPtr vm, - virDomainDeviceDefPtr dev) + virDomainDeviceDefPtr dev, + bool async) { int detachidx, ret =3D -1; virDomainNetDefPtr detach =3D NULL; @@ -5414,7 +5462,8 @@ qemuDomainDetachNetDevice(virQEMUDriverPtr driver, =20 if (virDomainNetGetActualType(detach) =3D=3D VIR_DOMAIN_NET_TYPE_HOSTD= EV) { ret =3D qemuDomainDetachThisHostDevice(driver, vm, - virDomainNetGetActualHostdev(= detach)); + virDomainNetGetActualHostdev(= detach),\ + async); goto cleanup; } =20 @@ -5442,7 +5491,8 @@ qemuDomainDetachNetDevice(virQEMUDriverPtr driver, */ ignore_value(qemuInterfaceStopDevice(detach)); =20 - qemuDomainMarkDeviceForRemoval(vm, &detach->info); + if (!async) + qemuDomainMarkDeviceForRemoval(vm, &detach->info); =20 qemuDomainObjEnterMonitor(driver, vm); if (qemuMonitorDelDevice(priv->mon, detach->info.alias) < 0) { @@ -5454,11 +5504,16 @@ qemuDomainDetachNetDevice(virQEMUDriverPtr driver, if (qemuDomainObjExitMonitor(driver, vm) < 0) goto cleanup; =20 - if ((ret =3D qemuDomainWaitForDeviceRemoval(vm)) =3D=3D 1) - ret =3D qemuDomainRemoveNetDevice(driver, vm, detach); + if (async) { + ret =3D 0; + } else { + if ((ret =3D qemuDomainWaitForDeviceRemoval(vm)) =3D=3D 1) + ret =3D qemuDomainRemoveNetDevice(driver, vm, detach); + } =20 cleanup: - qemuDomainResetDeviceRemoval(vm); + if (!async) + qemuDomainResetDeviceRemoval(vm); return ret; } =20 @@ -5585,7 +5640,8 @@ int qemuDomainDetachLease(virQEMUDriverPtr driver, =20 int qemuDomainDetachChrDevice(virQEMUDriverPtr driver, virDomainObjPtr vm, - virDomainChrDefPtr chr) + virDomainChrDefPtr chr, + bool async) { int ret =3D -1; qemuDomainObjPrivatePtr priv =3D vm->privateData; @@ -5609,7 +5665,8 @@ int qemuDomainDetachChrDevice(virQEMUDriverPtr driver, if (qemuBuildChrDeviceStr(&devstr, vmdef, chr, priv->qemuCaps) < 0) goto cleanup; =20 - qemuDomainMarkDeviceForRemoval(vm, &tmpChr->info); + if (!async) + qemuDomainMarkDeviceForRemoval(vm, &tmpChr->info); =20 qemuDomainObjEnterMonitor(driver, vm); if (devstr && qemuMonitorDelDevice(priv->mon, tmpChr->info.alias) < 0)= { @@ -5619,11 +5676,16 @@ int qemuDomainDetachChrDevice(virQEMUDriverPtr driv= er, if (qemuDomainObjExitMonitor(driver, vm) < 0) goto cleanup; =20 - if ((ret =3D qemuDomainWaitForDeviceRemoval(vm)) =3D=3D 1) - ret =3D qemuDomainRemoveChrDevice(driver, vm, tmpChr); + if (async) { + ret =3D 0; + } else { + if ((ret =3D qemuDomainWaitForDeviceRemoval(vm)) =3D=3D 1) + ret =3D qemuDomainRemoveChrDevice(driver, vm, tmpChr); + } =20 cleanup: - qemuDomainResetDeviceRemoval(vm); + if (!async) + qemuDomainResetDeviceRemoval(vm); VIR_FREE(devstr); return ret; } @@ -5632,7 +5694,8 @@ int qemuDomainDetachChrDevice(virQEMUDriverPtr driver, int qemuDomainDetachRNGDevice(virQEMUDriverPtr driver, virDomainObjPtr vm, - virDomainRNGDefPtr rng) + virDomainRNGDefPtr rng, + bool async) { qemuDomainObjPrivatePtr priv =3D vm->privateData; ssize_t idx; @@ -5656,18 +5719,24 @@ qemuDomainDetachRNGDevice(virQEMUDriverPtr driver, return -1; } =20 - qemuDomainMarkDeviceForRemoval(vm, &tmpRNG->info); + if (!async) + qemuDomainMarkDeviceForRemoval(vm, &tmpRNG->info); =20 qemuDomainObjEnterMonitor(driver, vm); rc =3D qemuMonitorDelDevice(priv->mon, tmpRNG->info.alias); if (qemuDomainObjExitMonitor(driver, vm) || rc < 0) goto cleanup; =20 - if ((ret =3D qemuDomainWaitForDeviceRemoval(vm)) =3D=3D 1) - ret =3D qemuDomainRemoveRNGDevice(driver, vm, tmpRNG); + if (async) { + ret =3D 0; + } else { + if ((ret =3D qemuDomainWaitForDeviceRemoval(vm)) =3D=3D 1) + ret =3D qemuDomainRemoveRNGDevice(driver, vm, tmpRNG); + } =20 cleanup: - qemuDomainResetDeviceRemoval(vm); + if (!async) + qemuDomainResetDeviceRemoval(vm); return ret; } =20 @@ -5675,7 +5744,8 @@ qemuDomainDetachRNGDevice(virQEMUDriverPtr driver, int qemuDomainDetachMemoryDevice(virQEMUDriverPtr driver, virDomainObjPtr vm, - virDomainMemoryDefPtr memdef) + virDomainMemoryDefPtr memdef, + bool async) { qemuDomainObjPrivatePtr priv =3D vm->privateData; virDomainMemoryDefPtr mem; @@ -5701,18 +5771,24 @@ qemuDomainDetachMemoryDevice(virQEMUDriverPtr drive= r, return -1; } =20 - qemuDomainMarkDeviceForRemoval(vm, &mem->info); + if (!async) + qemuDomainMarkDeviceForRemoval(vm, &mem->info); =20 qemuDomainObjEnterMonitor(driver, vm); rc =3D qemuMonitorDelDevice(priv->mon, mem->info.alias); if (qemuDomainObjExitMonitor(driver, vm) < 0 || rc < 0) goto cleanup; =20 - if ((ret =3D qemuDomainWaitForDeviceRemoval(vm)) =3D=3D 1) - ret =3D qemuDomainRemoveMemoryDevice(driver, vm, mem); + if (async) { + ret =3D 0; + } else { + if ((ret =3D qemuDomainWaitForDeviceRemoval(vm)) =3D=3D 1) + ret =3D qemuDomainRemoveMemoryDevice(driver, vm, mem); + } =20 cleanup: - qemuDomainResetDeviceRemoval(vm); + if (!async) + qemuDomainResetDeviceRemoval(vm); return ret; } =20 @@ -6380,7 +6456,8 @@ qemuDomainSetVcpuInternal(virQEMUDriverPtr driver, =20 int qemuDomainDetachInputDevice(virDomainObjPtr vm, - virDomainInputDefPtr def) + virDomainInputDefPtr def, + bool async) { qemuDomainObjPrivatePtr priv =3D vm->privateData; virQEMUDriverPtr driver =3D priv->driver; @@ -6410,7 +6487,8 @@ qemuDomainDetachInputDevice(virDomainObjPtr vm, break; } =20 - qemuDomainMarkDeviceForRemoval(vm, &input->info); + if (!async) + qemuDomainMarkDeviceForRemoval(vm, &input->info); =20 qemuDomainObjEnterMonitor(driver, vm); if (qemuMonitorDelDevice(priv->mon, input->info.alias)) { @@ -6420,10 +6498,15 @@ qemuDomainDetachInputDevice(virDomainObjPtr vm, if (qemuDomainObjExitMonitor(driver, vm) < 0) goto cleanup; =20 - if ((ret =3D qemuDomainWaitForDeviceRemoval(vm)) =3D=3D 1) - ret =3D qemuDomainRemoveInputDevice(vm, input); + if (async) { + ret =3D 0; + } else { + if ((ret =3D qemuDomainWaitForDeviceRemoval(vm)) =3D=3D 1) + ret =3D qemuDomainRemoveInputDevice(vm, input); + } =20 cleanup: - qemuDomainResetDeviceRemoval(vm); + if (!async) + qemuDomainResetDeviceRemoval(vm); return ret; } diff --git a/src/qemu/qemu_hotplug.h b/src/qemu/qemu_hotplug.h index b2f5fa688b..751cbf61d4 100644 --- a/src/qemu/qemu_hotplug.h +++ b/src/qemu/qemu_hotplug.h @@ -87,7 +87,8 @@ int qemuDomainAttachMemory(virQEMUDriverPtr driver, virDomainMemoryDefPtr mem); int qemuDomainDetachMemoryDevice(virQEMUDriverPtr driver, virDomainObjPtr vm, - virDomainMemoryDefPtr memdef); + virDomainMemoryDefPtr memdef, + bool async); int qemuDomainChangeGraphics(virQEMUDriverPtr driver, virDomainObjPtr vm, virDomainGraphicsDefPtr dev); @@ -106,26 +107,33 @@ int qemuDomainChangeNetLinkState(virQEMUDriverPtr dri= ver, int linkstate); int qemuDomainDetachDeviceDiskLive(virQEMUDriverPtr driver, virDomainObjPtr vm, - virDomainDeviceDefPtr dev); + virDomainDeviceDefPtr dev, + bool async); int qemuDomainDetachControllerDevice(virQEMUDriverPtr driver, virDomainObjPtr vm, - virDomainDeviceDefPtr dev); + virDomainDeviceDefPtr dev, + bool async); int qemuDomainDetachNetDevice(virQEMUDriverPtr driver, virDomainObjPtr vm, - virDomainDeviceDefPtr dev); + virDomainDeviceDefPtr dev, + bool async); int qemuDomainDetachHostDevice(virQEMUDriverPtr driver, virDomainObjPtr vm, - virDomainDeviceDefPtr dev); + virDomainDeviceDefPtr dev, + bool async); int qemuDomainDetachShmemDevice(virQEMUDriverPtr driver, virDomainObjPtr vm, - virDomainShmemDefPtr dev); + virDomainShmemDefPtr dev, + bool async); int qemuDomainDetachWatchdog(virQEMUDriverPtr driver, virDomainObjPtr vm, - virDomainWatchdogDefPtr watchdog); + virDomainWatchdogDefPtr watchdog, + bool async); =20 int qemuDomainDetachRedirdevDevice(virQEMUDriverPtr driver, virDomainObjPtr vm, - virDomainRedirdevDefPtr dev); + virDomainRedirdevDefPtr dev, + bool async); =20 int qemuDomainAttachInputDevice(virQEMUDriverPtr driver, virDomainObjPtr vm, @@ -142,13 +150,15 @@ int qemuDomainAttachChrDevice(virQEMUDriverPtr driver, virDomainChrDefPtr chr); int qemuDomainDetachChrDevice(virQEMUDriverPtr driver, virDomainObjPtr vm, - virDomainChrDefPtr chr); + virDomainChrDefPtr chr, + bool async); int qemuDomainAttachRNGDevice(virQEMUDriverPtr driver, virDomainObjPtr vm, virDomainRNGDefPtr rng); int qemuDomainDetachRNGDevice(virQEMUDriverPtr driver, virDomainObjPtr vm, - virDomainRNGDefPtr rng); + virDomainRNGDefPtr rng, + bool async); =20 void qemuDomainRemoveVcpuAlias(virQEMUDriverPtr driver, virDomainObjPtr vm, @@ -184,6 +194,7 @@ int qemuDomainSetVcpuInternal(virQEMUDriverPtr driver, bool state); =20 int qemuDomainDetachInputDevice(virDomainObjPtr vm, - virDomainInputDefPtr def); + virDomainInputDefPtr def, + bool async); =20 #endif /* __QEMU_HOTPLUG_H__ */ diff --git a/tests/qemuhotplugtest.c b/tests/qemuhotplugtest.c index e93503812a..663e33ed00 100644 --- a/tests/qemuhotplugtest.c +++ b/tests/qemuhotplugtest.c @@ -142,22 +142,23 @@ testQemuHotplugAttach(virDomainObjPtr vm, =20 static int testQemuHotplugDetach(virDomainObjPtr vm, - virDomainDeviceDefPtr dev) + virDomainDeviceDefPtr dev, + bool async) { int ret =3D -1; =20 switch (dev->type) { case VIR_DOMAIN_DEVICE_DISK: - ret =3D qemuDomainDetachDeviceDiskLive(&driver, vm, dev); + ret =3D qemuDomainDetachDeviceDiskLive(&driver, vm, dev, async); break; case VIR_DOMAIN_DEVICE_CHR: - ret =3D qemuDomainDetachChrDevice(&driver, vm, dev->data.chr); + ret =3D qemuDomainDetachChrDevice(&driver, vm, dev->data.chr, asyn= c); break; case VIR_DOMAIN_DEVICE_SHMEM: - ret =3D qemuDomainDetachShmemDevice(&driver, vm, dev->data.shmem); + ret =3D qemuDomainDetachShmemDevice(&driver, vm, dev->data.shmem, = async); break; case VIR_DOMAIN_DEVICE_WATCHDOG: - ret =3D qemuDomainDetachWatchdog(&driver, vm, dev->data.watchdog); + ret =3D qemuDomainDetachWatchdog(&driver, vm, dev->data.watchdog, = async); break; default: VIR_TEST_VERBOSE("device type '%s' cannot be detached\n", @@ -322,7 +323,7 @@ testQemuHotplug(const void *data) break; =20 case DETACH: - ret =3D testQemuHotplugDetach(vm, dev); + ret =3D testQemuHotplugDetach(vm, dev, false); if (ret =3D=3D 0 || fail) ret =3D testQemuHotplugCheckResult(vm, domain_xml, domain_filename, fail); --=20 2.16.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list