From nobody Sun Feb 8 23:46:14 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.129.124 as permitted sender) client-ip=170.10.129.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1682065577; cv=none; d=zohomail.com; s=zohoarc; b=kaT+eAQIc1B6+thOKl4LDIubbYZx6Z7YadgMEM6glIZogKVCOXG7bsKTl63Npp7q1aFU7tTUrZ0liMzxVEzsTawCuUNRerr5+OxyBAIz8xY50vEghVZd+5CrcGoxwcCMpo5hwT+OICjfZW+v+2/HDN5w7dXQc1bd4ZulC/rPVL0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1682065577; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=4wOicE80t8TJqBk4hUTwlL/2iQdhfAKikAZUVe95JwQ=; b=QSN2brnXas7BGVDhLJNlUYKwmz5oXcckFO6LmLClwUPsbvs7UCCfS5AMiZORPiD9J24Ut/5H5rciDmF+4Gr8+Bmqry7gbDMdMt7Ho0SHmaXxYb/TSdARf4prqmU1eSP2xZ7OnFqDF8MAUo1gLn/NE7aflPchb953eLJEL7TN/KI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by mx.zohomail.com with SMTPS id 1682065577867657.6337800495958; Fri, 21 Apr 2023 01:26:17 -0700 (PDT) Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-574-ymW_a15mMZqoDeSj2YEn7Q-1; Fri, 21 Apr 2023 04:25:22 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.rdu2.redhat.com [10.11.54.1]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id A52723C0F391; Fri, 21 Apr 2023 08:25:16 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (unknown [10.30.29.100]) by smtp.corp.redhat.com (Postfix) with ESMTP id 4B56140C2064; Fri, 21 Apr 2023 08:25:15 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (localhost [IPv6:::1]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 30A571946A47; Fri, 21 Apr 2023 08:25:15 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 827431946A48 for ; Fri, 21 Apr 2023 08:25:13 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id 675AA5AB7A; Fri, 21 Apr 2023 08:25:13 +0000 (UTC) Received: from localhost.localdomain (unknown [10.43.2.39]) by smtp.corp.redhat.com (Postfix) with ESMTP id E7B8618EC7 for ; Fri, 21 Apr 2023 08:25:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1682065576; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=4wOicE80t8TJqBk4hUTwlL/2iQdhfAKikAZUVe95JwQ=; b=VFokDIz10TMZDM10Dpn/Tm9SS5Wspv7pJeMDKILdoAVtloZbqgBLpgvLrYHnw9XrWBxaxO 3wu7+NmndJDOZPwLQEkD1zOGSEodHaTk5vNqhndPXCxHWbly46u+1kSMH7LpEl0nEFsV/b I7B8ZkTh9eKI+50iZ1phf87Aed4gugU= X-MC-Unique: ymW_a15mMZqoDeSj2YEn7Q-1 X-Original-To: libvir-list@listman.corp.redhat.com From: Michal Privoznik To: libvir-list@redhat.com Subject: [PATCH 02/11] qemu: Move qemuDomainAttachDeviceLive() into qemu_hotplug.c Date: Fri, 21 Apr 2023 10:25:01 +0200 Message-Id: In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.5 X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libvir-list-bounces@redhat.com Sender: "libvir-list" X-Scanned-By: MIMEDefang 3.1 on 10.11.54.1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1682065580102100007 Content-Type: text/plain; charset="utf-8"; x-default="true" There is no good reason for qemuDomainAttachDeviceLive() to live in (ever growing) qemu_driver.c while we have qemu_hotplug.c which already contains the rest of hotplug code. Move the function to its new home. Signed-off-by: Michal Privoznik Reviewed-by: Kristina Hanicova --- src/qemu/qemu_driver.c | 170 ---------------------------------------- src/qemu/qemu_hotplug.c | 170 ++++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_hotplug.h | 4 + 3 files changed, 174 insertions(+), 170 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 48eb759531..fe1ddb5ade 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -6671,176 +6671,6 @@ qemuDomainUndefine(virDomainPtr dom) return qemuDomainUndefineFlags(dom, 0); } =20 -static int -qemuDomainAttachDeviceLive(virDomainObj *vm, - virDomainDeviceDef *dev, - virQEMUDriver *driver) -{ - int ret =3D -1; - const char *alias =3D NULL; - g_autoptr(virQEMUDriverConfig) cfg =3D virQEMUDriverGetConfig(driver); - struct qemuDomainPrepareChardevSourceData chardevBackendData =3D { .cf= g =3D cfg, - .hotp= lug =3D true }; - - if (qemuDomainDeviceBackendChardevForeachOne(dev, - qemuDomainPrepareChardevS= ourceOne, - &chardevBackendData) < 0) - return -1; - - switch ((virDomainDeviceType)dev->type) { - case VIR_DOMAIN_DEVICE_DISK: - qemuDomainObjCheckDiskTaint(driver, vm, dev->data.disk, NULL); - ret =3D qemuDomainAttachDeviceDiskLive(driver, vm, dev); - if (!ret) { - alias =3D dev->data.disk->info.alias; - dev->data.disk =3D NULL; - } - break; - - case VIR_DOMAIN_DEVICE_CONTROLLER: - ret =3D qemuDomainAttachControllerDevice(vm, dev->data.controller); - if (!ret) { - alias =3D dev->data.controller->info.alias; - dev->data.controller =3D NULL; - } - break; - - case VIR_DOMAIN_DEVICE_LEASE: - ret =3D qemuDomainAttachLease(driver, vm, - dev->data.lease); - if (ret =3D=3D 0) - dev->data.lease =3D NULL; - break; - - case VIR_DOMAIN_DEVICE_NET: - qemuDomainObjCheckNetTaint(driver, vm, dev->data.net, NULL); - ret =3D qemuDomainAttachNetDevice(driver, vm, dev->data.net); - if (!ret) { - alias =3D dev->data.net->info.alias; - dev->data.net =3D NULL; - } - break; - - case VIR_DOMAIN_DEVICE_HOSTDEV: - qemuDomainObjCheckHostdevTaint(driver, vm, dev->data.hostdev, NULL= ); - ret =3D qemuDomainAttachHostDevice(driver, vm, - dev->data.hostdev); - if (!ret) { - alias =3D dev->data.hostdev->info->alias; - dev->data.hostdev =3D NULL; - } - break; - - case VIR_DOMAIN_DEVICE_REDIRDEV: - ret =3D qemuDomainAttachRedirdevDevice(driver, vm, - dev->data.redirdev); - if (!ret) { - alias =3D dev->data.redirdev->info.alias; - dev->data.redirdev =3D NULL; - } - break; - - case VIR_DOMAIN_DEVICE_CHR: - ret =3D qemuDomainAttachChrDevice(driver, vm, dev); - if (!ret) { - alias =3D dev->data.chr->info.alias; - dev->data.chr =3D NULL; - } - break; - - case VIR_DOMAIN_DEVICE_RNG: - ret =3D qemuDomainAttachRNGDevice(driver, vm, - dev->data.rng); - if (!ret) { - alias =3D dev->data.rng->info.alias; - dev->data.rng =3D NULL; - } - break; - - case VIR_DOMAIN_DEVICE_MEMORY: - /* note that qemuDomainAttachMemory always consumes dev->data.memo= ry - * and dispatches DeviceAdded event on success */ - ret =3D qemuDomainAttachMemory(driver, vm, - dev->data.memory); - dev->data.memory =3D NULL; - break; - - case VIR_DOMAIN_DEVICE_SHMEM: - ret =3D qemuDomainAttachShmemDevice(vm, dev->data.shmem); - if (!ret) { - alias =3D dev->data.shmem->info.alias; - dev->data.shmem =3D NULL; - } - break; - - case VIR_DOMAIN_DEVICE_WATCHDOG: - ret =3D qemuDomainAttachWatchdog(vm, dev->data.watchdog); - if (!ret) { - alias =3D dev->data.watchdog->info.alias; - dev->data.watchdog =3D NULL; - } - break; - - case VIR_DOMAIN_DEVICE_INPUT: - ret =3D qemuDomainAttachInputDevice(vm, dev->data.input); - if (ret =3D=3D 0) { - alias =3D dev->data.input->info.alias; - dev->data.input =3D NULL; - } - break; - - case VIR_DOMAIN_DEVICE_VSOCK: - ret =3D qemuDomainAttachVsockDevice(vm, dev->data.vsock); - if (ret =3D=3D 0) { - alias =3D dev->data.vsock->info.alias; - dev->data.vsock =3D NULL; - } - break; - - case VIR_DOMAIN_DEVICE_FS: - ret =3D qemuDomainAttachFSDevice(driver, vm, dev->data.fs); - if (ret =3D=3D 0) { - alias =3D dev->data.fs->info.alias; - dev->data.fs =3D NULL; - } - break; - - case VIR_DOMAIN_DEVICE_NONE: - case VIR_DOMAIN_DEVICE_SOUND: - case VIR_DOMAIN_DEVICE_VIDEO: - case VIR_DOMAIN_DEVICE_GRAPHICS: - case VIR_DOMAIN_DEVICE_HUB: - case VIR_DOMAIN_DEVICE_SMARTCARD: - case VIR_DOMAIN_DEVICE_MEMBALLOON: - case VIR_DOMAIN_DEVICE_NVRAM: - case VIR_DOMAIN_DEVICE_TPM: - case VIR_DOMAIN_DEVICE_PANIC: - case VIR_DOMAIN_DEVICE_IOMMU: - case VIR_DOMAIN_DEVICE_AUDIO: - case VIR_DOMAIN_DEVICE_CRYPTO: - case VIR_DOMAIN_DEVICE_LAST: - virReportError(VIR_ERR_OPERATION_UNSUPPORTED, - _("live attach of device '%1$s' is not supported"), - virDomainDeviceTypeToString(dev->type)); - break; - } - - if (alias) { - /* queue the event before the alias has a chance to get freed - * if the domain disappears while qemuDomainUpdateDeviceList - * is in monitor */ - virObjectEvent *event; - event =3D virDomainEventDeviceAddedNewFromObj(vm, alias); - virObjectEventStateQueue(driver->domainEventState, event); - } - - if (ret =3D=3D 0) - ret =3D qemuDomainUpdateDeviceList(vm, VIR_ASYNC_JOB_NONE); - - return ret; -} - - static int qemuDomainChangeDiskLive(virDomainObj *vm, virDomainDeviceDef *dev, diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 53a0874556..bd126234fd 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -3308,6 +3308,176 @@ qemuDomainAttachLease(virQEMUDriver *driver, } =20 =20 +int +qemuDomainAttachDeviceLive(virDomainObj *vm, + virDomainDeviceDef *dev, + virQEMUDriver *driver) +{ + int ret =3D -1; + const char *alias =3D NULL; + g_autoptr(virQEMUDriverConfig) cfg =3D virQEMUDriverGetConfig(driver); + struct qemuDomainPrepareChardevSourceData chardevBackendData =3D { .cf= g =3D cfg, + .hotp= lug =3D true }; + + if (qemuDomainDeviceBackendChardevForeachOne(dev, + qemuDomainPrepareChardevS= ourceOne, + &chardevBackendData) < 0) + return -1; + + switch ((virDomainDeviceType)dev->type) { + case VIR_DOMAIN_DEVICE_DISK: + qemuDomainObjCheckDiskTaint(driver, vm, dev->data.disk, NULL); + ret =3D qemuDomainAttachDeviceDiskLive(driver, vm, dev); + if (!ret) { + alias =3D dev->data.disk->info.alias; + dev->data.disk =3D NULL; + } + break; + + case VIR_DOMAIN_DEVICE_CONTROLLER: + ret =3D qemuDomainAttachControllerDevice(vm, dev->data.controller); + if (!ret) { + alias =3D dev->data.controller->info.alias; + dev->data.controller =3D NULL; + } + break; + + case VIR_DOMAIN_DEVICE_LEASE: + ret =3D qemuDomainAttachLease(driver, vm, + dev->data.lease); + if (ret =3D=3D 0) + dev->data.lease =3D NULL; + break; + + case VIR_DOMAIN_DEVICE_NET: + qemuDomainObjCheckNetTaint(driver, vm, dev->data.net, NULL); + ret =3D qemuDomainAttachNetDevice(driver, vm, dev->data.net); + if (!ret) { + alias =3D dev->data.net->info.alias; + dev->data.net =3D NULL; + } + break; + + case VIR_DOMAIN_DEVICE_HOSTDEV: + qemuDomainObjCheckHostdevTaint(driver, vm, dev->data.hostdev, NULL= ); + ret =3D qemuDomainAttachHostDevice(driver, vm, + dev->data.hostdev); + if (!ret) { + alias =3D dev->data.hostdev->info->alias; + dev->data.hostdev =3D NULL; + } + break; + + case VIR_DOMAIN_DEVICE_REDIRDEV: + ret =3D qemuDomainAttachRedirdevDevice(driver, vm, + dev->data.redirdev); + if (!ret) { + alias =3D dev->data.redirdev->info.alias; + dev->data.redirdev =3D NULL; + } + break; + + case VIR_DOMAIN_DEVICE_CHR: + ret =3D qemuDomainAttachChrDevice(driver, vm, dev); + if (!ret) { + alias =3D dev->data.chr->info.alias; + dev->data.chr =3D NULL; + } + break; + + case VIR_DOMAIN_DEVICE_RNG: + ret =3D qemuDomainAttachRNGDevice(driver, vm, + dev->data.rng); + if (!ret) { + alias =3D dev->data.rng->info.alias; + dev->data.rng =3D NULL; + } + break; + + case VIR_DOMAIN_DEVICE_MEMORY: + /* note that qemuDomainAttachMemory always consumes dev->data.memo= ry + * and dispatches DeviceAdded event on success */ + ret =3D qemuDomainAttachMemory(driver, vm, + dev->data.memory); + dev->data.memory =3D NULL; + break; + + case VIR_DOMAIN_DEVICE_SHMEM: + ret =3D qemuDomainAttachShmemDevice(vm, dev->data.shmem); + if (!ret) { + alias =3D dev->data.shmem->info.alias; + dev->data.shmem =3D NULL; + } + break; + + case VIR_DOMAIN_DEVICE_WATCHDOG: + ret =3D qemuDomainAttachWatchdog(vm, dev->data.watchdog); + if (!ret) { + alias =3D dev->data.watchdog->info.alias; + dev->data.watchdog =3D NULL; + } + break; + + case VIR_DOMAIN_DEVICE_INPUT: + ret =3D qemuDomainAttachInputDevice(vm, dev->data.input); + if (ret =3D=3D 0) { + alias =3D dev->data.input->info.alias; + dev->data.input =3D NULL; + } + break; + + case VIR_DOMAIN_DEVICE_VSOCK: + ret =3D qemuDomainAttachVsockDevice(vm, dev->data.vsock); + if (ret =3D=3D 0) { + alias =3D dev->data.vsock->info.alias; + dev->data.vsock =3D NULL; + } + break; + + case VIR_DOMAIN_DEVICE_FS: + ret =3D qemuDomainAttachFSDevice(driver, vm, dev->data.fs); + if (ret =3D=3D 0) { + alias =3D dev->data.fs->info.alias; + dev->data.fs =3D NULL; + } + break; + + case VIR_DOMAIN_DEVICE_NONE: + case VIR_DOMAIN_DEVICE_SOUND: + case VIR_DOMAIN_DEVICE_VIDEO: + case VIR_DOMAIN_DEVICE_GRAPHICS: + case VIR_DOMAIN_DEVICE_HUB: + case VIR_DOMAIN_DEVICE_SMARTCARD: + case VIR_DOMAIN_DEVICE_MEMBALLOON: + case VIR_DOMAIN_DEVICE_NVRAM: + case VIR_DOMAIN_DEVICE_TPM: + case VIR_DOMAIN_DEVICE_PANIC: + case VIR_DOMAIN_DEVICE_IOMMU: + case VIR_DOMAIN_DEVICE_AUDIO: + case VIR_DOMAIN_DEVICE_CRYPTO: + case VIR_DOMAIN_DEVICE_LAST: + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, + _("live attach of device '%1$s' is not supported"), + virDomainDeviceTypeToString(dev->type)); + break; + } + + if (alias) { + /* queue the event before the alias has a chance to get freed + * if the domain disappears while qemuDomainUpdateDeviceList + * is in monitor */ + virObjectEvent *event; + event =3D virDomainEventDeviceAddedNewFromObj(vm, alias); + virObjectEventStateQueue(driver->domainEventState, event); + } + + if (ret =3D=3D 0) + ret =3D qemuDomainUpdateDeviceList(vm, VIR_ASYNC_JOB_NONE); + + return ret; +} + + static int qemuDomainChangeNetBridge(virDomainObj *vm, virDomainNetDef *olddev, diff --git a/src/qemu/qemu_hotplug.h b/src/qemu/qemu_hotplug.h index cec1423ee0..74fc3bbd65 100644 --- a/src/qemu/qemu_hotplug.h +++ b/src/qemu/qemu_hotplug.h @@ -111,6 +111,10 @@ int qemuDomainAttachRNGDevice(virQEMUDriver *driver, virDomainObj *vm, virDomainRNGDef *rng); =20 +int qemuDomainAttachDeviceLive(virDomainObj *vm, + virDomainDeviceDef *dev, + virQEMUDriver *driver); + int qemuDomainDetachDeviceLive(virDomainObj *vm, virDomainDeviceDef *match, virQEMUDriver *driver, --=20 2.39.2