From nobody Tue Jun 9 21:01:31 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) client-ip=38.145.34.151; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1777465588; cv=none; d=zohomail.com; s=zohoarc; b=kUQg6hbC/DMvNH+kdia0eLt/xSzLzml5pqJxNGruiQMzU08oOTx3ficec6/PlWw+upDnraVBAkkuAndzJTibst9TDD4PPzEjDJBhQZRa8kmzwnue68VPFb5JIjHIPOpjNL4soVTMdMUxX4E4TwXabAQ0VQxnnYLlBX90ClwoxcI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1777465588; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id; bh=xqeCrQ8VZOTQJbF6vDyREXnG10kYqX5yNNgL8PU+7mU=; b=LLmamJ0bOO1HUC8j8OAxlP/v9N97ttGQZOX7LYsYxxfDE5cKF23NPdBGn+MW5si6mXBYsKO2bIYKh31I6CqyzThF9TemJ67gaYOPvuW3HAfpSzneD53YHPeuuLBqnWV/W04PLhAbpCy+h4N2d5I9tsX/HhVP4S2FhinRmkTwnDA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [38.145.34.151]) by mx.zohomail.com with SMTPS id 1777465588854476.7206807909562; Wed, 29 Apr 2026 05:26:28 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 10AAD417E9; Wed, 29 Apr 2026 08:26:28 -0400 (EDT) Received: from [172.19.199.9] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id A3E9041988; Wed, 29 Apr 2026 08:22:23 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 1A0683F840; Wed, 29 Apr 2026 08:22:07 -0400 (EDT) Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 5D3883F2F2 for ; Wed, 29 Apr 2026 08:22:05 -0400 (EDT) Received: from pps.filterd (m0246617.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 63T8qMl5721101 for ; Wed, 29 Apr 2026 12:22:04 GMT Received: from phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta01.appoci.oracle.com [138.1.114.2]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4drp5t2jg9-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Wed, 29 Apr 2026 12:22:03 +0000 (GMT) Received: from pps.filterd (phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (8.18.1.7/8.18.1.7) with ESMTP id 63TCKm2g036476 for ; Wed, 29 Apr 2026 12:22:03 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 4drm2ed4g7-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Wed, 29 Apr 2026 12:22:03 +0000 (GMT) Received: from phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.18.1.12/8.18.1.12) with ESMTP id 63TCM2eV040565 for ; Wed, 29 Apr 2026 12:22:02 GMT Received: from akulhall-vm1-ol9.osdevelopmeniad.oraclevcn.com (akulhall-vm1-ol9.allregionaliads.osdevelopmeniad.oraclevcn.com [100.100.255.191]) by phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTP id 4drm2ed4e6-2; Wed, 29 Apr 2026 12:22:02 +0000 (GMT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-3.4 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_LOW,RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=corp-2025-04-25; bh=xqeCr Q8VZOTQJbF6vDyREXnG10kYqX5yNNgL8PU+7mU=; b=UH0GrtqNvXp4ePlJcg4cB K7gZkz30N2zQmVj817CCOz8C74EI1l38xMopvc/6NhART9MutGsOkpls3bPdjqnn 6EUiaidbds42ul+BoLyfZR7caMMru4T0yLNLETGXrCRqw98tRREPp1QbGo3UTIaA 2iZ348goebxnaDaKadBHmc/vgg4hOEerVgMXfuDfRyZ3pli2DrcVBcbql9C+slq6 mz9VqCpcCZgDTp0sEdqLv2ykwszKrVXSh15xEdIrrcPPuDQ/RDzw6QRVnkkFDw1Y aCCb7LKBEDrwtCRuwJO0/YuxRznwuCpYNRn3pNsWIY6+6+a8cr4TcWH8yny06EFZ w== To: devel@lists.libvirt.org Subject: [PATCH v3 1/5] conf,remote: add vcpu-removed domain event Date: Wed, 29 Apr 2026 17:43:25 +0530 Message-ID: <20260429122128.1606911-2-akash.kulhalli@oracle.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260429122128.1606911-1-akash.kulhalli@oracle.com> References: <20260429122128.1606911-1-akash.kulhalli@oracle.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-04-28_05,2026-04-28_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 bulkscore=0 mlxscore=0 malwarescore=0 adultscore=0 spamscore=0 suspectscore=0 mlxlogscore=999 lowpriorityscore=0 phishscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2604200000 definitions=main-2604290125 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDI5MDEyNCBTYWx0ZWRfXzN7UUiAK3I3Q 0OQar8UucDrSBoKTOMj1MQuwukEyCl1Uk+4RlCDsIgPItpAnebalAODJhz+N9BIu0gZqI27Eh35 sIB9uFqu7JUEDOzDk4gI+hV785tJhXNkofM84kSbXPRX4J1CIWgXZh4s99PyXy39MoQe/XHS/Jq CjulMLdEf1ULoDEXMhdBYArJ0P8jbZyar0jJdxBXWFWZHM2zrwaWA65InOAKL1P2JAlGPMxUeWG DKysYfkYCQPv4ozW90xRPjNHnoYJB6J+onIchceIq8IP2A0I9u4RtxqaE5aUXBFAHnBXkErzGpB nx0TH7njnDuoftMF22+5H1HaHeB6lLyVlEqAQIJBPP/eRNU14ioMDOvQNJUcX/pYwQPO1RauxzP DIJ951sLOTZ9Wlh1KNk8q+e5rZW53yPII8H2WrC/5KwJZKRpeD4iD/1YpAoT4inYgcW8FpDQDtq 6GfowsxUYrXoIbgNPwQ== X-Proofpoint-ORIG-GUID: 6vmL94y9sKBjXwhfvt-wRp92wQigfYPC X-Proofpoint-GUID: 6vmL94y9sKBjXwhfvt-wRp92wQigfYPC X-Authority-Analysis: v=2.4 cv=E7v9Y6dl c=1 sm=1 tr=0 ts=69f1f7ec cx=c_pps a=XiAAW1AwiKB2Y8Wsi+sD2Q==:117 a=XiAAW1AwiKB2Y8Wsi+sD2Q==:17 a=A5OVakUREuEA:10 a=VkNPw1HP01LnGYTKEx00:22 a=jiCTI4zE5U7BLdzWsZGv:22 a=7Gl3-_t3PgB9XO-mQDs3:22 a=yPCof4ZbAAAA:8 a=lP-c2LJKX2x5896Cvb0A:9 Message-ID-Hash: IQF5ZGRBF3RVMXDQ5FWJNBWVHCTXTONB X-Message-ID-Hash: IQF5ZGRBF3RVMXDQ5FWJNBWVHCTXTONB X-MailFrom: akash.kulhalli@oracle.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: akash.kulhalli@oracle.com X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Akash Kulhalli via Devel Reply-To: Akash Kulhalli X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1777465591699154100 Content-Type: text/plain; charset="utf-8" Add a new domain event for completed vCPU removal. Wire the event through the internal event framework and extend the remote protocol so remote clients can receive it. Update virsh and the event-test example accordingly. The event is not emitted anywhere yet. Signed-off-by: Akash Kulhalli Reviewed-by: Peter Krempa --- examples/c/misc/event-test.c | 12 ++++++ include/libvirt/libvirt-domain.h | 22 ++++++++++ src/conf/domain_event.c | 66 +++++++++++++++++++++++++++++ src/conf/domain_event.h | 6 +++ src/libvirt_private.syms | 2 + src/remote/remote_daemon_dispatch.c | 26 ++++++++++++ src/remote/remote_driver.c | 29 +++++++++++++ src/remote/remote_protocol.x | 14 +++++- src/remote_protocol-structs | 6 +++ tools/virsh-domain-event.c | 16 +++++++ 10 files changed, 198 insertions(+), 1 deletion(-) diff --git a/examples/c/misc/event-test.c b/examples/c/misc/event-test.c index 2ce82ca9e088..f9e65c55f064 100644 --- a/examples/c/misc/event-test.c +++ b/examples/c/misc/event-test.c @@ -1039,6 +1039,17 @@ myDomainEventDeviceRemovalFailedCallback(virConnectP= tr conn G_GNUC_UNUSED, return 0; } =20 +static int +myDomainEventVcpuRemovedCallback(virConnectPtr conn G_GNUC_UNUSED, + virDomainPtr dom, + unsigned int vcpuid, + void *opaque G_GNUC_UNUSED) +{ + printf("%s EVENT: Domain %s(%d) vcpu removed: %u\n", + __func__, virDomainGetName(dom), virDomainGetID(dom), vcpuid); + return 0; +} + =20 static const char * metadataTypeToStr(int status) @@ -1183,6 +1194,7 @@ struct domainEventData domainEvents[] =3D { DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_MEMORY_FAILURE, myDomainEventMemoryFa= ilureCallback), DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_MEMORY_DEVICE_SIZE_CHANGE, myDomainEv= entMemoryDeviceSizeChangeCallback), DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_NIC_MAC_CHANGE, myDomainEventNICMACCh= angeCallback), + DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_VCPU_REMOVED, myDomainEventVcpuRemove= dCallback), }; =20 struct storagePoolEventData { diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-dom= ain.h index 4a8e3114b35d..21336df85bd8 100644 --- a/include/libvirt/libvirt-domain.h +++ b/include/libvirt/libvirt-domain.h @@ -6965,6 +6965,27 @@ typedef void (*virConnectDomainEventDeviceRemovalFai= ledCallback)(virConnectPtr c const cha= r *devAlias, void *opa= que); =20 +/** + * virConnectDomainEventVcpuRemovedCallback: + * @conn: connection object + * @dom: domain on which the event occurred + * @vcpuid: libvirt XML vCPU id + * @opaque: application specified data + * + * This callback occurs when a vCPU is removed from the domain. + * + * The @vcpuid value matches the ```` value from the doma= in XML. + * + * The callback signature to use when registering for an event of type + * VIR_DOMAIN_EVENT_ID_VCPU_REMOVED with virConnectDomainEventRegisterAny(= ). + * + * Since: 12.4.0 + */ +typedef void (*virConnectDomainEventVcpuRemovedCallback)(virConnectPtr con= n, + virDomainPtr dom, + unsigned int vcpu= id, + void *opaque); + /** * virConnectDomainEventMetadataChangeCallback: * @conn: connection object @@ -7617,6 +7638,7 @@ typedef enum { VIR_DOMAIN_EVENT_ID_MEMORY_FAILURE =3D 25, /* virConnectDomainEventMe= moryFailureCallback (Since: 6.9.0) */ VIR_DOMAIN_EVENT_ID_MEMORY_DEVICE_SIZE_CHANGE =3D 26, /* virConnectDom= ainEventMemoryDeviceSizeChangeCallback (Since: 7.9.0) */ VIR_DOMAIN_EVENT_ID_NIC_MAC_CHANGE =3D 27, /* virConnectDomainEventNIC= MACChangeCallback (Since: 11.2.0) */ + VIR_DOMAIN_EVENT_ID_VCPU_REMOVED =3D 28, /* virConnectDomainEventVcpuR= emovedCallback (Since: 12.4.0) */ =20 # ifdef VIR_ENUM_SENTINELS VIR_DOMAIN_EVENT_ID_LAST diff --git a/src/conf/domain_event.c b/src/conf/domain_event.c index 88087bad4f21..17ad4a0d2c91 100644 --- a/src/conf/domain_event.c +++ b/src/conf/domain_event.c @@ -53,6 +53,7 @@ static virClass *virDomainEventDeviceAddedClass; static virClass *virDomainEventMigrationIterationClass; static virClass *virDomainEventJobCompletedClass; static virClass *virDomainEventDeviceRemovalFailedClass; +static virClass *virDomainEventVcpuRemovedClass; static virClass *virDomainEventMetadataChangeClass; static virClass *virDomainEventBlockThresholdClass; static virClass *virDomainEventMemoryFailureClass; @@ -78,6 +79,7 @@ static void virDomainEventDeviceAddedDispose(void *obj); static void virDomainEventMigrationIterationDispose(void *obj); static void virDomainEventJobCompletedDispose(void *obj); static void virDomainEventDeviceRemovalFailedDispose(void *obj); +static void virDomainEventVcpuRemovedDispose(void *obj); static void virDomainEventMetadataChangeDispose(void *obj); static void virDomainEventBlockThresholdDispose(void *obj); static void virDomainEventMemoryFailureDispose(void *obj); @@ -251,6 +253,13 @@ struct _virDomainEventDeviceRemovalFailed { }; typedef struct _virDomainEventDeviceRemovalFailed virDomainEventDeviceRemo= valFailed; =20 +struct _virDomainEventVcpuRemoved { + virDomainEvent parent; + + unsigned int vcpuid; +}; +typedef struct _virDomainEventVcpuRemoved virDomainEventVcpuRemoved; + struct _virDomainEventMetadataChange { virDomainEvent parent; =20 @@ -337,6 +346,8 @@ virDomainEventsOnceInit(void) return -1; if (!VIR_CLASS_NEW(virDomainEventDeviceRemovalFailed, virDomainEventCl= ass)) return -1; + if (!VIR_CLASS_NEW(virDomainEventVcpuRemoved, virDomainEventClass)) + return -1; if (!VIR_CLASS_NEW(virDomainEventMetadataChange, virDomainEventClass)) return -1; if (!VIR_CLASS_NEW(virDomainEventBlockThreshold, virDomainEventClass)) @@ -484,6 +495,13 @@ virDomainEventDeviceRemovalFailedDispose(void *obj) g_free(event->devAlias); } =20 +static void +virDomainEventVcpuRemovedDispose(void *obj) +{ + virDomainEventVcpuRemoved *event =3D obj; + VIR_DEBUG("obj=3D%p", event); +} + =20 static void virDomainEventPMDispose(void *obj) @@ -1382,6 +1400,43 @@ virDomainEventDeviceRemovalFailedNewFromDom(virDomai= nPtr dom, devAlias); } =20 +static virObjectEvent * +virDomainEventVcpuRemovedNew(int id, + const char *name, + unsigned char *uuid, + unsigned int vcpuid) +{ + virDomainEventVcpuRemoved *ev; + + if (virDomainEventsInitialize() < 0) + return NULL; + + if (!(ev =3D virDomainEventNew(virDomainEventVcpuRemovedClass, + VIR_DOMAIN_EVENT_ID_VCPU_REMOVED, + id, name, uuid))) + return NULL; + + ev->vcpuid =3D vcpuid; + + return (virObjectEvent *)ev; +} + +virObjectEvent * +virDomainEventVcpuRemovedNewFromObj(virDomainObj *obj, + unsigned int vcpuid) +{ + return virDomainEventVcpuRemovedNew(obj->def->id, obj->def->name, + obj->def->uuid, vcpuid); +} + +virObjectEvent * +virDomainEventVcpuRemovedNewFromDom(virDomainPtr dom, + unsigned int vcpuid) +{ + return virDomainEventVcpuRemovedNew(dom->id, dom->name, dom->uuid, + vcpuid); +} + =20 static virObjectEvent * virDomainEventAgentLifecycleNew(int id, @@ -2134,6 +2189,17 @@ virDomainEventDispatchDefaultFunc(virConnectPtr conn, goto cleanup; } =20 + case VIR_DOMAIN_EVENT_ID_VCPU_REMOVED: + { + virDomainEventVcpuRemoved *vcpuRemovedEvent; + + vcpuRemovedEvent =3D (virDomainEventVcpuRemoved *)event; + ((virConnectDomainEventVcpuRemovedCallback)cb)(conn, dom, + vcpuRemovedEven= t->vcpuid, + cbopaque); + goto cleanup; + } + case VIR_DOMAIN_EVENT_ID_LAST: break; } diff --git a/src/conf/domain_event.h b/src/conf/domain_event.h index f31cfb9e42ad..1b1b16095a77 100644 --- a/src/conf/domain_event.h +++ b/src/conf/domain_event.h @@ -192,6 +192,12 @@ virDomainEventDeviceRemovalFailedNewFromObj(virDomainO= bj *obj, virObjectEvent * virDomainEventDeviceRemovalFailedNewFromDom(virDomainPtr dom, const char *devAlias); +virObjectEvent * +virDomainEventVcpuRemovedNewFromObj(virDomainObj *obj, + unsigned int vcpuid); +virObjectEvent * +virDomainEventVcpuRemovedNewFromDom(virDomainPtr dom, + unsigned int vcpuid); =20 virObjectEvent * virDomainEventTunableNewFromObj(virDomainObj *obj, diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index cf0e71cc6af1..f22b5895db12 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -811,6 +811,8 @@ virDomainEventTrayChangeNewFromDom; virDomainEventTrayChangeNewFromObj; virDomainEventTunableNewFromDom; virDomainEventTunableNewFromObj; +virDomainEventVcpuRemovedNewFromDom; +virDomainEventVcpuRemovedNewFromObj; virDomainEventWatchdogNewFromDom; virDomainEventWatchdogNewFromObj; virDomainQemuMonitorEventNew; diff --git a/src/remote/remote_daemon_dispatch.c b/src/remote/remote_daemon= _dispatch.c index 7e74ff063f5b..81b0ed00da1a 100644 --- a/src/remote/remote_daemon_dispatch.c +++ b/src/remote/remote_daemon_dispatch.c @@ -1322,6 +1322,31 @@ remoteRelayDomainEventMemoryDeviceSizeChange(virConn= ectPtr conn, return 0; } =20 +static int +remoteRelayDomainEventVcpuRemoved(virConnectPtr conn, + virDomainPtr dom, + unsigned int vcpuid, + void *opaque) +{ + daemonClientEventCallback *callback =3D opaque; + remote_domain_event_vcpu_removed_msg data; + + if (callback->callbackID < 0 || + !remoteRelayDomainEventCheckACL(callback->client, conn, dom)) + return -1; + + memset(&data, 0, sizeof(data)); + data.callbackID =3D callback->callbackID; + data.vcpuid =3D vcpuid; + make_nonnull_domain(&data.dom, dom); + + remoteDispatchObjectEventSend(callback->client, remoteProgram, + REMOTE_PROC_DOMAIN_EVENT_VCPU_REMOVED, + (xdrproc_t)xdr_remote_domain_event_vcpu_= removed_msg, + &data); + return 0; +} + =20 static int remoteRelayDomainEventNICMACChange(virConnectPtr conn, @@ -1383,6 +1408,7 @@ static virConnectDomainEventGenericCallback domainEve= ntCallbacks[] =3D { VIR_DOMAIN_EVENT_CALLBACK(remoteRelayDomainEventMemoryFailure), VIR_DOMAIN_EVENT_CALLBACK(remoteRelayDomainEventMemoryDeviceSizeChange= ), VIR_DOMAIN_EVENT_CALLBACK(remoteRelayDomainEventNICMACChange), + VIR_DOMAIN_EVENT_CALLBACK(remoteRelayDomainEventVcpuRemoved), }; =20 G_STATIC_ASSERT(G_N_ELEMENTS(domainEventCallbacks) =3D=3D VIR_DOMAIN_EVENT= _ID_LAST); diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index ec71eaed8762..c8a4e3f6da98 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -428,6 +428,10 @@ remoteDomainBuildEventMemoryDeviceSizeChange(virNetCli= entProgram *prog, virNetClient *client, void *evdata, void *opaque); static void +remoteDomainBuildEventVcpuRemoved(virNetClientProgram *prog, + virNetClient *client, + void *evdata, void *opaque); +static void remoteConnectNotifyEventConnectionClosed(virNetClientProgram *prog G_GNUC_= UNUSED, virNetClient *client G_GNUC_UNUSE= D, void *evdata, void *opaque); @@ -659,6 +663,10 @@ static virNetClientProgramEvent remoteEvents[] =3D { remoteDomainBuildEventNICMACChange, sizeof(remote_domain_event_nic_mac_change_msg), (xdrproc_t)xdr_remote_domain_event_nic_mac_change_msg }, + { REMOTE_PROC_DOMAIN_EVENT_VCPU_REMOVED, + remoteDomainBuildEventVcpuRemoved, + sizeof(remote_domain_event_vcpu_removed_msg), + (xdrproc_t)xdr_remote_domain_event_vcpu_removed_msg }, }; =20 static void @@ -5138,6 +5146,27 @@ remoteDomainBuildEventMemoryDeviceSizeChange(virNetC= lientProgram *prog G_GNUC_UN virObjectEventStateQueueRemote(priv->eventState, event, msg->callbackI= D); } =20 +static void +remoteDomainBuildEventVcpuRemoved(virNetClientProgram *prog G_GNUC_UNUSED, + virNetClient *client G_GNUC_UNUSED, + void *evdata, void *opaque) +{ + virConnectPtr conn =3D opaque; + remote_domain_event_vcpu_removed_msg *msg =3D evdata; + struct private_data *priv =3D conn->privateData; + virDomainPtr dom; + virObjectEvent *event =3D NULL; + + if (!(dom =3D get_nonnull_domain(conn, msg->dom))) + return; + + event =3D virDomainEventVcpuRemovedNewFromDom(dom, msg->vcpuid); + + virObjectUnref(dom); + + virObjectEventStateQueueRemote(priv->eventState, event, msg->callbackI= D); +} + =20 static void remoteDomainBuildEventNICMACChange(virNetClientProgram *prog G_GNUC_UNUSED, diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x index 38a83c64eadb..23699e99a60a 100644 --- a/src/remote/remote_protocol.x +++ b/src/remote/remote_protocol.x @@ -3981,6 +3981,12 @@ struct remote_domain_event_memory_device_size_change= _msg { unsigned hyper size; }; =20 +struct remote_domain_event_vcpu_removed_msg { + int callbackID; + remote_nonnull_domain dom; + unsigned int vcpuid; +}; + =20 struct remote_domain_fd_associate_args { remote_nonnull_domain dom; @@ -7120,5 +7126,11 @@ enum remote_procedure { * @generate: both * @acl: none */ - REMOTE_PROC_DOMAIN_EVENT_NIC_MAC_CHANGE =3D 453 + REMOTE_PROC_DOMAIN_EVENT_NIC_MAC_CHANGE =3D 453, + + /** + * @generate: both + * @acl: none + */ + REMOTE_PROC_DOMAIN_EVENT_VCPU_REMOVED =3D 454 }; diff --git a/src/remote_protocol-structs b/src/remote_protocol-structs index 0f87d13a5ae1..75c3d0cb2e06 100644 --- a/src/remote_protocol-structs +++ b/src/remote_protocol-structs @@ -3315,6 +3315,11 @@ struct remote_domain_event_memory_device_size_change= _msg { remote_nonnull_string alias; uint64_t size; }; +struct remote_domain_event_vcpu_removed_msg { + int callbackID; + remote_nonnull_domain dom; + u_int vcpuid; +}; struct remote_domain_fd_associate_args { remote_nonnull_domain dom; remote_nonnull_string name; @@ -3791,4 +3796,5 @@ enum remote_procedure { REMOTE_PROC_DOMAIN_SET_THROTTLE_GROUP =3D 451, REMOTE_PROC_DOMAIN_DEL_THROTTLE_GROUP =3D 452, REMOTE_PROC_DOMAIN_EVENT_NIC_MAC_CHANGE =3D 453, + REMOTE_PROC_DOMAIN_EVENT_VCPU_REMOVED =3D 454, }; diff --git a/tools/virsh-domain-event.c b/tools/virsh-domain-event.c index b9d1cdf019ca..4a9a831b4525 100644 --- a/tools/virsh-domain-event.c +++ b/tools/virsh-domain-event.c @@ -705,6 +705,20 @@ virshEventDeviceRemovalFailedPrint(virConnectPtr conn = G_GNUC_UNUSED, virshEventPrint(opaque, &buf); } =20 +static void +virshEventVcpuRemovedPrint(virConnectPtr conn G_GNUC_UNUSED, + virDomainPtr dom, + unsigned int vcpuid, + void *opaque) +{ + g_auto(virBuffer) buf =3D VIR_BUFFER_INITIALIZER; + + virBufferAsprintf(&buf, + _("event 'vcpu-removed' for domain '%1$s': vcpu %2$u= \n"), + virDomainGetName(dom), vcpuid); + virshEventPrint(opaque, &buf); +} + VIR_ENUM_DECL(virshEventMetadataChangeType); VIR_ENUM_IMPL(virshEventMetadataChangeType, VIR_DOMAIN_METADATA_LAST, @@ -873,6 +887,8 @@ virshDomainEventCallback virshDomainEventCallbacks[] = =3D { VIR_DOMAIN_EVENT_CALLBACK(virshEventMemoryDeviceSizeChangePrint), }, { "nic-mac-change", VIR_DOMAIN_EVENT_CALLBACK(virshEventNICMACChangePrint), }, + { "vcpu-removed", + VIR_DOMAIN_EVENT_CALLBACK(virshEventVcpuRemovedPrint), }, }; G_STATIC_ASSERT(VIR_DOMAIN_EVENT_ID_LAST =3D=3D G_N_ELEMENTS(virshDomainEv= entCallbacks)); =20 --=20 2.47.3 From nobody Tue Jun 9 21:01:31 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) client-ip=38.145.34.151; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1777465646; cv=none; d=zohomail.com; s=zohoarc; b=TxF+nAXONUG9yazLnNHaORYv0nvXzq7DtmWzKfrkphz+uVyPUjGHDJEwMBVWVXZmxNvB1b8lQlpD2jBcn+7KFISk8O8s8K+FK0TsiuxuWeJ3sYeM/ZTOXclQLUnYBuECQ1enVi19Fm30ZQP5EM1ciWfC7HR1kyOzmI2XrSS8VV8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1777465646; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id; bh=LMCoUgewKNqniqjmdEXiGqdvJVXo43ZNWMJeYDoNWKo=; b=bqxMBVcmUSkXzDeucEqN3DZg2bj6plZLZjWHsdatfq4M9KVMwPuS/xfl5yJsxDYXI4yoXUkMTHXqj64HqPXYN9Q/6STUmqCpGkl5bEavkW2dz+IfLfaXNgOyJ89yoYrLk0aP3zFa2zqhj83dCGWk6wO+eIUrT0o1mC/EKS2yzQw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [38.145.34.151]) by mx.zohomail.com with SMTPS id 1777465646408740.1187457051144; Wed, 29 Apr 2026 05:27:26 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id B210A41835; Wed, 29 Apr 2026 08:27:25 -0400 (EDT) Received: from [172.19.199.9] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id B363641846; Wed, 29 Apr 2026 08:22:28 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 527F43F364; Wed, 29 Apr 2026 08:22:07 -0400 (EDT) Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 7BE363F363 for ; Wed, 29 Apr 2026 08:22:05 -0400 (EDT) Received: from pps.filterd (m0246627.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 63T7UPlv4079558 for ; Wed, 29 Apr 2026 12:22:04 GMT Received: from phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta01.appoci.oracle.com [138.1.114.2]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4drm702nsw-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Wed, 29 Apr 2026 12:22:04 +0000 (GMT) Received: from pps.filterd (phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (8.18.1.7/8.18.1.7) with ESMTP id 63TCKm2h036476 for ; Wed, 29 Apr 2026 12:22:03 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 4drm2ed4gf-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Wed, 29 Apr 2026 12:22:03 +0000 (GMT) Received: from phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.18.1.12/8.18.1.12) with ESMTP id 63TCM2eX040565 for ; Wed, 29 Apr 2026 12:22:03 GMT Received: from akulhall-vm1-ol9.osdevelopmeniad.oraclevcn.com (akulhall-vm1-ol9.allregionaliads.osdevelopmeniad.oraclevcn.com [100.100.255.191]) by phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTP id 4drm2ed4e6-3; Wed, 29 Apr 2026 12:22:03 +0000 (GMT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-3.4 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_LOW,RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=corp-2025-04-25; bh=LMCoU gewKNqniqjmdEXiGqdvJVXo43ZNWMJeYDoNWKo=; b=N5uTUqb73vqVhhdP9GU7p ppPnsM9A4jVB+nu8WFA1rFsXCkObdLMqZXhEAw7yhb4ogU1tg1ogXZJnGJ7Sg5Gd txY7tPLBw5jPsBm5IZ3YUihMFykpLGwr87N++Twkh7fQdziXFoQKPmykWkME6sPh 16SuXSJJoHjoZGVU2U6hpT8eujADk30Y82leMv7DO4eli/uZDXp3N8LrVzqZMZsD 5lBbQXP4FKzg5l7iPO5o15wBH6WVcJneViIZThrkwul0ziYbDS4WslHzyCOSmLKs otjZpePAdZoAt6h0UOTODAnRUxX2Jx6ZCqgMlS3uDjyUAp8hyHPgz3pyILLoJujG A== To: devel@lists.libvirt.org Subject: [PATCH v3 2/5] qemu: emit vcpu-removed event on unplug completion Date: Wed, 29 Apr 2026 17:43:26 +0530 Message-ID: <20260429122128.1606911-3-akash.kulhalli@oracle.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260429122128.1606911-1-akash.kulhalli@oracle.com> References: <20260429122128.1606911-1-akash.kulhalli@oracle.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-04-28_05,2026-04-28_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 bulkscore=0 mlxscore=0 malwarescore=0 adultscore=0 spamscore=0 suspectscore=0 mlxlogscore=999 lowpriorityscore=0 phishscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2604200000 definitions=main-2604290125 X-Proofpoint-GUID: amwZE5c_JmgAqbT80X4aiICtTdBCzvCl X-Proofpoint-ORIG-GUID: amwZE5c_JmgAqbT80X4aiICtTdBCzvCl X-Authority-Analysis: v=2.4 cv=BePoFLt2 c=1 sm=1 tr=0 ts=69f1f7ec cx=c_pps a=XiAAW1AwiKB2Y8Wsi+sD2Q==:117 a=XiAAW1AwiKB2Y8Wsi+sD2Q==:17 a=A5OVakUREuEA:10 a=VkNPw1HP01LnGYTKEx00:22 a=jiCTI4zE5U7BLdzWsZGv:22 a=RD47p0oAkeU5bO7t-o6f:22 a=yPCof4ZbAAAA:8 a=0LwpQMFJMHrlUmjHoYwA:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDI5MDEyNCBTYWx0ZWRfXz6oeCO2CaGDH PGGSQHmnMnV/QdZEQHE0MfOPjJLWr9FC/8iTLedFrDzHqwEPPHpuVybcCL/POsE3i2wLM33Wd12 pnazhbmQ+2zc2Gaqm4pmjAsM5Mawz2sOfVwuxvWtlsvAPXjl6p2et1TEJs9FSHc8Gk7RUmscXBw 3fgAJLobMSWhcWhynalI+KH2vEABrlLbGEBd3CSE6jzgwKECQwCt7sYqWDpk6pDZNOGZVOZ0bkr 8WPBRpuFBxfBtvhdIaTos8o5bOPwT6qyNL+wWphVm/vPbOkyaP3oiqoKvKFQeyrBB3YFpiDcKZ0 zSNEUFHrvbWiYI8ZSxTri9nxO4UsHSd7q/bAW3JUz2j17+loQQTxcMMkXPpQHo+SR6GKv1cibCN 3qFoxIRCR0qWkdtKOFfJjtSWxLfyXXHBAucIHWp7BeNvP4xL2iqjcRG9TBjNvBtlWfsTR0tksoK th80ALoewQBstwg++2g== Message-ID-Hash: ZYLHQ7T5E2PRYEAZVXMKGPTPZXBI67NQ X-Message-ID-Hash: ZYLHQ7T5E2PRYEAZVXMKGPTPZXBI67NQ X-MailFrom: akash.kulhalli@oracle.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: akash.kulhalli@oracle.com X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Akash Kulhalli via Devel Reply-To: Akash Kulhalli X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1777465648514154100 Content-Type: text/plain; charset="utf-8" Emit the vcpu-removed event when QEMU vCPU unplug completes. Hook this into qemuDomainRemoveVcpu(), which covers both the synchronous completion path and the DEVICE_DELETED-driven alias removal path. Some architectures may have multiple vcpus grouped under a single qemu vcpu object; on those platforms a `vcpu-removed` event will be emitted for each vcpu that is removed from this group. Signed-off-by: Akash Kulhalli Reviewed-by: Peter Krempa --- src/qemu/qemu_hotplug.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index b7a282b96e52..3c9adb2e6c37 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -6728,6 +6728,7 @@ qemuDomainRemoveVcpu(virDomainObj *vm, unsigned int nvcpus =3D vcpupriv->vcpus; size_t i; ssize_t offlineVcpuWithTid =3D -1; + virObjectEvent *event =3D NULL; =20 if (qemuDomainRefreshVcpuInfo(vm, VIR_ASYNC_JOB_NONE, false) < 0) return -1; @@ -6745,6 +6746,10 @@ qemuDomainRemoveVcpu(virDomainObj *vm, if (offlineVcpuWithTid =3D=3D -1) offlineVcpuWithTid =3D i; } + + /* fire the `vcpu-removed` event for each removed vcpu */ + event =3D virDomainEventVcpuRemovedNewFromObj(vm, i); + virObjectEventStateQueue(priv->driver->domainEventState, event); } =20 if (offlineVcpuWithTid !=3D -1) { --=20 2.47.3 From nobody Tue Jun 9 21:01:31 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) client-ip=38.145.34.151; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1777465762; cv=none; d=zohomail.com; s=zohoarc; b=atqsYVBFyRaYVM2cttLO9fArtERlTThn7RfR/US1QS21UKInaB83MInX5BqbUY/HAK8faH2MmkyyozqEY+fatORwlTMk+/gHrph962BwpjKTGjVnaVPqdGItphuNtKPDM7fqaToiPZPRpwKiJVtPSWdnW1ziaVw4KkCG0g3iozE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1777465762; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id; bh=t9/FAeYpKJXe8Tl21TQKZJEVvMXFZO5HXIWPe5Jr9F8=; b=Jl96q74uWkBBZ1DfP0of3bOEPw1mYfEHCX2J+53/ZxgTXf9QxSufOZ4PdFq7pugVo8hQ5L/LmdikkNCXjVw+psutCISXzymfnFLZuYUkFiliKWsHjE+3iCSR+tfYjbn9aj9GQcdIBu1Sa8Rh7k+SRvgDPdaah7PeSe7cJrw61N4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [38.145.34.151]) by mx.zohomail.com with SMTPS id 1777465762778963.6929966462536; Wed, 29 Apr 2026 05:29:22 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 9621B3F862; Wed, 29 Apr 2026 08:29:21 -0400 (EDT) Received: from [172.19.199.9] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id 532CC41AEC; Wed, 29 Apr 2026 08:22:36 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id B2A413F364; Wed, 29 Apr 2026 08:22:07 -0400 (EDT) Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 19BB43F2F8 for ; Wed, 29 Apr 2026 08:22:06 -0400 (EDT) Received: from pps.filterd (m0333521.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 63T3QcOU2128081 for ; Wed, 29 Apr 2026 12:22:05 GMT Received: from phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta01.appoci.oracle.com [138.1.114.2]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4drmhaan29-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Wed, 29 Apr 2026 12:22:04 +0000 (GMT) Received: from pps.filterd (phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (8.18.1.7/8.18.1.7) with ESMTP id 63TCKlFE036383 for ; Wed, 29 Apr 2026 12:22:04 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 4drm2ed4gu-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Wed, 29 Apr 2026 12:22:04 +0000 (GMT) Received: from phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.18.1.12/8.18.1.12) with ESMTP id 63TCM2eZ040565 for ; Wed, 29 Apr 2026 12:22:03 GMT Received: from akulhall-vm1-ol9.osdevelopmeniad.oraclevcn.com (akulhall-vm1-ol9.allregionaliads.osdevelopmeniad.oraclevcn.com [100.100.255.191]) by phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTP id 4drm2ed4e6-4; Wed, 29 Apr 2026 12:22:03 +0000 (GMT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-3.4 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_LOW,RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=corp-2025-04-25; bh=t9/FA eYpKJXe8Tl21TQKZJEVvMXFZO5HXIWPe5Jr9F8=; b=FJ8a31yQwxIOHmKDRBD9B JyebMC/B3d4XgE7b72ZuX8o+6jUQw6Ws8j6F4oXS791ZzY9mb0oevxeqtDIAs2Bf weFDMDsUNrH7M9Vnfh0bncZC16vUpF9nuflVIJGdk1Y0Xr9hCaMBlyiaQN5UwRIf GgT+atBValhlRRsKahPjIV8rNdfqtz2IqD4+LmYQbGrxXZokgFLkk+XjkXExbiTO BgkGKIHE4E2SbTg2VKJWU4Qkl2Jt7ArMrLe6G2JLv60oNEq+1kCiEY9b+qD+Qzga NwpJQpyqC2OSnaD6RjV57ysMfZkFK6fD5V5EkyiMUaB0DX+3jqdsC8pIhCQie3kH A== To: devel@lists.libvirt.org Subject: [PATCH v3 3/5] qemu: thread async vcpu unplug through internal helpers Date: Wed, 29 Apr 2026 17:43:27 +0530 Message-ID: <20260429122128.1606911-4-akash.kulhalli@oracle.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260429122128.1606911-1-akash.kulhalli@oracle.com> References: <20260429122128.1606911-1-akash.kulhalli@oracle.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-04-28_05,2026-04-28_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 bulkscore=0 mlxscore=0 malwarescore=0 adultscore=0 spamscore=0 suspectscore=0 mlxlogscore=999 lowpriorityscore=0 phishscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2604200000 definitions=main-2604290125 X-Proofpoint-GUID: smXdgdiLSOY3mh8-x5TA0HD-2vWJMzHU X-Proofpoint-ORIG-GUID: smXdgdiLSOY3mh8-x5TA0HD-2vWJMzHU X-Authority-Analysis: v=2.4 cv=CrOPtH4D c=1 sm=1 tr=0 ts=69f1f7ed cx=c_pps a=XiAAW1AwiKB2Y8Wsi+sD2Q==:117 a=XiAAW1AwiKB2Y8Wsi+sD2Q==:17 a=A5OVakUREuEA:10 a=VkNPw1HP01LnGYTKEx00:22 a=jiCTI4zE5U7BLdzWsZGv:22 a=x0eKOSpe3m1H3M0S9YoZ:22 a=yPCof4ZbAAAA:8 a=5RbejxtscdsiIglVBAIA:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDI5MDEyNCBTYWx0ZWRfX0uQgyGJt3Bi7 10ZbPSrQx6JE/Ccvm7Z+zD4QfrlIa4z7aLubELIyLridrDoH0icTiEzQ/mmOpa1dj8VFyiFe7+5 YyU3lyiwqnb6Tdhz43FKgJoQpTIA4+kuwvVULosUUJbnXkST6b0rQBNLyWXtAQ3DJix3jYR91td Yh1ClExgW1ZWZxbxYyqf4ObM9JSU73Ye16inoI8tZggKPqPxiZgTvWuHf375pW5PN6/1tvwRuHi G9NuGqXI8wcodIhaXUzpY7rCNkSPydd0b4kq7wO2PvmcsKltF2di4CcQnK4JrdmNE9StRJStzOt xBxo1DPXkceyBcBAdgOis2cE/dNyxyvFm+NcG6iglVJE7zc4zhpy5Y3U9z3nKFP5cSqNjI0lbR5 s9nuSQuplurs1C9YTRRWpRmHLWB/KEUeNTCRxiltKlwtLjNVOYf2p7qxOwDqS3rcLBcJHK37Ahh CLcVp0c3QZZyKD/LxSQ== Message-ID-Hash: 4MKVISHWNREAOORAQIIQY4JNADKLYHNB X-Message-ID-Hash: 4MKVISHWNREAOORAQIIQY4JNADKLYHNB X-MailFrom: akash.kulhalli@oracle.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: akash.kulhalli@oracle.com X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Akash Kulhalli via Devel Reply-To: Akash Kulhalli X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1777465763512158500 Content-Type: text/plain; charset="utf-8" Thread an async_unplug flag through the internal QEMU vCPU unplug helpers. When set, the unplug path returns after QEMU accepts the device deletion request and leaves final completion to the existing DEVICE_DELETED handling routines. All callers still pass false, so this does not change behaviour yet. Signed-off-by: Akash Kulhalli Reviewed-by: Peter Krempa --- src/qemu/qemu_driver.c | 5 ++-- src/qemu/qemu_hotplug.c | 51 +++++++++++++++++++++++++++++++++-------- src/qemu/qemu_hotplug.h | 6 +++-- tests/qemuhotplugtest.c | 5 ++-- 4 files changed, 52 insertions(+), 15 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index d227ac58cdb4..4d9be3d3a9e5 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -4303,7 +4303,7 @@ qemuDomainSetVcpusFlags(virDomainPtr dom, ret =3D qemuDomainSetVcpusMax(driver, vm, def, persistentDef, nvcp= us); else ret =3D qemuDomainSetVcpusInternal(driver, vm, def, persistentDef, - nvcpus, hotpluggable); + nvcpus, hotpluggable, false); =20 endjob: if (useAgent) @@ -19220,7 +19220,8 @@ qemuDomainSetVcpu(virDomainPtr dom, } } =20 - ret =3D qemuDomainSetVcpuInternal(driver, vm, def, persistentDef, map,= !!state); + ret =3D qemuDomainSetVcpuInternal(driver, vm, def, persistentDef, map, + !!state, false); =20 endjob: virDomainObjEndJob(vm); diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 3c9adb2e6c37..bf5b418486f7 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -6793,7 +6793,8 @@ static int qemuDomainHotplugDelVcpu(virQEMUDriver *driver, virQEMUDriverConfig *cfg, virDomainObj *vm, - unsigned int vcpu) + unsigned int vcpu, + bool async_unplug) { virDomainVcpuDef *vcpuinfo =3D virDomainDefGetVcpu(vm->def, vcpu); qemuDomainVcpuPrivate *vcpupriv =3D QEMU_DOMAIN_VCPU_PRIVATE(vcpuinfo); @@ -6808,7 +6809,8 @@ qemuDomainHotplugDelVcpu(virQEMUDriver *driver, return -1; } =20 - qemuDomainMarkDeviceAliasForRemoval(vm, vcpupriv->alias); + if (!async_unplug) + qemuDomainMarkDeviceAliasForRemoval(vm, vcpupriv->alias); =20 rc =3D qemuDomainDeleteDevice(vm, vcpupriv->alias); if (rc < 0) { @@ -6817,6 +6819,12 @@ qemuDomainHotplugDelVcpu(virQEMUDriver *driver, virDomainAuditVcpu(vm, oldvcpus, oldvcpus - nvcpus, "updat= e", false); goto cleanup; } + } else if (async_unplug) { + /* + * Let DEVICE_DELETED finish the unplug asynchronously when qemu + * accepted the delete request. + */ + return 0; } else { if ((rc =3D qemuDomainWaitForDeviceRemoval(vm)) <=3D 0) { if (rc =3D=3D 0) @@ -6837,7 +6845,8 @@ qemuDomainHotplugDelVcpu(virQEMUDriver *driver, ret =3D 0; =20 cleanup: - qemuDomainResetDeviceRemoval(vm); + if (!async_unplug) + qemuDomainResetDeviceRemoval(vm); return ret; } =20 @@ -7008,7 +7017,8 @@ qemuDomainSetVcpusLive(virQEMUDriver *driver, virQEMUDriverConfig *cfg, virDomainObj *vm, virBitmap *vcpumap, - bool enable) + bool enable, + bool async) { qemuDomainObjPrivate *priv =3D vm->privateData; virCgroupEmulatorAllNodesData *emulatorCgroup =3D NULL; @@ -7028,7 +7038,7 @@ qemuDomainSetVcpusLive(virQEMUDriver *driver, if (!virBitmapIsBitSet(vcpumap, nextvcpu)) continue; =20 - if (qemuDomainHotplugDelVcpu(driver, cfg, vm, nextvcpu) < 0) + if (qemuDomainHotplugDelVcpu(driver, cfg, vm, nextvcpu, async)= < 0) goto cleanup; } } @@ -7119,7 +7129,8 @@ qemuDomainSetVcpusInternal(virQEMUDriver *driver, virDomainDef *def, virDomainDef *persistentDef, unsigned int nvcpus, - bool hotpluggable) + bool hotpluggable, + bool async_unplug) { g_autoptr(virQEMUDriverConfig) cfg =3D virQEMUDriverGetConfig(driver); g_autoptr(virBitmap) vcpumap =3D NULL; @@ -7144,7 +7155,8 @@ qemuDomainSetVcpusInternal(virQEMUDriver *driver, &enable))) return -1; =20 - if (qemuDomainSetVcpusLive(driver, cfg, vm, vcpumap, enable) < 0) + if (qemuDomainSetVcpusLive(driver, cfg, vm, vcpumap, enable, + async_unplug) < 0) return -1; } =20 @@ -7288,13 +7300,33 @@ qemuDomainVcpuValidateConfig(virDomainDef *def, } =20 =20 +/** + * qemuDomainSetVcpuInternal: + * @driver: the QEMU driver object + * @vm: the domain object + * @def: the live domain definition + * @persistentDef: the persistent (config) domain definition + * @map: a bitmap of cpus to be set to state @state + * @state: enable/disable the vcpus marked in @map + * @async_unplug: only used in case of unplug (i.e. @state=3Dfalse) + * + * When @async_unplug is set to true, libvirt will not wait for + * the guest to comply with the unplug request but instead return + * immediately after receiving the acknowledgement from QEMU. Otherwise, + * libvirt will wait for a brief moment (defined by qemuDomainGetUnplugTim= eout) + * before giving up and returning control to the caller. + * + * If the request results in adding a vcpu, this parameter is ignored. + * + */ int qemuDomainSetVcpuInternal(virQEMUDriver *driver, virDomainObj *vm, virDomainDef *def, virDomainDef *persistentDef, virBitmap *map, - bool state) + bool state, + bool async_unplug) { g_autoptr(virQEMUDriverConfig) cfg =3D virQEMUDriverGetConfig(driver); g_autoptr(virBitmap) livevcpus =3D NULL; @@ -7326,7 +7358,8 @@ qemuDomainSetVcpuInternal(virQEMUDriver *driver, } =20 if (livevcpus && - qemuDomainSetVcpusLive(driver, cfg, vm, livevcpus, state) < 0) + qemuDomainSetVcpusLive(driver, cfg, vm, livevcpus, state, + async_unplug) < 0) return -1; =20 if (persistentDef) { diff --git a/src/qemu/qemu_hotplug.h b/src/qemu/qemu_hotplug.h index e6c90253e416..60ed0e174c21 100644 --- a/src/qemu/qemu_hotplug.h +++ b/src/qemu/qemu_hotplug.h @@ -106,7 +106,8 @@ qemuDomainSetVcpusInternal(virQEMUDriver *driver, virDomainDef *def, virDomainDef *persistentDef, unsigned int nvcpus, - bool hotpluggable); + bool hotpluggable, + bool async_unplug); =20 int qemuDomainSetVcpuInternal(virQEMUDriver *driver, @@ -114,7 +115,8 @@ qemuDomainSetVcpuInternal(virQEMUDriver *driver, virDomainDef *def, virDomainDef *persistentDef, virBitmap *vcpus, - bool state); + bool state, + bool async_unplug); =20 unsigned long long qemuDomainGetUnplugTimeout(virDomainObj *vm) ATTRIBUTE_MOCKABLE; diff --git a/tests/qemuhotplugtest.c b/tests/qemuhotplugtest.c index ea9d3243f8b1..7e49b9ad3661 100644 --- a/tests/qemuhotplugtest.c +++ b/tests/qemuhotplugtest.c @@ -420,7 +420,7 @@ testQemuHotplugCpuGroup(const void *opaque) =20 rc =3D qemuDomainSetVcpusInternal(&driver, data->vm, data->vm->def, data->vm->newDef, params->newcpus, - true); + true, false); =20 if (params->fail) { if (rc =3D=3D 0) @@ -458,7 +458,8 @@ testQemuHotplugCpuIndividual(const void *opaque) goto cleanup; =20 rc =3D qemuDomainSetVcpuInternal(&driver, data->vm, data->vm->def, - data->vm->newDef, map, params->state); + data->vm->newDef, map, params->state, + false); =20 if (params->fail) { if (rc =3D=3D 0) --=20 2.47.3 From nobody Tue Jun 9 21:01:31 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) client-ip=38.145.34.151; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1777465855; cv=none; d=zohomail.com; s=zohoarc; b=YpyYSOV3SfD7sTMSfL8QOQrgHmECtU4nGtrR1CsYFGkH+1qTyMSpFK5I56c71SkEq2+yCqbgqEnOBPIINM1zXFfzj9zhYp8IA86LxGygPritx/LI5XEV4BwKyqMiXKMNLxGPYIdaT/9DI7xtCjIPTVcIQ6x6AgWVESaejH2W9aY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1777465855; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id; bh=eiZN4rJzIAURCnNXYAcKdBu01FNouqbUsneaR+A4wEM=; b=DqjTxUbC41UlWV/zRacR7NfplfLWzpvzGF10tQPby+HvcNkV9+F1scmA/deNxig9AfTgNL4DHFvEdltNy+0AyqFaWMIb6GmPZwO+5Z3bSq8HaTSNlvN+DVdlM+ldKk5/4O/uoI9GWCjAd6d0UNZPq0kJMuw9HwJQSeAHmM3vW5g= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [38.145.34.151]) by mx.zohomail.com with SMTPS id 1777465855642562.184376344832; Wed, 29 Apr 2026 05:30:55 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 0CF993F846; Wed, 29 Apr 2026 08:30:55 -0400 (EDT) Received: from [172.19.199.9] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id DB66C41B3F; Wed, 29 Apr 2026 08:22:42 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 334423F364; Wed, 29 Apr 2026 08:22:08 -0400 (EDT) Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id BE6813F252 for ; Wed, 29 Apr 2026 08:22:06 -0400 (EDT) Received: from pps.filterd (m0333521.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 63T3R7Y12128102 for ; Wed, 29 Apr 2026 12:22:06 GMT Received: from phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta01.appoci.oracle.com [138.1.114.2]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4drmhaan2f-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Wed, 29 Apr 2026 12:22:05 +0000 (GMT) Received: from pps.filterd (phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (8.18.1.7/8.18.1.7) with ESMTP id 63TCKmX7036468 for ; Wed, 29 Apr 2026 12:22:05 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 4drm2ed4h8-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Wed, 29 Apr 2026 12:22:04 +0000 (GMT) Received: from phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.18.1.12/8.18.1.12) with ESMTP id 63TCM2eb040565 for ; Wed, 29 Apr 2026 12:22:04 GMT Received: from akulhall-vm1-ol9.osdevelopmeniad.oraclevcn.com (akulhall-vm1-ol9.allregionaliads.osdevelopmeniad.oraclevcn.com [100.100.255.191]) by phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTP id 4drm2ed4e6-5; Wed, 29 Apr 2026 12:22:04 +0000 (GMT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-3.4 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_LOW,RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=corp-2025-04-25; bh=eiZN4 rJzIAURCnNXYAcKdBu01FNouqbUsneaR+A4wEM=; b=lra8XLzDI4o9i2GDpQykx /f+dH4EWy3phu1SEsY/lh+C4d/8/17vutYiDaYSBhaiuPdGRky1/v9/PxSdeyZ6u Ln9R58vX3z7o4e7daxcu8A7QxpfYT+T5c3Y46oFbILPPb3nMie61YKPsaW9ggh8t XZluofoN9pUV1LvMZXgh4fDnbpSKK9poaV6hUhWycIr1qbJxr1A6yJnePZA56bAW avBva155TCjkkfNb2LQtnNjGorqnMNyUjSHM/ZF/mvK5dsNTnrQKKQ7T1cl+1kze 0LxlS6b2lGHJ3mNiDMN1oev7qJkR6VDguad+DrX6qu2EGg5/6E1rAOym/e5dRVj7 Q== To: devel@lists.libvirt.org Subject: [PATCH v3 4/5] API/qemu: add async unplug flag to virDomainSetVcpusFlags Date: Wed, 29 Apr 2026 17:43:28 +0530 Message-ID: <20260429122128.1606911-5-akash.kulhalli@oracle.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260429122128.1606911-1-akash.kulhalli@oracle.com> References: <20260429122128.1606911-1-akash.kulhalli@oracle.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-04-28_05,2026-04-28_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 bulkscore=0 mlxscore=0 malwarescore=0 adultscore=0 spamscore=0 suspectscore=0 mlxlogscore=999 lowpriorityscore=0 phishscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2604200000 definitions=main-2604290125 X-Proofpoint-GUID: anc0RQt7zUtTOJm4I43hlqY6jCYhplkV X-Proofpoint-ORIG-GUID: anc0RQt7zUtTOJm4I43hlqY6jCYhplkV X-Authority-Analysis: v=2.4 cv=CrOPtH4D c=1 sm=1 tr=0 ts=69f1f7ed cx=c_pps a=XiAAW1AwiKB2Y8Wsi+sD2Q==:117 a=XiAAW1AwiKB2Y8Wsi+sD2Q==:17 a=A5OVakUREuEA:10 a=VkNPw1HP01LnGYTKEx00:22 a=jiCTI4zE5U7BLdzWsZGv:22 a=x0eKOSpe3m1H3M0S9YoZ:22 a=yPCof4ZbAAAA:8 a=hrufitzwEWiLz-S3ox4A:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDI5MDEyNCBTYWx0ZWRfXyF/BUCbEJhaB P7VF4yxBEHFPCQfOft/VuF48I8U7L2csKP0VKlwsg1hqqHPQcn4ERZyjfnpc/BhNwTXv5tmTLUa +RF80hu1GsIw53LMmKq+YGEwDLLe9z1wHIHXSQPOSNSVwXw/cpO3bkVK+xsWJdMw2OSaBen7rhd rH45xBqMlb3NXQ/iIUpBUvJlhPEYaPGKxxsIXIqj2jPuUzYnhTd4MjZZtMzVKE3JBjdFH5cJzzQ ++/v0Ut5u5X9FsRWsQHETm7UT5CL8p9gsd3zVTNR0JxDzFq3aslZe5h8vA5XARTj8S7lBRWhyz+ 6GHDwNyf3zjyB3sTGIASHAImoqNbUkxcBw1Efm/BH9FOnmVoKlV8Z0g7sLzFItqg9zX1/TnPkV9 PqQBbRbZDvqpR5vVHcWp5VfzfM3TYku7nE7QLeBTEpQPwiiHCXi2cWHFwY6j6PQeRCNQ1ZEPhJP Jd94FX8zVg46cQR+9IA== Message-ID-Hash: 42EJIHE6YQ4V2CMAF2XG7F2QP73IJL5L X-Message-ID-Hash: 42EJIHE6YQ4V2CMAF2XG7F2QP73IJL5L X-MailFrom: akash.kulhalli@oracle.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: akash.kulhalli@oracle.com X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Akash Kulhalli via Devel Reply-To: Akash Kulhalli X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1777465857874154100 Content-Type: text/plain; charset="utf-8" Add VIR_DOMAIN_VCPU_ASYNC_UNPLUG for virDomainSetVcpusFlags(). With this flag, success indicates that QEMU accepted the unplug request, while final completion is reported by the vcpu-removed event. Rejected requests continue to be reported by the device-removal-failed event. Wire the flag through the QEMU driver, document its semantics, and add virsh support for the async path in the setvcpus subcommand. Signed-off-by: Akash Kulhalli Reviewed-by: Peter Krempa --- docs/manpages/virsh.rst | 8 +++++++- include/libvirt/libvirt-domain.h | 1 + src/libvirt-domain.c | 10 ++++++++++ src/qemu/qemu_driver.c | 12 ++++++++++-- tools/virsh-domain.c | 8 ++++++++ 5 files changed, 36 insertions(+), 3 deletions(-) diff --git a/docs/manpages/virsh.rst b/docs/manpages/virsh.rst index 80b0ea14a8b3..cc9028b2e540 100644 --- a/docs/manpages/virsh.rst +++ b/docs/manpages/virsh.rst @@ -4810,7 +4810,7 @@ setvcpus =20 :: =20 - setvcpus domain count [--maximum] [[--config] [--live] | [--current]] [= --guest] [--hotpluggable] + setvcpus domain count [--maximum] [[--config] [--live] | [--current]] [= --guest] [--hotpluggable] [--async] =20 Change the number of virtual CPUs active in a guest domain. By default, this command works on active guest domains. To change the settings for an @@ -4839,6 +4839,12 @@ is up to the hypervisor whether the *--config* flag = is also assumed, and therefore whether the XML configuration is adjusted to make the change persistent. =20 +If *--async* is specified, live vCPU unplug requests are fired without wai= ting +for the guest to comply. It may optionally be combined with *--config*. Fi= nal +completion is reported by the ``vcpu-removed`` domain event, while rejected +unplug requests continue to be reported by ``device-removal-failed``. This +flag cannot be combined with *--guest*. + If *--guest* is specified, then the count of cpus is modified in the guest instead of the hypervisor. This flag is usable only for live domains and may require guest agent to be configured in the guest. diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-dom= ain.h index 21336df85bd8..8902742a5ec8 100644 --- a/include/libvirt/libvirt-domain.h +++ b/include/libvirt/libvirt-domain.h @@ -2605,6 +2605,7 @@ typedef enum { VIR_DOMAIN_VCPU_MAXIMUM =3D (1 << 2), /* Max rather than current count= (Since: 0.8.5) */ VIR_DOMAIN_VCPU_GUEST =3D (1 << 3), /* Modify state of the cpu in th= e guest (Since: 1.1.0) */ VIR_DOMAIN_VCPU_HOTPLUGGABLE =3D (1 << 4), /* Make vcpus added hot(un)= pluggable (Since: 2.4.0) */ + VIR_DOMAIN_VCPU_ASYNC_UNPLUG =3D (1 << 5), /* Don't wait for the guest= to comply with unplug request(s) (Since: 12.4.0) */ } virDomainVcpuFlags; =20 int virDomainSetVcpus (virDomainPtr domain, diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c index db9eea57745c..97af1099f939 100644 --- a/src/libvirt-domain.c +++ b/src/libvirt-domain.c @@ -7773,6 +7773,16 @@ virDomainSetVcpus(virDomainPtr domain, unsigned int = nvcpus) * be used with live guests and is incompatible with VIR_DOMAIN_VCPU_MAXIM= UM. * The usage of this flag may require a guest agent configured. * + * If @flags includes VIR_DOMAIN_VCPU_ASYNC_UNPLUG, live vCPU hot-unplug + * request(s) are fired without waiting for the guest to comply. Success in + * this mode only means that the unplug request(s) were accepted. Final + * completion is reported by VIR_DOMAIN_EVENT_ID_VCPU_REMOVED, carrying the + * XML ```` value for each removed vCPU. Rejected unplug + * requests continue to be reported through the event + * VIR_DOMAIN_EVENT_ID_DEVICE_REMOVAL_FAILED. The success event may be + * delivered before this API call returns. This flag has no effect when th= is + * operation results in an increase in the live vCPU count. + * * Not all hypervisors can support all flag combinations. * * Returns 0 in case of success, -1 in case of failure. diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 4d9be3d3a9e5..b9c08beb08a5 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -4269,6 +4269,7 @@ qemuDomainSetVcpusFlags(virDomainPtr dom, virDomainObj *vm =3D NULL; virDomainDef *def; virDomainDef *persistentDef; + bool async_unplug =3D !!(flags & VIR_DOMAIN_VCPU_ASYNC_UNPLUG); bool hotpluggable =3D !!(flags & VIR_DOMAIN_VCPU_HOTPLUGGABLE); bool useAgent =3D !!(flags & VIR_DOMAIN_VCPU_GUEST); int ret =3D -1; @@ -4277,7 +4278,8 @@ qemuDomainSetVcpusFlags(virDomainPtr dom, VIR_DOMAIN_AFFECT_CONFIG | VIR_DOMAIN_VCPU_MAXIMUM | VIR_DOMAIN_VCPU_GUEST | - VIR_DOMAIN_VCPU_HOTPLUGGABLE, -1); + VIR_DOMAIN_VCPU_HOTPLUGGABLE | + VIR_DOMAIN_VCPU_ASYNC_UNPLUG, -1); =20 if (!(vm =3D qemuDomainObjFromDomain(dom))) goto cleanup; @@ -4297,13 +4299,19 @@ qemuDomainSetVcpusFlags(virDomainPtr dom, if (virDomainObjGetDefs(vm, flags, &def, &persistentDef) < 0) goto endjob; =20 + if (async_unplug && useAgent) { + virReportError(VIR_ERR_OPERATION_INVALID, "%s", + _("asynchronous mode is unsupported with VIR_DOMAIN= _VCPU_GUEST")); + goto endjob; + } + if (useAgent) ret =3D qemuDomainSetVcpusAgent(vm, nvcpus); else if (flags & VIR_DOMAIN_VCPU_MAXIMUM) ret =3D qemuDomainSetVcpusMax(driver, vm, def, persistentDef, nvcp= us); else ret =3D qemuDomainSetVcpusInternal(driver, vm, def, persistentDef, - nvcpus, hotpluggable, false); + nvcpus, hotpluggable, async_unplu= g); =20 endjob: if (useAgent) diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c index 08a1ce395378..1fccee4bc9ed 100644 --- a/tools/virsh-domain.c +++ b/tools/virsh-domain.c @@ -7667,6 +7667,10 @@ static const vshCmdOptDef opts_setvcpus[] =3D { .type =3D VSH_OT_BOOL, .help =3D N_("make added vcpus hot(un)pluggable") }, + {.name =3D "async", + .type =3D VSH_OT_BOOL, + .help =3D N_("return after firing vcpu unplug request(s)") + }, {.name =3D NULL} }; =20 @@ -7681,11 +7685,13 @@ cmdSetvcpus(vshControl *ctl, const vshCmd *cmd) bool current =3D vshCommandOptBool(cmd, "current"); bool guest =3D vshCommandOptBool(cmd, "guest"); bool hotpluggable =3D vshCommandOptBool(cmd, "hotpluggable"); + bool async =3D vshCommandOptBool(cmd, "async"); unsigned int flags =3D VIR_DOMAIN_AFFECT_CURRENT; =20 VSH_EXCLUSIVE_OPTIONS_VAR(current, live); VSH_EXCLUSIVE_OPTIONS_VAR(current, config); VSH_EXCLUSIVE_OPTIONS_VAR(guest, config); + VSH_EXCLUSIVE_OPTIONS_VAR(async, guest); =20 VSH_REQUIRE_OPTION_VAR(maximum, config); =20 @@ -7699,6 +7705,8 @@ cmdSetvcpus(vshControl *ctl, const vshCmd *cmd) flags |=3D VIR_DOMAIN_VCPU_MAXIMUM; if (hotpluggable) flags |=3D VIR_DOMAIN_VCPU_HOTPLUGGABLE; + if (async) + flags |=3D VIR_DOMAIN_VCPU_ASYNC_UNPLUG; =20 if (!(dom =3D virshCommandOptDomain(ctl, cmd, NULL))) return false; --=20 2.47.3 From nobody Tue Jun 9 21:01:31 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) client-ip=38.145.34.151; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1777465942; cv=none; d=zohomail.com; s=zohoarc; b=Y5VLTeE/qNyKBnB5VWNrGpCuqbqt5UrCdtNe+pyXwso4qyN/9lFWdVp2qmgjX/e1L8oBww0zBkQWapR4oQ8CLvuZ0Cz8i+N2N/ybLbkJVU00zYscDKiBpIRrc3XieI7DXu9V3VZSp0Fh2GKIhdw4bRph1Uwru0J39JeIPsCTmOc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1777465942; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id; bh=yJKmfeo7Xsb4KcVEf2xGVGiThUJUASwUowraC5o3xts=; b=Dhw/5/hetJ6t6glZ84CiywxE8DdvbNXD4tU7hIaY7Sja5azEu0xqyZ4Zhp8WspkLVESnsBKC8CZ+ZeqcKpAOfmcz0MpKPuKz1pl9P7mmJVUN63qrgMFyePW73ZX/8ZTCToQ6NBdF08g0Z27MHm89EIe4Xp5j8MmQThoLlLN7jF4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [38.145.34.151]) by mx.zohomail.com with SMTPS id 177746594275043.110757414418686; Wed, 29 Apr 2026 05:32:22 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 161AB3F86D; Wed, 29 Apr 2026 08:32:22 -0400 (EDT) Received: from [172.19.199.9] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id A9B5B41B7C; Wed, 29 Apr 2026 08:22:48 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 7F6613F252; Wed, 29 Apr 2026 08:22:08 -0400 (EDT) Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 444293F2F2 for ; Wed, 29 Apr 2026 08:22:07 -0400 (EDT) Received: from pps.filterd (m0246617.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 63T8qMl6721101 for ; Wed, 29 Apr 2026 12:22:06 GMT Received: from phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta01.appoci.oracle.com [138.1.114.2]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4drp5t2jgn-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Wed, 29 Apr 2026 12:22:06 +0000 (GMT) Received: from pps.filterd (phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (8.18.1.7/8.18.1.7) with ESMTP id 63TCKmfL036457 for ; Wed, 29 Apr 2026 12:22:05 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 4drm2ed4hs-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Wed, 29 Apr 2026 12:22:05 +0000 (GMT) Received: from phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.18.1.12/8.18.1.12) with ESMTP id 63TCM2ed040565 for ; Wed, 29 Apr 2026 12:22:05 GMT Received: from akulhall-vm1-ol9.osdevelopmeniad.oraclevcn.com (akulhall-vm1-ol9.allregionaliads.osdevelopmeniad.oraclevcn.com [100.100.255.191]) by phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTP id 4drm2ed4e6-6; Wed, 29 Apr 2026 12:22:05 +0000 (GMT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-3.4 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_LOW,RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=corp-2025-04-25; bh=yJKmf eo7Xsb4KcVEf2xGVGiThUJUASwUowraC5o3xts=; b=VOKAAPQqSzXdQiH+HBw0r GaxU7UmUsop1ZPtFjscUyKwRCBm0vMbqBOLlj4WIayZJF1E8KtljvHr8j+sG+tCs mF49DlEOrs8CtBKNRG3Pui+L7VeONLHG2j6fLV+1klyl91GxQslOUuD7si9ZoE9Q 6M8tnUqwA7H/+jP7QaSuqW14kcYt64NA0HTxLoihiGd9gqYlf7sA64/GxvoFGMNQ ytvmMrCqwUwcf/Q7SUwaIsssSk4wGHAzJunvqkIQpi2+tht39L9nI/BIa7q0umXA Iq74QzHW+lYqEK2GxD05j3tdNTStbeRA+0rd8iBRAJowGyz9K4jnARA3vChucMqe Q== To: devel@lists.libvirt.org Subject: [PATCH v3 5/5] API/qemu: add async unplug flag to virDomainSetVcpu Date: Wed, 29 Apr 2026 17:43:29 +0530 Message-ID: <20260429122128.1606911-6-akash.kulhalli@oracle.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260429122128.1606911-1-akash.kulhalli@oracle.com> References: <20260429122128.1606911-1-akash.kulhalli@oracle.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-04-28_05,2026-04-28_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 bulkscore=0 mlxscore=0 malwarescore=0 adultscore=0 spamscore=0 suspectscore=0 mlxlogscore=999 lowpriorityscore=0 phishscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2604200000 definitions=main-2604290125 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDI5MDEyNCBTYWx0ZWRfXxsvvUMKIHUvP qQbzTLlBvs/O+6caerVeewXQL/WkpwRAOtYM172EzrlMKlZJ9MxR8C/AEjNuJbcKT4EOH6/P4YT L7GLprd7wV37wusJ289aLwQL72ArDAsx/sOoDGC+T+gsbmZS98crs3tcXAQojvbGhemmniAz+no yZYHEhxL1BNUl/u0U3xHlG/9OxRFkTn2XLzzYjAUAKq0Iafjne+4tN3atKuRGvK3Tb6OOH5aU/v r5mQrTvbwutbnK6/2m9rSpVhi4Wz659fHWWz4CNkgfLsMhg0hAKSDR7C5zkaBZKTy7nrvz5L7Du 1YFoN37ltDXYzit4EIjfNUdCQ+7bky0PxVjjGs66ipzE0AojykeG37zvC3MwhshyvqAaOJw5slG Y8GBD5CN9CeuDLevK4WrbWA6T5LYSiZEiLem3BwZNoQQczDtG5PX6qE3L8Tl23XVOGKFczlir8W xoVm4uDFzPmZ9T6x/TQ== X-Proofpoint-ORIG-GUID: BiqUn2i21cfIuvXQ-4HRmXhT8Luapvd6 X-Proofpoint-GUID: BiqUn2i21cfIuvXQ-4HRmXhT8Luapvd6 X-Authority-Analysis: v=2.4 cv=E7v9Y6dl c=1 sm=1 tr=0 ts=69f1f7ee cx=c_pps a=XiAAW1AwiKB2Y8Wsi+sD2Q==:117 a=XiAAW1AwiKB2Y8Wsi+sD2Q==:17 a=A5OVakUREuEA:10 a=VkNPw1HP01LnGYTKEx00:22 a=jiCTI4zE5U7BLdzWsZGv:22 a=7Gl3-_t3PgB9XO-mQDs3:22 a=yPCof4ZbAAAA:8 a=wemyexcROqxDEjE8QOMA:9 Message-ID-Hash: ERGUJV2FKD37WFXIKVU723SAQE5KSMHU X-Message-ID-Hash: ERGUJV2FKD37WFXIKVU723SAQE5KSMHU X-MailFrom: akash.kulhalli@oracle.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: akash.kulhalli@oracle.com X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Akash Kulhalli via Devel Reply-To: Akash Kulhalli X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1777465945287154100 Content-Type: text/plain; charset="utf-8" Add VIR_DOMAIN_SETVCPU_ASYNC_UNPLUG for virDomainSetVcpu(). Define a dedicated virDomainSetVcpuBehaviour flag type and wire the new flag through the QEMU driver. As with setvcpus async unplug, success indicates request acceptance while final completion is reported by the vcpu-removed event. Update the API documentation and add virsh support for the async path to the setvcpu subcommand. Signed-off-by: Akash Kulhalli Reviewed-by: Peter Krempa --- docs/manpages/virsh.rst | 8 +++++++- include/libvirt/libvirt-domain.h | 18 ++++++++++++++++++ src/libvirt-domain.c | 12 +++++++++++- src/qemu/qemu_driver.c | 6 ++++-- tools/virsh-domain.c | 8 ++++++++ 5 files changed, 48 insertions(+), 4 deletions(-) diff --git a/docs/manpages/virsh.rst b/docs/manpages/virsh.rst index cc9028b2e540..2db9772fca43 100644 --- a/docs/manpages/virsh.rst +++ b/docs/manpages/virsh.rst @@ -4868,7 +4868,7 @@ setvcpu =20 :: =20 - setvcpu domain vcpulist [--enable] | [--disable] + setvcpu domain vcpulist [--enable] | [--disable] [--async] [[--live] [--config] | [--current]] =20 Change state of individual vCPUs using hot(un)plug mechanism. @@ -4888,6 +4888,12 @@ If *--current* is specified, it is equivalent to eit= her *--live* or default. Both *--live* and *--config* flags may be given, but *--current* is exclusive. =20 +If *--async* is specified with *--disable*, live vCPU unplug requests are +fired without waiting for the guest to comply. This may optionally be +combined with *--config*. Final completion of this operation is reported +by the ``vcpu-removed`` domain event, while rejected unplug requests conti= nue +to be reported by ``device-removal-failed``. + =20 shutdown -------- diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-dom= ain.h index 8902742a5ec8..cf05bfe2b757 100644 --- a/include/libvirt/libvirt-domain.h +++ b/include/libvirt/libvirt-domain.h @@ -329,6 +329,24 @@ typedef enum { /* 1 << 2 is reserved for virTypedParameterFlags */ } virDomainModificationImpact; =20 +/** + * virDomainSetVcpuFlags: + * + * These flags must be used when calling the `virDomainSetVcpu` API. + * + * Since: 12.4.0 + */ +typedef enum { + /* Alias of VIR_DOMAIN_AFFECT_CURRENT. (Since: 12.4.0) */ + VIR_DOMAIN_SETVCPU_AFFECT_CURRENT =3D VIR_DOMAIN_AFFECT_CURRENT, + /* Alias of VIR_DOMAIN_AFFECT_LIVE. (Since: 12.4.0) */ + VIR_DOMAIN_SETVCPU_AFFECT_LIVE =3D VIR_DOMAIN_AFFECT_LIVE, + /* Alias of VIR_DOMAIN_AFFECT_CONFIG. (Since: 12.4.0) */ + VIR_DOMAIN_SETVCPU_AFFECT_CONFIG =3D VIR_DOMAIN_AFFECT_CONFIG, + /* Do not wait for the guest to comply with the request (Since: 12.4.0= ) */ + VIR_DOMAIN_SETVCPU_ASYNC_UNPLUG =3D 1 << 2 +} virDomainSetVcpuFlags; + /** * virDomainInfo: * diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c index 97af1099f939..a4cbeb8ad486 100644 --- a/src/libvirt-domain.c +++ b/src/libvirt-domain.c @@ -13135,7 +13135,7 @@ virDomainSetGuestVcpus(virDomainPtr domain, * @domain: pointer to domain object * @vcpumap: text representation of a bitmap of vcpus to set * @state: 0 to disable/1 to enable cpus described by @vcpumap - * @flags: bitwise-OR of virDomainModificationImpact + * @flags: bitwise-OR of virDomainSetVcpuFlags * * Enables/disables individual vcpus described by @vcpumap in the hypervis= or. * @@ -13144,6 +13144,16 @@ virDomainSetGuestVcpus(virDomainPtr domain, * * Note that OSes and hypervisors may require vCPU 0 to stay online. * + * If @flags includes VIR_DOMAIN_SETVCPU_ASYNC_UNPLUG, live vCPU disable + * (i.e. hot-unplug) request(s) are fired without waiting for the guest to + * comply. Success in this mode means only that the unplug request(s) were + * accepted. Final completion is reported by VIR_DOMAIN_EVENT_ID_VCPU_REMO= VED, + * carrying the XML ```` value for each removed vCPU. Rej= ected + * unplug requests continue to be reported by the event ID + * VIR_DOMAIN_EVENT_ID_DEVICE_REMOVAL_FAILED. + * The success event may be delivered before this API call returns. This f= lag + * has no effect when the selected vCPUs are enabled. + * * Returns 0 on success, -1 on error. * * Since: 3.1.0 diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index b9c08beb08a5..ef641a75d851 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -19177,12 +19177,14 @@ qemuDomainSetVcpu(virDomainPtr dom, virDomainObj *vm =3D NULL; virDomainDef *def =3D NULL; virDomainDef *persistentDef =3D NULL; + bool async_unplug =3D !!(flags & VIR_DOMAIN_SETVCPU_ASYNC_UNPLUG); g_autoptr(virBitmap) map =3D NULL; ssize_t lastvcpu; int ret =3D -1; =20 virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | - VIR_DOMAIN_AFFECT_CONFIG, -1); + VIR_DOMAIN_AFFECT_CONFIG | + VIR_DOMAIN_SETVCPU_ASYNC_UNPLUG, -1); =20 if (state !=3D 0 && state !=3D 1) { virReportInvalidArg(state, "%s", _("unsupported state value")); @@ -19229,7 +19231,7 @@ qemuDomainSetVcpu(virDomainPtr dom, } =20 ret =3D qemuDomainSetVcpuInternal(driver, vm, def, persistentDef, map, - !!state, false); + !!state, async_unplug); =20 endjob: virDomainObjEndJob(vm); diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c index 1fccee4bc9ed..76369e8694ce 100644 --- a/tools/virsh-domain.c +++ b/tools/virsh-domain.c @@ -7837,6 +7837,10 @@ static const vshCmdOptDef opts_setvcpu[] =3D { .type =3D VSH_OT_BOOL, .help =3D N_("disable cpus specified by cpumap") }, + {.name =3D "async", + .type =3D VSH_OT_BOOL, + .help =3D N_("return after firing vcpu unplug request") + }, VIRSH_COMMON_OPT_DOMAIN_CONFIG, VIRSH_COMMON_OPT_DOMAIN_LIVE, VIRSH_COMMON_OPT_DOMAIN_CURRENT, @@ -7851,6 +7855,7 @@ cmdSetvcpu(vshControl *ctl, const vshCmd *cmd) bool disable =3D vshCommandOptBool(cmd, "disable"); bool config =3D vshCommandOptBool(cmd, "config"); bool live =3D vshCommandOptBool(cmd, "live"); + bool async =3D vshCommandOptBool(cmd, "async"); const char *vcpulist =3D NULL; int state =3D 0; unsigned int flags =3D VIR_DOMAIN_AFFECT_CURRENT; @@ -7859,11 +7864,14 @@ cmdSetvcpu(vshControl *ctl, const vshCmd *cmd) =20 VSH_EXCLUSIVE_OPTIONS("current", "live"); VSH_EXCLUSIVE_OPTIONS("current", "config"); + VSH_EXCLUSIVE_OPTIONS("async", "enable"); =20 if (config) flags |=3D VIR_DOMAIN_AFFECT_CONFIG; if (live) flags |=3D VIR_DOMAIN_AFFECT_LIVE; + if (async) + flags |=3D VIR_DOMAIN_SETVCPU_ASYNC_UNPLUG; =20 if (!(enable || disable)) { vshError(ctl, "%s", _("one of --enable, --disable is required")); --=20 2.47.3