From nobody Wed Jun 24 21:40:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1782322721; cv=none; d=zohomail.com; s=zohoarc; b=KrD4wSMWdo5b0diyfpkmbyvLH6xxWFkUGYWMwPpAgUMdxC2CF+KEKiChXEAgOZe2+U2HZHGD+I2e2ea/F/crUX6YoItIQ3TJsGsrzMWRJ9ZZyXqVPWw2CXcb00QxtU78Dz0VBGDvb2oLpCShtPVARsHSe3/RKhA51enNBGrn1Qw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782322721; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=KWv0AFS6POOSyCIyV3Q3fvptDrIZo0x11ZHDyj4bUHQ=; b=RpG5D5+rkzYG6uIsyGFeOT8QKgmkRix6vOAv1El1jDigAx+/lU/i3OX/lZXVg94eQHTYHH1afI7+y1Fj3FcUXgHVru+mcsHY78+9ppNHwT4VPAGjV+fw+V+JCA3zhRuvvi491rMJdYTDs6pJxOpBk1Oa0CobZChvufCleksln2Q= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782322721257379.93004012824144; Wed, 24 Jun 2026 10:38:41 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcRYF-0006su-7R; Wed, 24 Jun 2026 13:38:15 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRYE-0006sS-55 for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:38:14 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRY8-0004OG-1O for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:38:11 -0400 Received: from mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-578-xCoiew67Oi-VxuuSg-1h7Q-1; Wed, 24 Jun 2026 13:38:04 -0400 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id AC4C61800603; Wed, 24 Jun 2026 17:38:02 +0000 (UTC) Received: from berrange.com (unknown [10.44.32.102]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 2EEDA180034F; Wed, 24 Jun 2026 17:37:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1782322685; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=KWv0AFS6POOSyCIyV3Q3fvptDrIZo0x11ZHDyj4bUHQ=; b=hEciLB3KxYJSEzLgWlFKjjXj6VucjZYa6iDeXResRX4z/aj1wIhlnqs5XD/bs+V5fiuezF AJKiIQq9efDlJVVfDyjRdMEz6aWOYdS4lltbsIXYXqxtjtSDkuGesBAigTAlzyDzlSDV21 3qml7FmcfoD/iirkM9YF0lGNLOwoa2I= X-MC-Unique: xCoiew67Oi-VxuuSg-1h7Q-1 X-Mimecast-MFC-AGG-ID: xCoiew67Oi-VxuuSg-1h7Q_1782322683 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: qemu-devel@nongnu.org Cc: devel@lists.libvirt.org, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Markus Armbruster , Paolo Bonzini , "Dr. David Alan Gilbert" , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Brauner , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Peter Krempa Subject: [PATCH v5 01/35] qom: replace 'can_be_deleted' with 'prepare_delete' Date: Wed, 24 Jun 2026 18:37:17 +0100 Message-ID: <20260624173752.2928717-2-berrange@redhat.com> In-Reply-To: <20260624173752.2928717-1-berrange@redhat.com> References: <20260624173752.2928717-1-berrange@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -24 X-Spam_score: -2.5 X-Spam_bar: -- X-Spam_report: (-2.5 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.445, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1782322723615158500 While most objects can perform all their cleanup in the finalizer method, there can be interactions with other resources / subsystems / threads which require that some cleanup be performed on an user creatable object before unparenting it and entering finalization. The current 'can_be_deleted' method runs in the deletion path and is intended to be used to block deletion. While it could be used to perform cleanup tasks, its name suggests it should be free of side-effects. Generalize this by renaming it to 'prepare_delete', explicitly allowing for cleanup to be provided. Existing users of 'can_be_deleted' are re-written, which provides them with more detailed/tailored error messages. Reviewed-by: Marc-Andr=C3=A9 Lureau Tested-by: Peter Krempa Signed-off-by: Daniel P. Berrang=C3=A9 --- backends/cryptodev.c | 10 +++++++--- backends/hostmem.c | 5 +++-- backends/iommufd.c | 10 +++++++--- block/throttle-groups.c | 10 +++++++--- event-loop-base.c | 8 ++++---- include/qom/object_interfaces.h | 26 +++++++++++++++++--------- include/system/event-loop-base.h | 2 +- net/can/can_core.c | 5 +++-- qom/object_interfaces.c | 14 ++++++-------- tests/qemu-iotests/245 | 4 ++-- util/main-loop.c | 5 +++-- 11 files changed, 60 insertions(+), 39 deletions(-) diff --git a/backends/cryptodev.c b/backends/cryptodev.c index 79f8882d3b..90110dc633 100644 --- a/backends/cryptodev.c +++ b/backends/cryptodev.c @@ -454,9 +454,13 @@ bool cryptodev_backend_is_ready(CryptoDevBackend *back= end) } =20 static bool -cryptodev_backend_can_be_deleted(UserCreatable *uc) +cryptodev_backend_prepare_delete(UserCreatable *uc, Error **errp) { - return !cryptodev_backend_is_used(CRYPTODEV_BACKEND(uc)); + if (cryptodev_backend_is_used(CRYPTODEV_BACKEND(uc))) { + error_setg(errp, "Cryptodev backend is still in use"); + return false; + } + return true; } =20 static void cryptodev_backend_instance_init(Object *obj) @@ -613,7 +617,7 @@ cryptodev_backend_class_init(ObjectClass *oc, const voi= d *data) UserCreatableClass *ucc =3D USER_CREATABLE_CLASS(oc); =20 ucc->complete =3D cryptodev_backend_complete; - ucc->can_be_deleted =3D cryptodev_backend_can_be_deleted; + ucc->prepare_delete =3D cryptodev_backend_prepare_delete; =20 QTAILQ_INIT(&crypto_clients); object_class_property_add(oc, "queues", "uint32", diff --git a/backends/hostmem.c b/backends/hostmem.c index cd2085fb3c..eb915c64bc 100644 --- a/backends/hostmem.c +++ b/backends/hostmem.c @@ -434,9 +434,10 @@ host_memory_backend_memory_complete(UserCreatable *uc,= Error **errp) } =20 static bool -host_memory_backend_can_be_deleted(UserCreatable *uc) +host_memory_backend_prepare_delete(UserCreatable *uc, Error **errp) { if (host_memory_backend_is_mapped(MEMORY_BACKEND(uc))) { + error_setg(errp, "Host memory backend is still mapped"); return false; } else { return true; @@ -508,7 +509,7 @@ host_memory_backend_class_init(ObjectClass *oc, const v= oid *data) UserCreatableClass *ucc =3D USER_CREATABLE_CLASS(oc); =20 ucc->complete =3D host_memory_backend_memory_complete; - ucc->can_be_deleted =3D host_memory_backend_can_be_deleted; + ucc->prepare_delete =3D host_memory_backend_prepare_delete; =20 object_class_property_add_bool(oc, "merge", host_memory_backend_get_merge, diff --git a/backends/iommufd.c b/backends/iommufd.c index 09624cd652..7af49f6de3 100644 --- a/backends/iommufd.c +++ b/backends/iommufd.c @@ -63,11 +63,15 @@ static void iommufd_backend_set_fd(Object *obj, const c= har *str, Error **errp) trace_iommu_backend_set_fd(be->fd); } =20 -static bool iommufd_backend_can_be_deleted(UserCreatable *uc) +static bool iommufd_backend_prepare_delete(UserCreatable *uc, Error **errp) { IOMMUFDBackend *be =3D IOMMUFD_BACKEND(uc); =20 - return !be->users; + if (be->users) { + error_setg(errp, "IOMMUFD backend still has %d users", be->users); + return false; + } + return true; } =20 static void iommufd_backend_complete(UserCreatable *uc, Error **errp) @@ -92,7 +96,7 @@ static void iommufd_backend_class_init(ObjectClass *oc, c= onst void *data) { UserCreatableClass *ucc =3D USER_CREATABLE_CLASS(oc); =20 - ucc->can_be_deleted =3D iommufd_backend_can_be_deleted; + ucc->prepare_delete =3D iommufd_backend_prepare_delete; ucc->complete =3D iommufd_backend_complete; =20 object_class_property_add_str(oc, "fd", NULL, iommufd_backend_set_fd); diff --git a/block/throttle-groups.c b/block/throttle-groups.c index 4b1b1944c2..7836fc4c76 100644 --- a/block/throttle-groups.c +++ b/block/throttle-groups.c @@ -960,9 +960,13 @@ static void throttle_group_get_limits(Object *obj, Vis= itor *v, visit_type_ThrottleLimits(v, name, &argp, errp); } =20 -static bool throttle_group_can_be_deleted(UserCreatable *uc) +static bool throttle_group_prepare_delete(UserCreatable *uc, Error **errp) { - return OBJECT(uc)->ref =3D=3D 1; + if (OBJECT(uc)->ref > 1) { + error_setg(errp, "Throttle group still has multiple references"); + return false; + } + return true; } =20 static void throttle_group_obj_class_init(ObjectClass *klass, @@ -972,7 +976,7 @@ static void throttle_group_obj_class_init(ObjectClass *= klass, UserCreatableClass *ucc =3D USER_CREATABLE_CLASS(klass); =20 ucc->complete =3D throttle_group_obj_complete; - ucc->can_be_deleted =3D throttle_group_can_be_deleted; + ucc->prepare_delete =3D throttle_group_prepare_delete; =20 /* individual properties */ for (i =3D 0; i < sizeof(properties) / sizeof(ThrottleParamInfo); i++)= { diff --git a/event-loop-base.c b/event-loop-base.c index 8ca143bea4..ee5987ddbf 100644 --- a/event-loop-base.c +++ b/event-loop-base.c @@ -85,13 +85,13 @@ static void event_loop_base_complete(UserCreatable *uc,= Error **errp) } } =20 -static bool event_loop_base_can_be_deleted(UserCreatable *uc) +static bool event_loop_base_prepare_delete(UserCreatable *uc, Error **errp) { EventLoopBaseClass *bc =3D EVENT_LOOP_BASE_GET_CLASS(uc); EventLoopBase *backend =3D EVENT_LOOP_BASE(uc); =20 - if (bc->can_be_deleted) { - return bc->can_be_deleted(backend); + if (bc->prepare_delete) { + return bc->prepare_delete(backend, errp); } =20 return true; @@ -102,7 +102,7 @@ static void event_loop_base_class_init(ObjectClass *kla= ss, { UserCreatableClass *ucc =3D USER_CREATABLE_CLASS(klass); ucc->complete =3D event_loop_base_complete; - ucc->can_be_deleted =3D event_loop_base_can_be_deleted; + ucc->prepare_delete =3D event_loop_base_prepare_delete; =20 object_class_property_add(klass, "aio-max-batch", "int", event_loop_base_get_param, diff --git a/include/qom/object_interfaces.h b/include/qom/object_interface= s.h index e2b8615617..afd0fb93b2 100644 --- a/include/qom/object_interfaces.h +++ b/include/qom/object_interfaces.h @@ -20,8 +20,10 @@ typedef struct UserCreatable UserCreatable; * UserCreatableClass: * @parent_class: the base class * @complete: callback to be called after @obj's properties are set. - * @can_be_deleted: callback to be called before an object is removed - * to check if @obj can be removed safely. + * @prepare_delete: to be called before an attempt to delete @obj + * to validate whether the object can be deleted and trigger any + * cleanup of any resources which have to be dealt with before the + * object is unparented and enters finalization. * * Interface is designed to work with -object/object-add/object_add * commands. @@ -36,7 +38,9 @@ typedef struct UserCreatable UserCreatable; * For objects created without using -object/object-add/object_add, * @user_creatable_complete() wrapper should be called manually if * object's type implements USER_CREATABLE interface and needs - * complete() callback to be called. + * complete() callback to be called. Similarly @user_creatable_prepare_del= ete() + * should be called manually prior to an attempt to the delete the + * object. */ struct UserCreatableClass { /* */ @@ -44,7 +48,7 @@ struct UserCreatableClass { =20 /* */ void (*complete)(UserCreatable *uc, Error **errp); - bool (*can_be_deleted)(UserCreatable *uc); + bool (*prepare_delete)(UserCreatable *uc, Error **errp); }; =20 /** @@ -61,13 +65,17 @@ struct UserCreatableClass { bool user_creatable_complete(UserCreatable *uc, Error **errp); =20 /** - * user_creatable_can_be_deleted: - * @uc: the object whose can_be_deleted() method is called if implemented + * user_creatable_prepare_delete: + * @uc: the user-creatable object whose prepare_delete() method is called + * @errp: if an error occurs, a pointer to an area to store the error + * + * Wrapper to call prepare_delete() class method if defined, otherwise + * does nothing. * - * Wrapper to call can_be_deleted() method if one of types it's inherited - * from implements USER_CREATABLE interface. + * Returns: %true on success or if prepare_delete() is not defined, + * %false on failure. */ -bool user_creatable_can_be_deleted(UserCreatable *uc); +bool user_creatable_prepare_delete(UserCreatable *uc, Error **errp); =20 /** * user_creatable_add_qapi: diff --git a/include/system/event-loop-base.h b/include/system/event-loop-b= ase.h index 130629e7f3..1e1e427ac7 100644 --- a/include/system/event-loop-base.h +++ b/include/system/event-loop-base.h @@ -24,7 +24,7 @@ struct EventLoopBaseClass { =20 void (*init)(EventLoopBase *base, Error **errp); void (*update_params)(EventLoopBase *base, Error **errp); - bool (*can_be_deleted)(EventLoopBase *base); + bool (*prepare_delete)(EventLoopBase *base, Error **errp); }; =20 struct EventLoopBase { diff --git a/net/can/can_core.c b/net/can/can_core.c index 77fe2b8ba4..8df9375167 100644 --- a/net/can/can_core.c +++ b/net/can/can_core.c @@ -143,8 +143,9 @@ int can_bus_client_set_filters(CanBusClientState *clien= t, } =20 =20 -static bool can_bus_can_be_deleted(UserCreatable *uc) +static bool can_bus_prepare_delete(UserCreatable *uc, Error **errp) { + error_setg(errp, "Deleting can bus devices is not supported"); return false; } =20 @@ -153,7 +154,7 @@ static void can_bus_class_init(ObjectClass *klass, { UserCreatableClass *uc_klass =3D USER_CREATABLE_CLASS(klass); =20 - uc_klass->can_be_deleted =3D can_bus_can_be_deleted; + uc_klass->prepare_delete =3D can_bus_prepare_delete; } =20 static const TypeInfo can_bus_info =3D { diff --git a/qom/object_interfaces.c b/qom/object_interfaces.c index 7080f85f95..6faa0b2fd9 100644 --- a/qom/object_interfaces.c +++ b/qom/object_interfaces.c @@ -32,16 +32,15 @@ bool user_creatable_complete(UserCreatable *uc, Error *= *errp) return !*errp; } =20 -bool user_creatable_can_be_deleted(UserCreatable *uc) +bool user_creatable_prepare_delete(UserCreatable *uc, Error **errp) { - UserCreatableClass *ucc =3D USER_CREATABLE_GET_CLASS(uc); + ERRP_GUARD(); =20 - if (ucc->can_be_deleted) { - return ucc->can_be_deleted(uc); - } else { - return true; + if (ucc->prepare_delete) { + ucc->prepare_delete(uc, errp); } + return !*errp; } =20 void user_creatable_add_qapi(ObjectOptions *options, Error **errp) @@ -253,8 +252,7 @@ bool user_creatable_del(const char *id, Error **errp) return false; } =20 - if (!user_creatable_can_be_deleted(USER_CREATABLE(obj))) { - error_setg(errp, "object '%s' is in use, can not be deleted", id); + if (!user_creatable_prepare_delete(USER_CREATABLE(obj), errp)) { return false; } =20 diff --git a/tests/qemu-iotests/245 b/tests/qemu-iotests/245 index f96610f510..e161bcfda9 100755 --- a/tests/qemu-iotests/245 +++ b/tests/qemu-iotests/245 @@ -801,7 +801,7 @@ class TestBlockdevReopen(iotests.QMPTestCase): # Now group1 is in use, it cannot be deleted result =3D self.vm.qmp('object-del', id =3D 'group1') self.assert_qmp(result, 'error/class', 'GenericError') - self.assert_qmp(result, 'error/desc', "object 'group1' is in use, = can not be deleted") + self.assert_qmp(result, 'error/desc', "Throttle group still has mu= ltiple references") =20 # Default options, this switches the group back to group0 self.reopen(opts) @@ -809,7 +809,7 @@ class TestBlockdevReopen(iotests.QMPTestCase): # So now we cannot delete group0 result =3D self.vm.qmp('object-del', id =3D 'group0') self.assert_qmp(result, 'error/class', 'GenericError') - self.assert_qmp(result, 'error/desc', "object 'group0' is in use, = can not be deleted") + self.assert_qmp(result, 'error/desc', "Throttle group still has mu= ltiple references") =20 # But group1 is free this time, and it can be deleted self.vm.cmd('object-del', id =3D 'group1') diff --git a/util/main-loop.c b/util/main-loop.c index ad8645c30a..67ee06c311 100644 --- a/util/main-loop.c +++ b/util/main-loop.c @@ -218,8 +218,9 @@ static void main_loop_init(EventLoopBase *base, Error *= *errp) mloop =3D m; } =20 -static bool main_loop_can_be_deleted(EventLoopBase *base) +static bool main_loop_prepare_delete(EventLoopBase *base, Error **errp) { + error_setg(errp, "Deleting main loop is not supported"); return false; } =20 @@ -229,7 +230,7 @@ static void main_loop_class_init(ObjectClass *oc, const= void *class_data) =20 bc->init =3D main_loop_init; bc->update_params =3D main_loop_update_params; - bc->can_be_deleted =3D main_loop_can_be_deleted; + bc->prepare_delete =3D main_loop_prepare_delete; } =20 static const TypeInfo main_loop_info =3D { --=20 2.54.0 From nobody Wed Jun 24 21:40:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1782322721; cv=none; d=zohomail.com; s=zohoarc; b=VbZJ29N9pIdahHO3c9auhJbfMU9PPUmY24Q9VT8ompQLHTDt381ir2MvNHfjnAqmunjvKbx3s0C4H9TdgFtNlAVZkx4sSrEVOjQEoAc4+EjhBNRI2veCb/iUtyLik0/ng6UC8YZy05UkvzY+h9crBwMJh7BvfNQJ03jl8ZWXQj8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782322721; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=OxtZb6abe+q5EiDAoIPVc7Ud+AkOuC1LaLwH5PUEsSk=; b=YmcmrF14U2e/PKgKkJ3ro5Q7McVzf6xnLd/FjXKwJ6GI/wrdL6rb6MGtMCklbNi4/Pml+83nloIbfF+0nRZj2nDyNqus+5iPWhQS2aUOu3r37eKa9E2EkpgNrWKulvCw2XVB71sKOXCqqkmpACFEmHkEchgZ/pu1ZPfpT3dqpFk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782322721142222.07530113349242; Wed, 24 Jun 2026 10:38:41 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcRYJ-0006tO-Ji; Wed, 24 Jun 2026 13:38:19 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRYH-0006t1-OX for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:38:18 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRYC-0004P2-ID for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:38:15 -0400 Received: from mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-607-XzrjLWkTPQab4ZfTxjaVgg-1; Wed, 24 Jun 2026 13:38:08 -0400 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id F3B811800597; Wed, 24 Jun 2026 17:38:06 +0000 (UTC) Received: from berrange.com (unknown [10.44.32.102]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 37F3A180034F; Wed, 24 Jun 2026 17:38:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1782322690; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=OxtZb6abe+q5EiDAoIPVc7Ud+AkOuC1LaLwH5PUEsSk=; b=e1j5QpR5iMSkDabRCDfQvhKpVv5Ns3D5FKhceqPGWhuQ82ShMi8Va/XroWSel7zoG6L+1V 8WzWmJBKj1BPoEDsv2yShfPXqE41SC9GtQpusJKLReCwAenv+8EFw/mRV8U6BbHprjDVlg aWKp0bREpEUtA8oKkEAkH5tNcDl0jC0= X-MC-Unique: XzrjLWkTPQab4ZfTxjaVgg-1 X-Mimecast-MFC-AGG-ID: XzrjLWkTPQab4ZfTxjaVgg_1782322687 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: qemu-devel@nongnu.org Cc: devel@lists.libvirt.org, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Markus Armbruster , Paolo Bonzini , "Dr. David Alan Gilbert" , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Brauner , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Peter Krempa Subject: [PATCH v5 02/35] monitor: replace 'common' with 'parent_obj' in MonitorHMP Date: Wed, 24 Jun 2026 18:37:18 +0100 Message-ID: <20260624173752.2928717-3-berrange@redhat.com> In-Reply-To: <20260624173752.2928717-1-berrange@redhat.com> References: <20260624173752.2928717-1-berrange@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -24 X-Spam_score: -2.5 X-Spam_bar: -- X-Spam_report: (-2.5 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.445, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1782322723614158500 The field name 'parent_obj' is standard practice for QOM structs so align the HMP monitor. Reviewed-by: Marc-Andr=C3=A9 Lureau Reviewed-by: Dr. David Alan Gilbert Tested-by: Peter Krempa Signed-off-by: Daniel P. Berrang=C3=A9 --- monitor/hmp-cmds.c | 2 +- monitor/hmp.c | 43 ++++++++++++++++++++------------------ monitor/monitor-internal.h | 2 +- monitor/monitor.c | 6 +++--- monitor/qmp-cmds.c | 10 ++++----- ui/ui-hmp-cmds.c | 2 +- 6 files changed, 34 insertions(+), 31 deletions(-) diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c index 443b8c785d..e139caeba9 100644 --- a/monitor/hmp-cmds.c +++ b/monitor/hmp-cmds.c @@ -287,7 +287,7 @@ void hmp_info_sync_profile(Monitor *mon, const QDict *q= dict) =20 void hmp_info_history(Monitor *mon, const QDict *qdict) { - MonitorHMP *hmp_mon =3D container_of(mon, MonitorHMP, common); + MonitorHMP *hmp_mon =3D container_of(mon, MonitorHMP, parent_obj); int i; const char *str; =20 diff --git a/monitor/hmp.c b/monitor/hmp.c index cc4390486e..3dde52ddbe 100644 --- a/monitor/hmp.c +++ b/monitor/hmp.c @@ -48,9 +48,9 @@ static void monitor_command_cb(void *opaque, const char *= cmdline, { MonitorHMP *mon =3D opaque; =20 - monitor_suspend(&mon->common); + monitor_suspend(&mon->parent_obj); handle_hmp_command(mon, cmdline); - monitor_resume(&mon->common); + monitor_resume(&mon->parent_obj); } =20 void monitor_read_command(MonitorHMP *mon, int show_prompt) @@ -73,7 +73,7 @@ int monitor_read_password(MonitorHMP *mon, ReadLineFunc *= readline_func, /* prompt is printed on return from the command handler */ return 0; } else { - monitor_printf(&mon->common, + monitor_printf(&mon->parent_obj, "terminal does not support password prompting\n"); return -ENOTTY; } @@ -695,7 +695,7 @@ static const HMPCommand *monitor_parse_command(MonitorH= MP *hmp_mon, const char **cmdp, HMPCommand *table) { - Monitor *mon =3D &hmp_mon->common; + Monitor *mon =3D &hmp_mon->parent_obj; const char *p; const HMPCommand *cmd; char cmdname[256]; @@ -1188,35 +1188,37 @@ void handle_hmp_command(MonitorHMP *mon, const char= *cmdline) =20 if (!cmd->cmd && !cmd->cmd_info_hrt) { /* FIXME: is it useful to try autoload modules here ??? */ - monitor_printf(&mon->common, "Command \"%.*s\" is not available.\n= ", + monitor_printf(&mon->parent_obj, "Command \"%.*s\" is not availabl= e.\n", (int)(cmdline - cmd_start), cmd_start); return; } =20 - qdict =3D monitor_parse_arguments(&mon->common, &cmdline, cmd); + qdict =3D monitor_parse_arguments(&mon->parent_obj, &cmdline, cmd); if (!qdict) { while (cmdline > cmd_start && qemu_isspace(cmdline[-1])) { cmdline--; } - monitor_printf(&mon->common, "Try \"help %.*s\" for more informati= on\n", + monitor_printf(&mon->parent_obj, + "Try \"help %.*s\" for more information\n", (int)(cmdline - cmd_start), cmd_start); return; } =20 if (!cmd->coroutine) { /* old_mon is non-NULL when called from qmp_human_monitor_command(= ) */ - Monitor *old_mon =3D monitor_set_cur(qemu_coroutine_self(), &mon->= common); - handle_hmp_command_exec(&mon->common, cmd, qdict); + Monitor *old_mon =3D monitor_set_cur(qemu_coroutine_self(), + &mon->parent_obj); + handle_hmp_command_exec(&mon->parent_obj, cmd, qdict); monitor_set_cur(qemu_coroutine_self(), old_mon); } else { HandleHmpCommandCo data =3D { - .mon =3D &mon->common, + .mon =3D &mon->parent_obj, .cmd =3D cmd, .qdict =3D qdict, .done =3D false, }; Coroutine *co =3D qemu_coroutine_create(handle_hmp_command_co, &da= ta); - monitor_set_cur(co, &mon->common); + monitor_set_cur(co, &mon->parent_obj); aio_co_enter(qemu_get_aio_context(), co); AIO_WAIT_WHILE_UNLOCKED(NULL, !data.done); } @@ -1434,7 +1436,7 @@ cleanup: =20 static void monitor_read(void *opaque, const uint8_t *buf, int size) { - MonitorHMP *mon =3D container_of(opaque, MonitorHMP, common); + MonitorHMP *mon =3D container_of(opaque, MonitorHMP, parent_obj); int i; =20 if (mon->rs) { @@ -1443,7 +1445,7 @@ static void monitor_read(void *opaque, const uint8_t = *buf, int size) } } else { if (size =3D=3D 0 || buf[size - 1] !=3D 0) { - monitor_printf(&mon->common, "corrupted command\n"); + monitor_printf(&mon->parent_obj, "corrupted command\n"); } else { handle_hmp_command(mon, (char *)buf); } @@ -1512,26 +1514,26 @@ static void G_GNUC_PRINTF(2, 3) monitor_readline_pr= intf(void *opaque, MonitorHMP *mon =3D opaque; va_list ap; va_start(ap, fmt); - monitor_vprintf(&mon->common, fmt, ap); + monitor_vprintf(&mon->parent_obj, fmt, ap); va_end(ap); } =20 static void monitor_readline_flush(void *opaque) { MonitorHMP *mon =3D opaque; - monitor_flush(&mon->common); + monitor_flush(&mon->parent_obj); } =20 void monitor_init_hmp(Chardev *chr, bool use_readline, Error **errp) { MonitorHMP *mon =3D g_new0(MonitorHMP, 1); =20 - if (!qemu_chr_fe_init(&mon->common.chr, chr, errp)) { + if (!qemu_chr_fe_init(&mon->parent_obj.chr, chr, errp)) { g_free(mon); return; } =20 - monitor_data_init(&mon->common, false, false, false); + monitor_data_init(&mon->parent_obj, false, false, false); =20 mon->use_readline =3D use_readline; if (mon->use_readline) { @@ -1542,9 +1544,10 @@ void monitor_init_hmp(Chardev *chr, bool use_readlin= e, Error **errp) monitor_read_command(mon, 0); } =20 - qemu_chr_fe_set_handlers(&mon->common.chr, monitor_can_read, monitor_r= ead, - monitor_event, NULL, &mon->common, NULL, true= ); - monitor_list_append(&mon->common); + qemu_chr_fe_set_handlers(&mon->parent_obj.chr, + monitor_can_read, monitor_read, monitor_event, + NULL, &mon->parent_obj, NULL, true); + monitor_list_append(&mon->parent_obj); } =20 /** diff --git a/monitor/monitor-internal.h b/monitor/monitor-internal.h index a5c4aba306..eb301ea796 100644 --- a/monitor/monitor-internal.h +++ b/monitor/monitor-internal.h @@ -128,7 +128,7 @@ struct Monitor { }; =20 struct MonitorHMP { - Monitor common; + Monitor parent_obj; bool use_readline; /* * State used only in the thread "owning" the monitor. diff --git a/monitor/monitor.c b/monitor/monitor.c index 00b93ed612..2a1b511ff4 100644 --- a/monitor/monitor.c +++ b/monitor/monitor.c @@ -132,7 +132,7 @@ static inline bool monitor_is_hmp_non_interactive(const= Monitor *mon) return false; } =20 - return !monitor_uses_readline(container_of(mon, MonitorHMP, common)); + return !monitor_uses_readline(container_of(mon, MonitorHMP, parent_obj= )); } =20 static gboolean monitor_unblocked(void *do_not_use, GIOCondition cond, @@ -542,7 +542,7 @@ static void monitor_accept_input(void *opaque) =20 qemu_mutex_lock(&mon->mon_lock); if (!monitor_is_qmp(mon) && mon->reset_seen) { - MonitorHMP *hmp_mon =3D container_of(mon, MonitorHMP, common); + MonitorHMP *hmp_mon =3D container_of(mon, MonitorHMP, parent_obj); assert(hmp_mon->rs); readline_restart(hmp_mon->rs); qemu_mutex_unlock(&mon->mon_lock); @@ -627,7 +627,7 @@ void monitor_data_destroy(Monitor *mon) if (monitor_is_qmp(mon)) { monitor_data_destroy_qmp(container_of(mon, MonitorQMP, common)); } else { - readline_free(container_of(mon, MonitorHMP, common)->rs); + readline_free(container_of(mon, MonitorHMP, parent_obj)->rs); } g_string_free(mon->outbuf, true); qemu_mutex_destroy(&mon->mon_lock); diff --git a/monitor/qmp-cmds.c b/monitor/qmp-cmds.c index 0c409c27dc..aa9ee8a391 100644 --- a/monitor/qmp-cmds.c +++ b/monitor/qmp-cmds.c @@ -168,10 +168,10 @@ char *qmp_human_monitor_command(const char *command_l= ine, bool has_cpu_index, char *output =3D NULL; MonitorHMP hmp =3D {}; =20 - monitor_data_init(&hmp.common, false, true, false); + monitor_data_init(&hmp.parent_obj, false, true, false); =20 if (has_cpu_index) { - int ret =3D monitor_set_cpu(&hmp.common, cpu_index); + int ret =3D monitor_set_cpu(&hmp.parent_obj, cpu_index); if (ret < 0) { error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "cpu-index", "a CPU number"); @@ -181,12 +181,12 @@ char *qmp_human_monitor_command(const char *command_l= ine, bool has_cpu_index, =20 handle_hmp_command(&hmp, command_line); =20 - WITH_QEMU_LOCK_GUARD(&hmp.common.mon_lock) { - output =3D g_strdup(hmp.common.outbuf->str); + WITH_QEMU_LOCK_GUARD(&hmp.parent_obj.mon_lock) { + output =3D g_strdup(hmp.parent_obj.outbuf->str); } =20 out: - monitor_data_destroy(&hmp.common); + monitor_data_destroy(&hmp.parent_obj); return output; } =20 diff --git a/ui/ui-hmp-cmds.c b/ui/ui-hmp-cmds.c index ee3e731d07..06f4030ce4 100644 --- a/ui/ui-hmp-cmds.c +++ b/ui/ui-hmp-cmds.c @@ -343,7 +343,7 @@ void hmp_change_vnc(Monitor *mon, const char *device, c= onst char *target, return; } if (!arg) { - MonitorHMP *hmp_mon =3D container_of(mon, MonitorHMP, common); + MonitorHMP *hmp_mon =3D container_of(mon, MonitorHMP, parent_obj); monitor_read_password(hmp_mon, hmp_change_read_arg, NULL); } else { qmp_change_vnc_password(arg, errp); --=20 2.54.0 From nobody Wed Jun 24 21:40:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1782322751; cv=none; d=zohomail.com; s=zohoarc; b=QF+g2thTGyOKCzBB5k5l/J9jYMilV3ny5Qqt7BTxjdMb9YOHI/5meoVuLG8TMCQDe94OTzK5mgIiOe6HBFGcAwUcBGhNWPSWwVI32eYUgoyU7VVuk+S/mdQoA3JSRWh+HdDmguFpRS8JlNucj1vp2ZNdqBs8CIVVougAWXC6mjA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782322751; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=OXNWMeRn1wJuMp4RgzRmMFD9tBlu+Af3jZH9Pqb6ewo=; b=Bf2fy1xbCYo8CSz4InRyV3vMFhHTNlT0Yyrq5Mz6jwpV1kRxfj093pNE4xWToy8G2GDDr3BJ/qCeYnXkfeIC9YMbVy8JldNpdwhz1LMWbEFpjxnQZz8vi4IGKvpYs8PLrwR47Ii1I/924H7/+aIBej6+0akOzVL/eb/O3KUbwn8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782322751311203.98813223669993; Wed, 24 Jun 2026 10:39:11 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcRYh-00070Y-0M; Wed, 24 Jun 2026 13:38:43 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRYX-0006ts-Cr for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:38:34 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRYM-0004Qg-KO for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:38:24 -0400 Received: from mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-452-4vq59w_ROjmKcwNst_w2ug-1; Wed, 24 Jun 2026 13:38:15 -0400 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 199D018005AC; Wed, 24 Jun 2026 17:38:11 +0000 (UTC) Received: from berrange.com (unknown [10.44.32.102]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 7022F180034F; Wed, 24 Jun 2026 17:38:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1782322700; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=OXNWMeRn1wJuMp4RgzRmMFD9tBlu+Af3jZH9Pqb6ewo=; b=MFMIx1vwQZvbdlEuoy482PRp0aIYJn6plehg0uu49WvuiStM/aHtmLFrN8gAfhyH2pGOmB qcfG/BoDTLoBb1GlNy5kggDRg/rkFyTj9KNsxAT8qflMqJUft5QydTLt1Vh9L9cijs0bsk jrBVx2uehTd7xsuVqw/aBFHaMQ+RHxg= X-MC-Unique: 4vq59w_ROjmKcwNst_w2ug-1 X-Mimecast-MFC-AGG-ID: 4vq59w_ROjmKcwNst_w2ug_1782322691 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: qemu-devel@nongnu.org Cc: devel@lists.libvirt.org, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Markus Armbruster , Paolo Bonzini , "Dr. David Alan Gilbert" , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Brauner , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Peter Krempa Subject: [PATCH v5 03/35] monitor: replace 'common' with 'parent_obj' in MonitorQMP Date: Wed, 24 Jun 2026 18:37:19 +0100 Message-ID: <20260624173752.2928717-4-berrange@redhat.com> In-Reply-To: <20260624173752.2928717-1-berrange@redhat.com> References: <20260624173752.2928717-1-berrange@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -24 X-Spam_score: -2.5 X-Spam_bar: -- X-Spam_report: (-2.5 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.445, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1782322753288158501 The field name 'parent_obj' is standard practice for QOM structs so align the QMP monitor. Reviewed-by: Marc-Andr=C3=A9 Lureau Tested-by: Peter Krempa Signed-off-by: Daniel P. Berrang=C3=A9 --- monitor/monitor-internal.h | 2 +- monitor/monitor.c | 4 ++-- monitor/qmp-cmds-control.c | 4 ++-- monitor/qmp.c | 40 +++++++++++++++++++------------------- 4 files changed, 25 insertions(+), 25 deletions(-) diff --git a/monitor/monitor-internal.h b/monitor/monitor-internal.h index eb301ea796..4da2b2a677 100644 --- a/monitor/monitor-internal.h +++ b/monitor/monitor-internal.h @@ -141,7 +141,7 @@ struct MonitorHMP { }; =20 typedef struct { - Monitor common; + Monitor parent_obj; JSONMessageParser parser; bool pretty; /* diff --git a/monitor/monitor.c b/monitor/monitor.c index 2a1b511ff4..0b7b464ebe 100644 --- a/monitor/monitor.c +++ b/monitor/monitor.c @@ -308,7 +308,7 @@ static void monitor_qapi_event_emit(QAPIEvent event, QD= ict *qdict) continue; } =20 - qmp_mon =3D container_of(mon, MonitorQMP, common); + qmp_mon =3D container_of(mon, MonitorQMP, parent_obj); { QEMU_LOCK_GUARD(&mon->mon_lock); if (qmp_mon->commands =3D=3D &qmp_cap_negotiation_commands) { @@ -625,7 +625,7 @@ void monitor_data_destroy(Monitor *mon) g_free(mon->mon_cpu_path); qemu_chr_fe_deinit(&mon->chr, false); if (monitor_is_qmp(mon)) { - monitor_data_destroy_qmp(container_of(mon, MonitorQMP, common)); + monitor_data_destroy_qmp(container_of(mon, MonitorQMP, parent_obj)= ); } else { readline_free(container_of(mon, MonitorHMP, parent_obj)->rs); } diff --git a/monitor/qmp-cmds-control.c b/monitor/qmp-cmds-control.c index 150ca9f5cb..af6a2a118b 100644 --- a/monitor/qmp-cmds-control.c +++ b/monitor/qmp-cmds-control.c @@ -76,7 +76,7 @@ void qmp_qmp_capabilities(bool has_enable, QMPCapabilityL= ist *enable, MonitorQMP *mon; =20 assert(monitor_is_qmp(cur_mon)); - mon =3D container_of(cur_mon, MonitorQMP, common); + mon =3D container_of(cur_mon, MonitorQMP, parent_obj); =20 if (mon->commands =3D=3D &qmp_commands) { error_set(errp, ERROR_CLASS_COMMAND_NOT_FOUND, @@ -126,7 +126,7 @@ CommandInfoList *qmp_query_commands(Error **errp) MonitorQMP *mon; =20 assert(monitor_is_qmp(cur_mon)); - mon =3D container_of(cur_mon, MonitorQMP, common); + mon =3D container_of(cur_mon, MonitorQMP, parent_obj); =20 qmp_for_each_command(mon->commands, query_commands_cb, &list); =20 diff --git a/monitor/qmp.c b/monitor/qmp.c index 687019811f..27934206db 100644 --- a/monitor/qmp.c +++ b/monitor/qmp.c @@ -80,7 +80,7 @@ static void monitor_qmp_caps_reset(MonitorQMP *mon) { memset(mon->capab_offered, 0, sizeof(mon->capab_offered)); memset(mon->capab, 0, sizeof(mon->capab)); - mon->capab_offered[QMP_CAPABILITY_OOB] =3D mon->common.use_io_thread; + mon->capab_offered[QMP_CAPABILITY_OOB] =3D mon->parent_obj.use_io_thre= ad; } =20 static void qmp_request_free(QMPRequest *req) @@ -124,7 +124,7 @@ static void monitor_qmp_cleanup_queue_and_resume(Monito= rQMP *mon) * when we get here while the monitor is suspended. An * unfortunately timed CHR_EVENT_CLOSED can do the trick. */ - monitor_resume(&mon->common); + monitor_resume(&mon->parent_obj); } =20 } @@ -139,7 +139,7 @@ void qmp_send_response(MonitorQMP *mon, const QDict *rs= p) trace_monitor_qmp_respond(mon, json->str); =20 g_string_append_c(json, '\n'); - monitor_puts(&mon->common, json->str); + monitor_puts(&mon->parent_obj, json->str); =20 g_string_free(json, true); } @@ -166,7 +166,7 @@ static void monitor_qmp_dispatch(MonitorQMP *mon, QObje= ct *req) QDict *error; =20 rsp =3D qmp_dispatch(mon->commands, req, qmp_oob_enabled(mon), - &mon->common); + &mon->parent_obj); =20 if (mon->commands =3D=3D &qmp_cap_negotiation_commands) { error =3D qdict_get_qdict(rsp, "error"); @@ -207,7 +207,7 @@ static QMPRequest *monitor_qmp_requests_pop_any_with_lo= ck(void) continue; } =20 - qmp_mon =3D container_of(mon, MonitorQMP, common); + qmp_mon =3D container_of(mon, MonitorQMP, parent_obj); qemu_mutex_lock(&qmp_mon->qmp_queue_lock); req_obj =3D g_queue_pop_head(qmp_mon->qmp_requests); if (req_obj) { @@ -302,7 +302,7 @@ void coroutine_fn monitor_qmp_dispatcher_co(void *data) oob_enabled =3D qmp_oob_enabled(mon); if (oob_enabled && mon->qmp_requests->length =3D=3D QMP_REQ_QUEUE_LEN_MAX - 1)= { - monitor_resume(&mon->common); + monitor_resume(&mon->parent_obj); } =20 /* @@ -343,7 +343,7 @@ void coroutine_fn monitor_qmp_dispatcher_co(void *data) } =20 if (!oob_enabled) { - monitor_resume(&mon->common); + monitor_resume(&mon->parent_obj); } =20 qmp_request_free(req_obj); @@ -408,7 +408,7 @@ static void handle_qmp_command(void *opaque, QObject *r= eq, Error *err) */ if (!qmp_oob_enabled(mon) || mon->qmp_requests->length =3D=3D QMP_REQ_QUEUE_LEN_MAX - 1) { - monitor_suspend(&mon->common); + monitor_suspend(&mon->parent_obj); } =20 /* @@ -462,7 +462,7 @@ static void monitor_qmp_event(void *opaque, QEMUChrEven= t event) =20 switch (event) { case CHR_EVENT_OPENED: - WITH_QEMU_LOCK_GUARD(&mon->common.mon_lock) { + WITH_QEMU_LOCK_GUARD(&mon->parent_obj.mon_lock) { mon->commands =3D &qmp_cap_negotiation_commands; monitor_qmp_caps_reset(mon); } @@ -504,27 +504,27 @@ static void monitor_qmp_setup_handlers_bh(void *opaqu= e) MonitorQMP *mon =3D opaque; GMainContext *context; =20 - assert(mon->common.use_io_thread); + assert(mon->parent_obj.use_io_thread); context =3D iothread_get_g_main_context(mon_iothread); assert(context); - qemu_chr_fe_set_handlers(&mon->common.chr, monitor_can_read, + qemu_chr_fe_set_handlers(&mon->parent_obj.chr, monitor_can_read, monitor_qmp_read, monitor_qmp_event, - NULL, &mon->common, context, true); - monitor_list_append(&mon->common); + NULL, &mon->parent_obj, context, true); + monitor_list_append(&mon->parent_obj); } =20 void monitor_init_qmp(Chardev *chr, bool pretty, Error **errp) { MonitorQMP *mon =3D g_new0(MonitorQMP, 1); =20 - if (!qemu_chr_fe_init(&mon->common.chr, chr, errp)) { + if (!qemu_chr_fe_init(&mon->parent_obj.chr, chr, errp)) { g_free(mon); return; } - qemu_chr_fe_set_echo(&mon->common.chr, true); + qemu_chr_fe_set_echo(&mon->parent_obj.chr, true); =20 /* Note: we run QMP monitor in I/O thread when @chr supports that */ - monitor_data_init(&mon->common, true, false, + monitor_data_init(&mon->parent_obj, true, false, qemu_chr_has_feature(chr, QEMU_CHAR_FEATURE_GCONTEXT= )); =20 mon->pretty =3D pretty; @@ -533,7 +533,7 @@ void monitor_init_qmp(Chardev *chr, bool pretty, Error = **errp) mon->qmp_requests =3D g_queue_new(); =20 json_message_parser_init(&mon->parser, handle_qmp_command, mon, NULL); - if (mon->common.use_io_thread) { + if (mon->parent_obj.use_io_thread) { /* * Make sure the old iowatch is gone. It's possible when * e.g. the chardev is in client mode, with wait=3Don. @@ -553,9 +553,9 @@ void monitor_init_qmp(Chardev *chr, bool pretty, Error = **errp) monitor_qmp_setup_handlers_bh, mon); /* The bottom half will add @mon to @mon_list */ } else { - qemu_chr_fe_set_handlers(&mon->common.chr, monitor_can_read, + qemu_chr_fe_set_handlers(&mon->parent_obj.chr, monitor_can_read, monitor_qmp_read, monitor_qmp_event, - NULL, &mon->common, NULL, true); - monitor_list_append(&mon->common); + NULL, &mon->parent_obj, NULL, true); + monitor_list_append(&mon->parent_obj); } } --=20 2.54.0 From nobody Wed Jun 24 21:40:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1782322733; cv=none; d=zohomail.com; s=zohoarc; b=laaUgMLuCs741xXnhkqeOXWS0b/S275eZOqntAK+rcF4Y+ens4PvkLftA+bPkolVP88un3N8zitIqVBsc5MgcbRaT+RfsV2M6A8R3ibdDm0PTijJpPtay/53mqGYdC7q7nS2V2KlN1C5sr1yN4g/RKV5/VulovfwSkjbvJyZRHc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782322733; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=zYJ32fYkLPuQ0paJx89mqs7x5CqMWVtRETYpDm4/uTE=; b=bTjoNsPmsCEnNDF4zSwUV1B4Z5P/tm5Xs5zFKoeruFM1k4A1bPjOUxLLdboRUtODetoF2mjF+v4meXiba6bvEkEGtBQINYxuJze3bh3p5BWklsB6W2yH/TKxcoj8BqmUX39Xg1jNkVU7SS7O3QnS2s3HX5aQzIHf9mDqTSGqVoU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782322733648154.305903040874; Wed, 24 Jun 2026 10:38:53 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcRYc-0006tt-EP; Wed, 24 Jun 2026 13:38:38 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRYV-0006tk-KO for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:38:31 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRYL-0004Qk-93 for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:38:23 -0400 Received: from mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-301-JykogP54MYazDiNtI4DBgA-1; Wed, 24 Jun 2026 13:38:17 -0400 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 623F41956047; Wed, 24 Jun 2026 17:38:15 +0000 (UTC) Received: from berrange.com (unknown [10.44.32.102]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id A04C0180028B; Wed, 24 Jun 2026 17:38:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1782322700; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=zYJ32fYkLPuQ0paJx89mqs7x5CqMWVtRETYpDm4/uTE=; b=gm6wJt9LpROarP1VpYpYIDzR/0xE4zjOba3ZQmsCBAj8OvmQn0rM4RiN4GBK2FpQ/+Is8y USzQxIxhjuCNvrTrSkNu/pGhQOFqs3M9U/h9R2tNNlXkk7lfApTKM60lyTKPMOhCPvXkAX +CCLTyUwbEh5jdZE93i+QbBQBmyc0sk= X-MC-Unique: JykogP54MYazDiNtI4DBgA-1 X-Mimecast-MFC-AGG-ID: JykogP54MYazDiNtI4DBgA_1782322695 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: qemu-devel@nongnu.org Cc: devel@lists.libvirt.org, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Markus Armbruster , Paolo Bonzini , "Dr. David Alan Gilbert" , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Brauner , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Peter Krempa Subject: [PATCH v5 04/35] monitor: rename monitor_init* to monitor_new* Date: Wed, 24 Jun 2026 18:37:20 +0100 Message-ID: <20260624173752.2928717-5-berrange@redhat.com> In-Reply-To: <20260624173752.2928717-1-berrange@redhat.com> References: <20260624173752.2928717-1-berrange@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: 8 X-Spam_score: 0.8 X-Spam_bar: / X-Spam_report: (0.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.445, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_SBL_CSS=3.335, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1782322734913158500 The current "monitor_init" functions will clash with the methods of the same name that are required by QOM. To ease the transition to QOM, rename them out of the way. Reviewed-by: Marc-Andr=C3=A9 Lureau Reviewed-by: Dr. David Alan Gilbert Tested-by: Peter Krempa Signed-off-by: Daniel P. Berrang=C3=A9 --- chardev/char.c | 2 +- gdbstub/system.c | 2 +- include/monitor/monitor.h | 8 ++++---- monitor/hmp.c | 2 +- monitor/monitor.c | 10 +++++----- monitor/qmp.c | 2 +- storage-daemon/qemu-storage-daemon.c | 2 +- stubs/monitor-internal.c | 2 +- system/vl.c | 2 +- 9 files changed, 16 insertions(+), 16 deletions(-) diff --git a/chardev/char.c b/chardev/char.c index ca8b37ed8d..813c04d953 100644 --- a/chardev/char.c +++ b/chardev/char.c @@ -805,7 +805,7 @@ static Chardev *qemu_chr_new_from_name(const char *labe= l, const char *filename, =20 if (qemu_opt_get_bool(opts, "mux", 0)) { assert(permit_mux_mon); - monitor_init_hmp(chr, true, &err); + monitor_new_hmp(chr, true, &err); if (err) { error_report_err(err); object_unparent(OBJECT(chr)); diff --git a/gdbstub/system.c b/gdbstub/system.c index 2063b63b2f..18f6a62b2e 100644 --- a/gdbstub/system.c +++ b/gdbstub/system.c @@ -389,7 +389,7 @@ bool gdbserver_start(const char *device, Error **errp) /* Initialize a monitor terminal for gdb */ mon_chr =3D qemu_chardev_new(NULL, TYPE_CHARDEV_GDB, NULL, NULL, &error_abort); - monitor_init_hmp(mon_chr, false, &error_abort); + monitor_new_hmp(mon_chr, false, &error_abort); } else { qemu_chr_fe_deinit(&gdbserver_system_state.chr, true); mon_chr =3D gdbserver_system_state.mon_chr; diff --git a/include/monitor/monitor.h b/include/monitor/monitor.h index 55649a8664..b9642b58ba 100644 --- a/include/monitor/monitor.h +++ b/include/monitor/monitor.h @@ -19,10 +19,10 @@ bool monitor_cur_is_qmp(void); =20 void monitor_init_globals(void); void monitor_init_globals_core(void); -void monitor_init_qmp(Chardev *chr, bool pretty, Error **errp); -void monitor_init_hmp(Chardev *chr, bool use_readline, Error **errp); -int monitor_init(MonitorOptions *opts, bool allow_hmp, Error **errp); -int monitor_init_opts(QemuOpts *opts, Error **errp); +void monitor_new_qmp(Chardev *chr, bool pretty, Error **errp); +void monitor_new_hmp(Chardev *chr, bool use_readline, Error **errp); +int monitor_new(MonitorOptions *opts, bool allow_hmp, Error **errp); +int monitor_new_opts(QemuOpts *opts, Error **errp); void monitor_cleanup(void); =20 int monitor_suspend(Monitor *mon); diff --git a/monitor/hmp.c b/monitor/hmp.c index 3dde52ddbe..4e4468424a 100644 --- a/monitor/hmp.c +++ b/monitor/hmp.c @@ -1524,7 +1524,7 @@ static void monitor_readline_flush(void *opaque) monitor_flush(&mon->parent_obj); } =20 -void monitor_init_hmp(Chardev *chr, bool use_readline, Error **errp) +void monitor_new_hmp(Chardev *chr, bool use_readline, Error **errp) { MonitorHMP *mon =3D g_new0(MonitorHMP, 1); =20 diff --git a/monitor/monitor.c b/monitor/monitor.c index 0b7b464ebe..a87597e606 100644 --- a/monitor/monitor.c +++ b/monitor/monitor.c @@ -715,7 +715,7 @@ void monitor_init_globals(void) aio_co_schedule(iohandler_get_aio_context(), qmp_dispatcher_co); } =20 -int monitor_init(MonitorOptions *opts, bool allow_hmp, Error **errp) +int monitor_new(MonitorOptions *opts, bool allow_hmp, Error **errp) { ERRP_GUARD(); Chardev *chr; @@ -732,7 +732,7 @@ int monitor_init(MonitorOptions *opts, bool allow_hmp, = Error **errp) =20 switch (opts->mode) { case MONITOR_MODE_CONTROL: - monitor_init_qmp(chr, opts->pretty, errp); + monitor_new_qmp(chr, opts->pretty, errp); break; case MONITOR_MODE_READLINE: if (!allow_hmp) { @@ -743,7 +743,7 @@ int monitor_init(MonitorOptions *opts, bool allow_hmp, = Error **errp) error_setg(errp, "'pretty' is not compatible with HMP monitors= "); return -1; } - monitor_init_hmp(chr, true, errp); + monitor_new_hmp(chr, true, errp); break; default: g_assert_not_reached(); @@ -752,7 +752,7 @@ int monitor_init(MonitorOptions *opts, bool allow_hmp, = Error **errp) return *errp ? -1 : 0; } =20 -int monitor_init_opts(QemuOpts *opts, Error **errp) +int monitor_new_opts(QemuOpts *opts, Error **errp) { Visitor *v; MonitorOptions *options; @@ -765,7 +765,7 @@ int monitor_init_opts(QemuOpts *opts, Error **errp) return -1; } =20 - ret =3D monitor_init(options, true, errp); + ret =3D monitor_new(options, true, errp); qapi_free_MonitorOptions(options); return ret; } diff --git a/monitor/qmp.c b/monitor/qmp.c index 27934206db..cb28a95efd 100644 --- a/monitor/qmp.c +++ b/monitor/qmp.c @@ -513,7 +513,7 @@ static void monitor_qmp_setup_handlers_bh(void *opaque) monitor_list_append(&mon->parent_obj); } =20 -void monitor_init_qmp(Chardev *chr, bool pretty, Error **errp) +void monitor_new_qmp(Chardev *chr, bool pretty, Error **errp) { MonitorQMP *mon =3D g_new0(MonitorQMP, 1); =20 diff --git a/storage-daemon/qemu-storage-daemon.c b/storage-daemon/qemu-sto= rage-daemon.c index eb72561358..50dbfbd97a 100644 --- a/storage-daemon/qemu-storage-daemon.c +++ b/storage-daemon/qemu-storage-daemon.c @@ -330,7 +330,7 @@ static void process_options(int argc, char *argv[], boo= l pre_init_pass) visit_free(v); =20 /* TODO Catch duplicate monitor IDs */ - monitor_init(monitor, false, &error_fatal); + monitor_new(monitor, false, &error_fatal); qapi_free_MonitorOptions(monitor); break; } diff --git a/stubs/monitor-internal.c b/stubs/monitor-internal.c index 4fece49d53..23d58da184 100644 --- a/stubs/monitor-internal.c +++ b/stubs/monitor-internal.c @@ -8,6 +8,6 @@ int monitor_get_fd(Monitor *mon, const char *name, Error **= errp) return -1; } =20 -void monitor_init_hmp(Chardev *chr, bool use_readline, Error **errp) +void monitor_new_hmp(Chardev *chr, bool use_readline, Error **errp) { } diff --git a/system/vl.c b/system/vl.c index 1c0da7df29..fb36140aac 100644 --- a/system/vl.c +++ b/system/vl.c @@ -1247,7 +1247,7 @@ static int fsdev_init_func(void *opaque, QemuOpts *op= ts, Error **errp) =20 static int mon_init_func(void *opaque, QemuOpts *opts, Error **errp) { - return monitor_init_opts(opts, errp); + return monitor_new_opts(opts, errp); } =20 static void monitor_parse(const char *str, const char *mode, bool pretty) --=20 2.54.0 From nobody Wed Jun 24 21:40:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1782322899; cv=none; d=zohomail.com; s=zohoarc; b=WKKNHRcPU/7g1KpNpxe4wgg8XVmpnzgcfS3F6RBUHdj9OQcn20MSVDH50Uce4pIU99gKpLLpmsek0hszt3tsAZ8Q3d4OJKr66KHPvDHnWjNZPlej3JPKXg7h8MUlAIEWSVZNUM2xXSD6zHCiIAYYb8aE3ZvO0QEVArqZvp+EDqM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782322899; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=e4m9gprU/aTCy4ce6IzOXltgS6Oq/eTRIyMo+pW9hpw=; b=eIuNbiUQsan6/+9oM/rc0JHPHbnbT5rT9y0mUzqMavaMfx5ZuDa+HbY1TC1oyfL896v/sRHwHdWLXpZbyS0jEKLSdWd1q+U2xFEFA7wWGbrIWAUJduxW4c0kAklGrx2Htsw1TT1M/JZWi0FuDw2s8ueX5qm9rcil6QKWN74POGw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782322899903455.4444971100912; Wed, 24 Jun 2026 10:41:39 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcRYi-00072j-TG; Wed, 24 Jun 2026 13:38:44 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRYf-0006zK-AO for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:38:41 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRYV-0004RC-AB for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:38:36 -0400 Received: from mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-424-DEtvYUrcPOCfUAn9e3HiRw-1; Wed, 24 Jun 2026 13:38:20 -0400 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 6F2F41955EB7; Wed, 24 Jun 2026 17:38:19 +0000 (UTC) Received: from berrange.com (unknown [10.44.32.102]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id D1676180028B; Wed, 24 Jun 2026 17:38:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1782322704; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=e4m9gprU/aTCy4ce6IzOXltgS6Oq/eTRIyMo+pW9hpw=; b=e2aJKAj3xlO86rqoy89ut4+trM5xoxEAv49OZ9K11hCNxuKQhtn3bP5CHOj1V1ADWJIXUF DmARF/blNd8Cdweo4sLk1xdAFLq7N++1LB6PkQtiItIqlvBfFVrc7MRJsRkQ8NinOM7iZo YiABd1XfXoF5I4GCqNQXtI3XnWBfLTw= X-MC-Unique: DEtvYUrcPOCfUAn9e3HiRw-1 X-Mimecast-MFC-AGG-ID: DEtvYUrcPOCfUAn9e3HiRw_1782322699 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: qemu-devel@nongnu.org Cc: devel@lists.libvirt.org, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Markus Armbruster , Paolo Bonzini , "Dr. David Alan Gilbert" , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Brauner , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Peter Krempa Subject: [PATCH v5 05/35] monitor: minimal conversion of monitors to QOM Date: Wed, 24 Jun 2026 18:37:21 +0100 Message-ID: <20260624173752.2928717-6-berrange@redhat.com> In-Reply-To: <20260624173752.2928717-1-berrange@redhat.com> References: <20260624173752.2928717-1-berrange@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: 8 X-Spam_score: 0.8 X-Spam_bar: / X-Spam_report: (0.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.445, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_SBL_CSS=3.335, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1782322901878158500 This introduces a Monitor QOM object, with MonitorHMP and MonitorQMP subclasses. This is the bare minimum conversion of just the type declarations and replacing g_new/g_free with object_new/object_unref. Reviewed-by: Marc-Andr=C3=A9 Lureau Tested-by: Peter Krempa Signed-off-by: Daniel P. Berrang=C3=A9 --- include/monitor/monitor.h | 11 ++++++++++- monitor/hmp.c | 29 +++++++++++++++++++++++++++-- monitor/monitor-internal.h | 18 ++++++++++++++++-- monitor/monitor.c | 18 ++++++++++++++++-- monitor/qmp-cmds.c | 15 ++++++++------- monitor/qmp.c | 29 +++++++++++++++++++++++++++-- 6 files changed, 104 insertions(+), 16 deletions(-) diff --git a/include/monitor/monitor.h b/include/monitor/monitor.h index b9642b58ba..2e9f9e12e9 100644 --- a/include/monitor/monitor.h +++ b/include/monitor/monitor.h @@ -5,8 +5,17 @@ #include "qapi/qapi-types-misc.h" #include "qemu/readline.h" #include "exec/hwaddr.h" +#include "qom/object.h" + +#define TYPE_MONITOR "monitor" +OBJECT_DECLARE_TYPE(Monitor, MonitorClass, MONITOR); + +#define TYPE_MONITOR_HMP "monitor-hmp" +OBJECT_DECLARE_TYPE(MonitorHMP, MonitorHMPClass, MONITOR_HMP); + +#define TYPE_MONITOR_QMP "monitor-qmp" +OBJECT_DECLARE_TYPE(MonitorQMP, MonitorQMPClass, MONITOR_QMP); =20 -typedef struct MonitorHMP MonitorHMP; typedef struct MonitorOptions MonitorOptions; =20 #define QMP_REQ_QUEUE_LEN_MAX 8 diff --git a/monitor/hmp.c b/monitor/hmp.c index 4e4468424a..81047d2513 100644 --- a/monitor/hmp.c +++ b/monitor/hmp.c @@ -43,6 +43,20 @@ #include "system/block-backend.h" #include "trace.h" =20 +OBJECT_DEFINE_TYPE(MonitorHMP, monitor_hmp, MONITOR_HMP, MONITOR); + +static void monitor_hmp_finalize(Object *obj) +{ +} + +static void monitor_hmp_class_init(ObjectClass *cls, const void *data) +{ +} + +static void monitor_hmp_init(Object *obj) +{ +} + static void monitor_command_cb(void *opaque, const char *cmdline, void *readline_opaque) { @@ -1526,10 +1540,21 @@ static void monitor_readline_flush(void *opaque) =20 void monitor_new_hmp(Chardev *chr, bool use_readline, Error **errp) { - MonitorHMP *mon =3D g_new0(MonitorHMP, 1); + MonitorHMP *mon; + static int counter; + g_autofree char *id =3D g_strdup_printf("hmpcompat%d", counter++); + Object *obj =3D object_new_with_props(TYPE_MONITOR_HMP, + object_get_objects_root(), + id, + errp, + NULL); + if (!obj) { + return; + } + mon =3D MONITOR_HMP(obj); =20 if (!qemu_chr_fe_init(&mon->parent_obj.chr, chr, errp)) { - g_free(mon); + object_unparent(OBJECT(mon)); return; } =20 diff --git a/monitor/monitor-internal.h b/monitor/monitor-internal.h index 4da2b2a677..05c1f2f5e0 100644 --- a/monitor/monitor-internal.h +++ b/monitor/monitor-internal.h @@ -101,7 +101,13 @@ typedef struct HMPCommand { bool coroutine; } HMPCommand; =20 + +struct MonitorClass { + ObjectClass parent_class; +}; + struct Monitor { + Object parent; CharFrontend chr; int suspend_cnt; /* Needs to be accessed atomically */ bool is_qmp; @@ -127,6 +133,10 @@ struct Monitor { int reset_seen; }; =20 +struct MonitorHMPClass { + MonitorClass parent_class; +}; + struct MonitorHMP { Monitor parent_obj; bool use_readline; @@ -140,7 +150,11 @@ struct MonitorHMP { ReadLineState *rs; }; =20 -typedef struct { +struct MonitorQMPClass { + MonitorClass parent_class; +}; + +struct MonitorQMP { Monitor parent_obj; JSONMessageParser parser; bool pretty; @@ -160,7 +174,7 @@ typedef struct { QemuMutex qmp_queue_lock; /* Input queue that holds all the parsed QMP requests */ GQueue *qmp_requests; -} MonitorQMP; +}; =20 /** * Is @mon a QMP monitor? diff --git a/monitor/monitor.c b/monitor/monitor.c index a87597e606..a497c25c54 100644 --- a/monitor/monitor.c +++ b/monitor/monitor.c @@ -73,6 +73,20 @@ static GHashTable *coroutine_mon; /* Maps Coroutine* to = Monitor* */ MonitorList mon_list; static bool monitor_destroyed; =20 +OBJECT_DEFINE_TYPE(Monitor, monitor, MONITOR, OBJECT); + +static void monitor_finalize(Object *obj) +{ +} + +static void monitor_class_init(ObjectClass *cls, const void *data) +{ +} + +static void monitor_init(Object *obj) +{ +} + Monitor *monitor_cur(void) { Monitor *mon; @@ -598,7 +612,7 @@ void monitor_list_append(Monitor *mon) =20 if (mon) { monitor_data_destroy(mon); - g_free(mon); + object_unparent(OBJECT(mon)); } } =20 @@ -680,7 +694,7 @@ void monitor_cleanup(void) monitor_flush(mon); monitor_data_destroy(mon); qemu_mutex_lock(&monitor_lock); - g_free(mon); + object_unparent(OBJECT(mon)); } qemu_mutex_unlock(&monitor_lock); =20 diff --git a/monitor/qmp-cmds.c b/monitor/qmp-cmds.c index aa9ee8a391..bfde769ef0 100644 --- a/monitor/qmp-cmds.c +++ b/monitor/qmp-cmds.c @@ -166,12 +166,12 @@ char *qmp_human_monitor_command(const char *command_l= ine, bool has_cpu_index, int64_t cpu_index, Error **errp) { char *output =3D NULL; - MonitorHMP hmp =3D {}; + MonitorHMP *hmp =3D MONITOR_HMP(object_new(TYPE_MONITOR_HMP)); =20 - monitor_data_init(&hmp.parent_obj, false, true, false); + monitor_data_init(&hmp->parent_obj, false, true, false); =20 if (has_cpu_index) { - int ret =3D monitor_set_cpu(&hmp.parent_obj, cpu_index); + int ret =3D monitor_set_cpu(&hmp->parent_obj, cpu_index); if (ret < 0) { error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "cpu-index", "a CPU number"); @@ -179,14 +179,15 @@ char *qmp_human_monitor_command(const char *command_l= ine, bool has_cpu_index, } } =20 - handle_hmp_command(&hmp, command_line); + handle_hmp_command(hmp, command_line); =20 - WITH_QEMU_LOCK_GUARD(&hmp.parent_obj.mon_lock) { - output =3D g_strdup(hmp.parent_obj.outbuf->str); + WITH_QEMU_LOCK_GUARD(&hmp->parent_obj.mon_lock) { + output =3D g_strdup(hmp->parent_obj.outbuf->str); } =20 out: - monitor_data_destroy(&hmp.parent_obj); + monitor_data_destroy(&hmp->parent_obj); + object_unref(hmp); return output; } =20 diff --git a/monitor/qmp.c b/monitor/qmp.c index cb28a95efd..5231ed506a 100644 --- a/monitor/qmp.c +++ b/monitor/qmp.c @@ -71,6 +71,20 @@ typedef struct QMPRequest QMPRequest; =20 QmpCommandList qmp_commands, qmp_cap_negotiation_commands; =20 +OBJECT_DEFINE_TYPE(MonitorQMP, monitor_qmp, MONITOR_QMP, MONITOR); + +static void monitor_qmp_finalize(Object *obj) +{ +} + +static void monitor_qmp_class_init(ObjectClass *cls, const void *data) +{ +} + +static void monitor_qmp_init(Object *obj) +{ +} + static bool qmp_oob_enabled(MonitorQMP *mon) { return mon->capab[QMP_CAPABILITY_OOB]; @@ -515,10 +529,21 @@ static void monitor_qmp_setup_handlers_bh(void *opaqu= e) =20 void monitor_new_qmp(Chardev *chr, bool pretty, Error **errp) { - MonitorQMP *mon =3D g_new0(MonitorQMP, 1); + MonitorQMP *mon; + static int counter; + g_autofree char *id =3D g_strdup_printf("qmpcompat%d", counter++); + Object *obj =3D object_new_with_props(TYPE_MONITOR_QMP, + object_get_objects_root(), + id, + errp, + NULL); + if (!obj) { + return; + } + mon =3D MONITOR_QMP(obj); =20 if (!qemu_chr_fe_init(&mon->parent_obj.chr, chr, errp)) { - g_free(mon); + object_unparent(OBJECT(mon)); return; } qemu_chr_fe_set_echo(&mon->parent_obj.chr, true); --=20 2.54.0 From nobody Wed Jun 24 21:40:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1782322796; cv=none; d=zohomail.com; s=zohoarc; b=OQlM9bg1UOZBTmB255VCxreuIVHrprxrZXCZtVh/CEFBbA/e2BbCI10Yhb9GVkT0K3mFbIh1x6iY/wnePIXNQe+CThB49nXx0VUN7dGacHySJCYYUZiiiAKA1QujlZQulcMmOVQPoGvRkyaqxdFr9jtbnsE28E+w2skx94uXUms= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782322796; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=a7DEUV4gOurmQ+GNwu1/L41DzLmQhorMuodf5WMDgDY=; b=AU5gGAnwhIBqNDDgOaAUZOzEiilUmsJHlKM4w5jzsHVBxSfDNquKo5tLmNpiYrQ01FHuOKrG1KLfVtBNFaMNyjcKXFET13nWSS+o+Df25Q5lZcXrDyB1P3K2Qj38HdUqNl/PGudgT+FCjLJLsXBX+zoPM+a/HDtED7GupYjxSTQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782322796550196.2219966583457; Wed, 24 Jun 2026 10:39:56 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcRYk-00074A-4Z; Wed, 24 Jun 2026 13:38:46 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRYg-00070j-NM for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:38:42 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRYX-0004Rc-6C for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:38:38 -0400 Received: from mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-484-KBzu1t8xMg2Ew1wKYU-UGw-1; Wed, 24 Jun 2026 13:38:24 -0400 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 3AF631955EB3; Wed, 24 Jun 2026 17:38:23 +0000 (UTC) Received: from berrange.com (unknown [10.44.32.102]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id DF4FA180028B; Wed, 24 Jun 2026 17:38:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1782322709; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=a7DEUV4gOurmQ+GNwu1/L41DzLmQhorMuodf5WMDgDY=; b=cb7d+BTG7pGyBczNo5bCjOUBa9VToDaYr2EeMjFoqxcQUmsjKfhsH492hp+OnWVDc1+Wzc C3n9Wo/wXIulvUm1px3OBw22s52+e0L4mHW9tqYiV3dLLWnSMeK9D6001dDiY8I3/urOzn 1fO5+gYxGJz2vsUH3BEk+4URBnPs6DM= X-MC-Unique: KBzu1t8xMg2Ew1wKYU-UGw-1 X-Mimecast-MFC-AGG-ID: KBzu1t8xMg2Ew1wKYU-UGw_1782322703 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: qemu-devel@nongnu.org Cc: devel@lists.libvirt.org, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Markus Armbruster , Paolo Bonzini , "Dr. David Alan Gilbert" , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Brauner , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Peter Krempa Subject: [PATCH v5 06/35] monitor: add 'chardev' property to Monitor base class Date: Wed, 24 Jun 2026 18:37:22 +0100 Message-ID: <20260624173752.2928717-7-berrange@redhat.com> In-Reply-To: <20260624173752.2928717-1-berrange@redhat.com> References: <20260624173752.2928717-1-berrange@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: 8 X-Spam_score: 0.8 X-Spam_bar: / X-Spam_report: (0.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.445, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_SBL_CSS=3.335, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1782322797358158500 This is associates both QMP and HMP monitors with a character device backend. Reviewed-by: Marc-Andr=C3=A9 Lureau Tested-by: Peter Krempa Signed-off-by: Daniel P. Berrang=C3=A9 --- chardev/char.c | 3 ++- gdbstub/system.c | 4 ++-- include/monitor/monitor.h | 4 ++-- monitor/hmp.c | 10 ++++++-- monitor/monitor-internal.h | 2 ++ monitor/monitor.c | 47 ++++++++++++++++++++++++++++++-------- monitor/qmp.c | 18 ++++++++++----- stubs/monitor-internal.c | 2 +- 8 files changed, 67 insertions(+), 23 deletions(-) diff --git a/chardev/char.c b/chardev/char.c index 813c04d953..981fbb1aaa 100644 --- a/chardev/char.c +++ b/chardev/char.c @@ -804,8 +804,9 @@ static Chardev *qemu_chr_new_from_name(const char *labe= l, const char *filename, } =20 if (qemu_opt_get_bool(opts, "mux", 0)) { + const char *chardev_id =3D qemu_opts_id(opts); assert(permit_mux_mon); - monitor_new_hmp(chr, true, &err); + monitor_new_hmp(chardev_id, true, &err); if (err) { error_report_err(err); object_unparent(OBJECT(chr)); diff --git a/gdbstub/system.c b/gdbstub/system.c index 18f6a62b2e..80175e7fa2 100644 --- a/gdbstub/system.c +++ b/gdbstub/system.c @@ -387,9 +387,9 @@ bool gdbserver_start(const char *device, Error **errp) qemu_add_vm_change_state_handler(gdb_vm_state_change, NULL); =20 /* Initialize a monitor terminal for gdb */ - mon_chr =3D qemu_chardev_new(NULL, TYPE_CHARDEV_GDB, + mon_chr =3D qemu_chardev_new("gdbchrdev0", TYPE_CHARDEV_GDB, NULL, NULL, &error_abort); - monitor_new_hmp(mon_chr, false, &error_abort); + monitor_new_hmp("gdbchrdev0", false, &error_abort); } else { qemu_chr_fe_deinit(&gdbserver_system_state.chr, true); mon_chr =3D gdbserver_system_state.mon_chr; diff --git a/include/monitor/monitor.h b/include/monitor/monitor.h index 2e9f9e12e9..a135b3a590 100644 --- a/include/monitor/monitor.h +++ b/include/monitor/monitor.h @@ -28,8 +28,8 @@ bool monitor_cur_is_qmp(void); =20 void monitor_init_globals(void); void monitor_init_globals_core(void); -void monitor_new_qmp(Chardev *chr, bool pretty, Error **errp); -void monitor_new_hmp(Chardev *chr, bool use_readline, Error **errp); +void monitor_new_qmp(const char *chardev_id, bool pretty, Error **errp); +void monitor_new_hmp(const char *chardev_id, bool use_readline, Error **er= rp); int monitor_new(MonitorOptions *opts, bool allow_hmp, Error **errp); int monitor_new_opts(QemuOpts *opts, Error **errp); void monitor_cleanup(void); diff --git a/monitor/hmp.c b/monitor/hmp.c index 81047d2513..4ab81b5904 100644 --- a/monitor/hmp.c +++ b/monitor/hmp.c @@ -23,6 +23,7 @@ */ =20 #include "qemu/osdep.h" +#include "qapi/error.h" #include #include "hw/core/qdev.h" #include "hw/core/sysemu-cpu-ops.h" @@ -1538,8 +1539,9 @@ static void monitor_readline_flush(void *opaque) monitor_flush(&mon->parent_obj); } =20 -void monitor_new_hmp(Chardev *chr, bool use_readline, Error **errp) +void monitor_new_hmp(const char *chardev_id, bool use_readline, Error **er= rp) { + ERRP_GUARD(); MonitorHMP *mon; static int counter; g_autofree char *id =3D g_strdup_printf("hmpcompat%d", counter++); @@ -1547,13 +1549,17 @@ void monitor_new_hmp(Chardev *chr, bool use_readlin= e, Error **errp) object_get_objects_root(), id, errp, + "chardev", chardev_id, NULL); + if (!obj) { return; } + mon =3D MONITOR_HMP(obj); =20 - if (!qemu_chr_fe_init(&mon->parent_obj.chr, chr, errp)) { + monitor_complete(MONITOR(mon), errp); + if (*errp) { object_unparent(OBJECT(mon)); return; } diff --git a/monitor/monitor-internal.h b/monitor/monitor-internal.h index 05c1f2f5e0..145d52fd71 100644 --- a/monitor/monitor-internal.h +++ b/monitor/monitor-internal.h @@ -108,6 +108,7 @@ struct MonitorClass { =20 struct Monitor { Object parent; + char *chardev_id; CharFrontend chr; int suspend_cnt; /* Needs to be accessed atomically */ bool is_qmp; @@ -192,6 +193,7 @@ extern QmpCommandList qmp_commands, qmp_cap_negotiation= _commands; extern QemuMutex monitor_lock; extern MonitorList mon_list; =20 +void monitor_complete(Monitor *mon, Error **errp); void monitor_data_init(Monitor *mon, bool is_qmp, bool skip_flush, bool use_io_thread); void monitor_data_destroy(Monitor *mon); diff --git a/monitor/monitor.c b/monitor/monitor.c index a497c25c54..747ca27fd5 100644 --- a/monitor/monitor.c +++ b/monitor/monitor.c @@ -77,10 +77,31 @@ OBJECT_DEFINE_TYPE(Monitor, monitor, MONITOR, OBJECT); =20 static void monitor_finalize(Object *obj) { + Monitor *mon =3D MONITOR(obj); + + g_free(mon->chardev_id); +} + +static char *monitor_get_chardev_id(Object *obj, Error **errp) +{ + Monitor *mon =3D MONITOR(obj); + + return g_strdup(mon->chardev_id); +} + +static void monitor_set_chardev_id(Object *obj, const char *str, Error **e= rrp) +{ + Monitor *mon =3D MONITOR(obj); + + g_free(mon->chardev_id); + mon->chardev_id =3D g_strdup(str); } =20 static void monitor_class_init(ObjectClass *cls, const void *data) { + object_class_property_add_str(cls, "chardev", + monitor_get_chardev_id, + monitor_set_chardev_id); } =20 static void monitor_init(Object *obj) @@ -729,16 +750,24 @@ void monitor_init_globals(void) aio_co_schedule(iohandler_get_aio_context(), qmp_dispatcher_co); } =20 -int monitor_new(MonitorOptions *opts, bool allow_hmp, Error **errp) +void monitor_complete(Monitor *mon, Error **errp) { - ERRP_GUARD(); - Chardev *chr; + if (mon->chardev_id) { + Chardev *chr =3D qemu_chr_find(mon->chardev_id); + if (chr =3D=3D NULL) { + error_setg(errp, "chardev \"%s\" not found", mon->chardev_id); + return; + } =20 - chr =3D qemu_chr_find(opts->chardev); - if (chr =3D=3D NULL) { - error_setg(errp, "chardev \"%s\" not found", opts->chardev); - return -1; + if (!qemu_chr_fe_init(&mon->chr, chr, errp)) { + return; + } } +} + +int monitor_new(MonitorOptions *opts, bool allow_hmp, Error **errp) +{ + ERRP_GUARD(); =20 if (!opts->has_mode) { opts->mode =3D allow_hmp ? MONITOR_MODE_READLINE : MONITOR_MODE_CO= NTROL; @@ -746,7 +775,7 @@ int monitor_new(MonitorOptions *opts, bool allow_hmp, E= rror **errp) =20 switch (opts->mode) { case MONITOR_MODE_CONTROL: - monitor_new_qmp(chr, opts->pretty, errp); + monitor_new_qmp(opts->chardev, opts->pretty, errp); break; case MONITOR_MODE_READLINE: if (!allow_hmp) { @@ -757,7 +786,7 @@ int monitor_new(MonitorOptions *opts, bool allow_hmp, E= rror **errp) error_setg(errp, "'pretty' is not compatible with HMP monitors= "); return -1; } - monitor_new_hmp(chr, true, errp); + monitor_new_hmp(opts->chardev, true, errp); break; default: g_assert_not_reached(); diff --git a/monitor/qmp.c b/monitor/qmp.c index 5231ed506a..0abf2677f9 100644 --- a/monitor/qmp.c +++ b/monitor/qmp.c @@ -527,8 +527,9 @@ static void monitor_qmp_setup_handlers_bh(void *opaque) monitor_list_append(&mon->parent_obj); } =20 -void monitor_new_qmp(Chardev *chr, bool pretty, Error **errp) +void monitor_new_qmp(const char *chardev_id, bool pretty, Error **errp) { + ERRP_GUARD(); MonitorQMP *mon; static int counter; g_autofree char *id =3D g_strdup_printf("qmpcompat%d", counter++); @@ -536,21 +537,26 @@ void monitor_new_qmp(Chardev *chr, bool pretty, Error= **errp) object_get_objects_root(), id, errp, + "chardev", chardev_id, NULL); + if (!obj) { return; } - mon =3D MONITOR_QMP(obj); =20 - if (!qemu_chr_fe_init(&mon->parent_obj.chr, chr, errp)) { + mon =3D MONITOR_QMP(obj); + monitor_complete(MONITOR(mon), errp); + if (*errp) { object_unparent(OBJECT(mon)); return; } + qemu_chr_fe_set_echo(&mon->parent_obj.chr, true); =20 /* Note: we run QMP monitor in I/O thread when @chr supports that */ monitor_data_init(&mon->parent_obj, true, false, - qemu_chr_has_feature(chr, QEMU_CHAR_FEATURE_GCONTEXT= )); + qemu_chr_has_feature(mon->parent_obj.chr.chr, + QEMU_CHAR_FEATURE_GCONTEXT)); =20 mon->pretty =3D pretty; =20 @@ -563,12 +569,12 @@ void monitor_new_qmp(Chardev *chr, bool pretty, Error= **errp) * Make sure the old iowatch is gone. It's possible when * e.g. the chardev is in client mode, with wait=3Don. */ - remove_fd_in_watch(chr); + remove_fd_in_watch(mon->parent_obj.chr.chr); /* * Clean up listener IO sources early to prevent racy fd * handling between the main thread and the I/O thread. */ - remove_listener_fd_in_watch(chr); + remove_listener_fd_in_watch(mon->parent_obj.chr.chr); /* * We can't call qemu_chr_fe_set_handlers() directly here * since chardev might be running in the monitor I/O diff --git a/stubs/monitor-internal.c b/stubs/monitor-internal.c index 23d58da184..51db7588b9 100644 --- a/stubs/monitor-internal.c +++ b/stubs/monitor-internal.c @@ -8,6 +8,6 @@ int monitor_get_fd(Monitor *mon, const char *name, Error **= errp) return -1; } =20 -void monitor_new_hmp(Chardev *chr, bool use_readline, Error **errp) +void monitor_new_hmp(const char *chardev_id, bool use_readline, Error **er= rp) { } --=20 2.54.0 From nobody Wed Jun 24 21:40:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1782322788; cv=none; d=zohomail.com; s=zohoarc; b=S+wWb2/ulTAVEUPw8+gze15DTZVQs2Y+FSbMtKG4e0QmwA9A8dq60umOtvi+5TSIoFAmr6MnC91MvFI0XL0BRTfsw08FY6uqnSf6PWmhRIb0ItRU/eXZS7/CaTY4UtppH+TLqm4UhffAq/H7s9B6FR85vAaTMkdERUKLv/l9rWA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782322788; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=w70jiRK0B35xqZ52IBYiay1rKxV48E/XHct+5x3csOE=; b=GtAIkHZaVNNzGbe7SIiY9a/Hs2FGx/rybKU3ICoRtxGrKIrA965ILcAfX5W0zDBuqBQLpKlw0NG+Ta1QhzNXCXnBIke62jsUZU7yKgzZNid8gcAXY/xEe9I4TyfvcxALadDrPlgw6v1NA7CvFNqEBJ5eDr1GdJ9r7L8M+xBWYuo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782322788231825.5864156937389; Wed, 24 Jun 2026 10:39:48 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcRYk-000746-3L; Wed, 24 Jun 2026 13:38:46 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRYg-00070i-N3 for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:38:42 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRYY-0004Ro-St for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:38:37 -0400 Received: from mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-638-hynlOBviMc2Mu0qpmumlag-1; Wed, 24 Jun 2026 13:38:29 -0400 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 8F6B81805A06; Wed, 24 Jun 2026 17:38:27 +0000 (UTC) Received: from berrange.com (unknown [10.44.32.102]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id EBD7E180034F; Wed, 24 Jun 2026 17:38:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1782322710; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=w70jiRK0B35xqZ52IBYiay1rKxV48E/XHct+5x3csOE=; b=IidjGczqZY/W5LHPLMT7i7XY05QfWRvFkhDslg8CtJTKd3HCro8k4mTGwyW+SFK6KwEE/3 EsO6BcRQZozcsOc4d8KkBki229XTB0FrRUvaKP9mJt4KZviNNdLgd4jZBNLb9vfL/RSofP xG1a4gW3+yPT78TRWBZXA7aibjTW7u0= X-MC-Unique: hynlOBviMc2Mu0qpmumlag-1 X-Mimecast-MFC-AGG-ID: hynlOBviMc2Mu0qpmumlag_1782322707 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: qemu-devel@nongnu.org Cc: devel@lists.libvirt.org, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Markus Armbruster , Paolo Bonzini , "Dr. David Alan Gilbert" , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Brauner , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Peter Krempa Subject: [PATCH v5 07/35] monitor: add 'readline' property to HMP Monitor class Date: Wed, 24 Jun 2026 18:37:23 +0100 Message-ID: <20260624173752.2928717-8-berrange@redhat.com> In-Reply-To: <20260624173752.2928717-1-berrange@redhat.com> References: <20260624173752.2928717-1-berrange@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -24 X-Spam_score: -2.5 X-Spam_bar: -- X-Spam_report: (-2.5 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.445, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1782322789049158500 This determines whether a human monitor runs with readline for interactive use, or without readline for non-interactive use by the GDB stub. Reviewed-by: Marc-Andr=C3=A9 Lureau Tested-by: Peter Krempa Signed-off-by: Daniel P. Berrang=C3=A9 --- monitor/hmp.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/monitor/hmp.c b/monitor/hmp.c index 4ab81b5904..d5905e2279 100644 --- a/monitor/hmp.c +++ b/monitor/hmp.c @@ -50,12 +50,37 @@ static void monitor_hmp_finalize(Object *obj) { } =20 +static bool monitor_hmp_get_readline(Object *obj, Error **errp) +{ + MonitorHMP *mon =3D MONITOR_HMP(obj); + + return mon->use_readline; +} + +static void monitor_hmp_set_readline(Object *obj, bool val, Error **errp) +{ + MonitorHMP *mon =3D MONITOR_HMP(obj); + + mon->use_readline =3D val; +} + static void monitor_hmp_class_init(ObjectClass *cls, const void *data) { + object_class_property_add_bool(cls, "readline", + monitor_hmp_get_readline, + monitor_hmp_set_readline); } =20 static void monitor_hmp_init(Object *obj) { + MonitorHMP *hmp =3D MONITOR_HMP(obj); + + /* + * Default to common case for external HMP use, + * as opposed to non-interactive internal use + * from gdbstub + */ + hmp->use_readline =3D true; } =20 static void monitor_command_cb(void *opaque, const char *cmdline, @@ -1550,6 +1575,7 @@ void monitor_new_hmp(const char *chardev_id, bool use= _readline, Error **errp) id, errp, "chardev", chardev_id, + "readline", use_readline ? "yes" := "no", NULL); =20 if (!obj) { @@ -1566,7 +1592,6 @@ void monitor_new_hmp(const char *chardev_id, bool use= _readline, Error **errp) =20 monitor_data_init(&mon->parent_obj, false, false, false); =20 - mon->use_readline =3D use_readline; if (mon->use_readline) { mon->rs =3D readline_init(monitor_readline_printf, monitor_readline_flush, --=20 2.54.0 From nobody Wed Jun 24 21:40:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1782322796; cv=none; d=zohomail.com; s=zohoarc; b=XLWchFnnf2bVtQ9c+puWmevAFk99ivaGHvE3nzKEg9F/hJT18+9RkU2a5Q9/JKfZ9xM3ClIa8qDpA/UvTfNgWVh1XzvwnWGS+zltGb0zWdYBoVF6/1AOoYkNbdfvbuG3iQG3lqTb5r7Yh7QXWOb1eLBwC5A1glFYSOS0HjrSWWE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782322796; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=ezohllC5Ih/htDofQ0Y1tPBXbOVdg9FZE9a0AtuxZP0=; b=QU3zAMOO6r24Nb1BZOWLDqgla474B7sgvQHeDFZPv6yyxkjUTBVGvjFq5clznXGKTgfVPbrkxUmX+uv3Cv19AI0ARu1rkLVUgKUFu0S1d9P62q9JTPCLsmJEfM/uIKj4BmBf338ja1OU2p1SxYBS/P3qoU2zxrBiw3E7vvZSkn4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782322796173971.3646562886819; Wed, 24 Jun 2026 10:39:56 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcRYm-00074Y-3z; Wed, 24 Jun 2026 13:38:48 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRYi-00072r-RZ for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:38:44 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRYa-0004SL-MD for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:38:41 -0400 Received: from mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-587-kJ343L45NpKdoRD3Ww4PhA-1; Wed, 24 Jun 2026 13:38:33 -0400 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 9063D1956094; Wed, 24 Jun 2026 17:38:31 +0000 (UTC) Received: from berrange.com (unknown [10.44.32.102]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 2FF37180028B; Wed, 24 Jun 2026 17:38:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1782322715; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ezohllC5Ih/htDofQ0Y1tPBXbOVdg9FZE9a0AtuxZP0=; b=E2if+zdrdT8Y16J8pJgec/K4F2NQqnbnR25LtHaYp2bGO+Juiv6kgPBAn7YS8WMld6nLWU cTriOYmKbIjqPw9TkyYGnRGJCbO9Ysmc52lxIzsKOn0tkcXx34w7wIxdQaWRtxv4XINDnM RY5/dqq1458iyM6GQxZH27t6C2tYVIA= X-MC-Unique: kJ343L45NpKdoRD3Ww4PhA-1 X-Mimecast-MFC-AGG-ID: kJ343L45NpKdoRD3Ww4PhA_1782322712 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: qemu-devel@nongnu.org Cc: devel@lists.libvirt.org, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Markus Armbruster , Paolo Bonzini , "Dr. David Alan Gilbert" , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Brauner , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Peter Krempa Subject: [PATCH v5 08/35] monitor: add 'pretty' property to QMP Monitor class Date: Wed, 24 Jun 2026 18:37:24 +0100 Message-ID: <20260624173752.2928717-9-berrange@redhat.com> In-Reply-To: <20260624173752.2928717-1-berrange@redhat.com> References: <20260624173752.2928717-1-berrange@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: 8 X-Spam_score: 0.8 X-Spam_bar: / X-Spam_report: (0.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.445, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_SBL_CSS=3.335, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1782322797237158500 This determines whether the QMP JSON responses are pretty printed with newlines and indentation, or compact with no extra whitespace. Reviewed-by: Marc-Andr=C3=A9 Lureau Tested-by: Peter Krempa Signed-off-by: Daniel P. Berrang=C3=A9 --- monitor/qmp.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/monitor/qmp.c b/monitor/qmp.c index 0abf2677f9..2a8532ef96 100644 --- a/monitor/qmp.c +++ b/monitor/qmp.c @@ -77,8 +77,25 @@ static void monitor_qmp_finalize(Object *obj) { } =20 +static bool monitor_qmp_get_pretty(Object *obj, Error **errp) +{ + MonitorQMP *mon =3D MONITOR_QMP(obj); + + return mon->pretty; +} + +static void monitor_qmp_set_pretty(Object *obj, bool val, Error **errp) +{ + MonitorQMP *mon =3D MONITOR_QMP(obj); + + mon->pretty =3D val; +} + static void monitor_qmp_class_init(ObjectClass *cls, const void *data) { + object_class_property_add_bool(cls, "pretty", + monitor_qmp_get_pretty, + monitor_qmp_set_pretty); } =20 static void monitor_qmp_init(Object *obj) @@ -538,6 +555,7 @@ void monitor_new_qmp(const char *chardev_id, bool prett= y, Error **errp) id, errp, "chardev", chardev_id, + "pretty", pretty ? "yes" : "no", NULL); =20 if (!obj) { @@ -558,8 +576,6 @@ void monitor_new_qmp(const char *chardev_id, bool prett= y, Error **errp) qemu_chr_has_feature(mon->parent_obj.chr.chr, QEMU_CHAR_FEATURE_GCONTEXT)); =20 - mon->pretty =3D pretty; - qemu_mutex_init(&mon->qmp_queue_lock); mon->qmp_requests =3D g_queue_new(); =20 --=20 2.54.0 From nobody Wed Jun 24 21:40:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1782322783; cv=none; d=zohomail.com; s=zohoarc; b=OqXznzDUFY9mT9//HY54X5WtV+IfW85b8sXvLMO9UksVBxYpxfjaq1483buFe733jyiBqsDUNcI8ZAjFCvvJ2QJmfAV/Dr2L+EW/LvUjZDTBzJnbNsngns9kOxANwn8feHOnz6fwk2XT4k6P4EaL/rtCPzNMyNC5N1xeONL3ar8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782322783; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=mNCRpmQPe4ziQs6Lc02SmjnfxERAf1/R3dRNUarE0J4=; b=BEbwBFw3xyMxHM1Hc5wIM9b/YpbX/wjRrr381K5c0a5OZtprXffnleDtDE4uJyJDeTimvubti50SVxytgQOPh1hmwiai293u7158p1afMHtgG9RdzkhwtoU9pbAiPLTxF1qxca4yi7//vWN9crkSrZtrruXgAJeaH1gkZXR1oD4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 17823227835011017.8341344050292; Wed, 24 Jun 2026 10:39:43 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcRYm-00074X-3U; Wed, 24 Jun 2026 13:38:48 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRYi-00072w-T4 for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:38:44 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRYe-0004Sk-H1 for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:38:42 -0400 Received: from mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-672-2qaQZ45DNrKIJGIOi4KYNQ-1; Wed, 24 Jun 2026 13:38:36 -0400 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 7E2F31955E91; Wed, 24 Jun 2026 17:38:35 +0000 (UTC) Received: from berrange.com (unknown [10.44.32.102]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 10818180034F; Wed, 24 Jun 2026 17:38:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1782322718; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=mNCRpmQPe4ziQs6Lc02SmjnfxERAf1/R3dRNUarE0J4=; b=avKJwHN0V807xWE/8XOGxAkbVxlj+3UKi6vK/UNAsLVgV3M6qH26kbhsUi85LJGdmHxXdR GVJER1pk4h9DLzbwU/j0zufCmuZG9mHQGik8U/1yv+iL6X3V7Mh5c9QMvZkXQlC2FZWsmW v/ZASHs2X0AiAdIXdeYB+wA9x35yJTw= X-MC-Unique: 2qaQZ45DNrKIJGIOi4KYNQ-1 X-Mimecast-MFC-AGG-ID: 2qaQZ45DNrKIJGIOi4KYNQ_1782322715 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: qemu-devel@nongnu.org Cc: devel@lists.libvirt.org, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Markus Armbruster , Paolo Bonzini , "Dr. David Alan Gilbert" , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Brauner , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Peter Krempa Subject: [PATCH v5 09/35] monitor: remove 'skip_flush' field Date: Wed, 24 Jun 2026 18:37:25 +0100 Message-ID: <20260624173752.2928717-10-berrange@redhat.com> In-Reply-To: <20260624173752.2928717-1-berrange@redhat.com> References: <20260624173752.2928717-1-berrange@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: 8 X-Spam_score: 0.8 X-Spam_bar: / X-Spam_report: (0.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.445, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_SBL_CSS=3.335, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1782322785301158500 The 'skip_flush' field is set on the dummy throwaway HMP monitor object created by QMP's 'human-monitor-command', as an indication not to try to write data to the chardev. Instead the QMP command impl will grab the data straight out of the in-memory buffer. The flag is redundant, however, as the monitor code could instead simply check the 'fe_is_open' field on the CharFrontend, which will be false in the same scenarios that 'skip_flush' is true. Reviewed-by: Marc-Andr=C3=A9 Lureau Tested-by: Peter Krempa Signed-off-by: Daniel P. Berrang=C3=A9 --- monitor/hmp.c | 2 +- monitor/monitor-internal.h | 4 +--- monitor/monitor.c | 11 +++++++---- monitor/qmp-cmds.c | 2 +- monitor/qmp.c | 2 +- 5 files changed, 11 insertions(+), 10 deletions(-) diff --git a/monitor/hmp.c b/monitor/hmp.c index d5905e2279..516aa25d4c 100644 --- a/monitor/hmp.c +++ b/monitor/hmp.c @@ -1590,7 +1590,7 @@ void monitor_new_hmp(const char *chardev_id, bool use= _readline, Error **errp) return; } =20 - monitor_data_init(&mon->parent_obj, false, false, false); + monitor_data_init(&mon->parent_obj, false, false); =20 if (mon->use_readline) { mon->rs =3D readline_init(monitor_readline_printf, diff --git a/monitor/monitor-internal.h b/monitor/monitor-internal.h index 145d52fd71..d34f9be139 100644 --- a/monitor/monitor-internal.h +++ b/monitor/monitor-internal.h @@ -112,7 +112,6 @@ struct Monitor { CharFrontend chr; int suspend_cnt; /* Needs to be accessed atomically */ bool is_qmp; - bool skip_flush; bool use_io_thread; =20 char *mon_cpu_path; @@ -194,8 +193,7 @@ extern QemuMutex monitor_lock; extern MonitorList mon_list; =20 void monitor_complete(Monitor *mon, Error **errp); -void monitor_data_init(Monitor *mon, bool is_qmp, bool skip_flush, - bool use_io_thread); +void monitor_data_init(Monitor *mon, bool is_qmp, bool use_io_thread); void monitor_data_destroy(Monitor *mon); int monitor_can_read(void *opaque); void monitor_list_append(Monitor *mon); diff --git a/monitor/monitor.c b/monitor/monitor.c index 747ca27fd5..e3e5623a4b 100644 --- a/monitor/monitor.c +++ b/monitor/monitor.c @@ -188,7 +188,12 @@ void monitor_flush_locked(Monitor *mon) size_t len; const char *buf; =20 - if (mon->skip_flush) { + /* + * When used by QMP human-monitor-command, no chardev + * will be connected, as we want to just collect the + * output in the buffer + */ + if (!mon->chr.fe_is_open) { return; } =20 @@ -642,8 +647,7 @@ static void monitor_iothread_init(void) mon_iothread =3D iothread_create("mon_iothread", &error_abort); } =20 -void monitor_data_init(Monitor *mon, bool is_qmp, bool skip_flush, - bool use_io_thread) +void monitor_data_init(Monitor *mon, bool is_qmp, bool use_io_thread) { if (use_io_thread && !mon_iothread) { monitor_iothread_init(); @@ -651,7 +655,6 @@ void monitor_data_init(Monitor *mon, bool is_qmp, bool = skip_flush, qemu_mutex_init(&mon->mon_lock); mon->is_qmp =3D is_qmp; mon->outbuf =3D g_string_new(NULL); - mon->skip_flush =3D skip_flush; mon->use_io_thread =3D use_io_thread; } =20 diff --git a/monitor/qmp-cmds.c b/monitor/qmp-cmds.c index bfde769ef0..0d9adad288 100644 --- a/monitor/qmp-cmds.c +++ b/monitor/qmp-cmds.c @@ -168,7 +168,7 @@ char *qmp_human_monitor_command(const char *command_lin= e, bool has_cpu_index, char *output =3D NULL; MonitorHMP *hmp =3D MONITOR_HMP(object_new(TYPE_MONITOR_HMP)); =20 - monitor_data_init(&hmp->parent_obj, false, true, false); + monitor_data_init(&hmp->parent_obj, false, false); =20 if (has_cpu_index) { int ret =3D monitor_set_cpu(&hmp->parent_obj, cpu_index); diff --git a/monitor/qmp.c b/monitor/qmp.c index 2a8532ef96..e3318b57db 100644 --- a/monitor/qmp.c +++ b/monitor/qmp.c @@ -572,7 +572,7 @@ void monitor_new_qmp(const char *chardev_id, bool prett= y, Error **errp) qemu_chr_fe_set_echo(&mon->parent_obj.chr, true); =20 /* Note: we run QMP monitor in I/O thread when @chr supports that */ - monitor_data_init(&mon->parent_obj, true, false, + monitor_data_init(&mon->parent_obj, true, qemu_chr_has_feature(mon->parent_obj.chr.chr, QEMU_CHAR_FEATURE_GCONTEXT)); =20 --=20 2.54.0 From nobody Wed Jun 24 21:40:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1782322774; cv=none; d=zohomail.com; s=zohoarc; b=nd8rdkpniqvht8tuSwvl489Bdz73rVdu/v4MXpZuYG0tlmgx9T7yV0aZZ9bj3pAWFtiyYYKLDfmD2ZgGmOGcd0iYIkqFafVJ0Mhu0XKwfkg4cjcxrArtFkXGhSZhC1yenlz6eCedLEWDbB3qL3lboSao87BDbFk+GHkSJf6wsDU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782322774; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=QXukcbOYaDoppsZprcVkbzzyPc7yo9HZSzgxHXZDCAk=; b=T76mRTy8TI8FXRLNkmBdCDQKDNvngLtz0KY9aQRHnRPlVDXW4vIEwRmm7mHpDa3iuDem235nFpvcySlgGIuCM77fFEdAwvRXHb/6b/MTn0NisIcTl0N1Ype9RiiCYfZNaX3jpnNw8f1OJUvtp8sPXAEur6NrwuXPGMv+3/iWBt8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782322774403623.2926299488416; Wed, 24 Jun 2026 10:39:34 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcRYq-00076c-OW; Wed, 24 Jun 2026 13:38:53 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRYm-00074Z-3I for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:38:48 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRYh-0004TI-BW for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:38:46 -0400 Received: from mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-596-mHGos9mgOqKyq-YraVluVw-1; Wed, 24 Jun 2026 13:38:40 -0400 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 582331801BDC; Wed, 24 Jun 2026 17:38:39 +0000 (UTC) Received: from berrange.com (unknown [10.44.32.102]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 07DC1180028B; Wed, 24 Jun 2026 17:38:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1782322721; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=QXukcbOYaDoppsZprcVkbzzyPc7yo9HZSzgxHXZDCAk=; b=KdVG2BXRTUSqvJeLPPqof1Y7WBHCBfTo94cY0qwOvhD9CGflW6mdvgf+WKEjXPQu8VwXpO M3U44RisRXjDHsRs2711O5rWYYhZja+6OpJrdGkAIL2wqx5H5suO8TRd2QXrmQfSzzP067 aLK8GtLSqlIC0uhn0++yw9hQ3ee6B50= X-MC-Unique: mHGos9mgOqKyq-YraVluVw-1 X-Mimecast-MFC-AGG-ID: mHGos9mgOqKyq-YraVluVw_1782322719 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: qemu-devel@nongnu.org Cc: devel@lists.libvirt.org, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Markus Armbruster , Paolo Bonzini , "Dr. David Alan Gilbert" , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Brauner , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Peter Krempa Subject: [PATCH v5 10/35] monitor: move monitor_data_(init|destroy) into QOM init/finalize Date: Wed, 24 Jun 2026 18:37:26 +0100 Message-ID: <20260624173752.2928717-11-berrange@redhat.com> In-Reply-To: <20260624173752.2928717-1-berrange@redhat.com> References: <20260624173752.2928717-1-berrange@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -24 X-Spam_score: -2.5 X-Spam_bar: -- X-Spam_report: (-2.5 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.445, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1782322775096158500 Start to take advantage of QOM, by using object init and finalize methods to replace monitor_data_init and monitor_data_destroy. A standalone helper is provided to enable the I/O thread for QMP where appropriate for the chardev backend. Reviewed-by: Marc-Andr=C3=A9 Lureau Tested-by: Peter Krempa Signed-off-by: Daniel P. Berrang=C3=A9 --- monitor/hmp.c | 6 +++-- monitor/monitor-internal.h | 3 +-- monitor/monitor.c | 46 +++++++++++++------------------------- monitor/qmp-cmds.c | 3 --- monitor/qmp.c | 34 +++++++++++++++------------- 5 files changed, 40 insertions(+), 52 deletions(-) diff --git a/monitor/hmp.c b/monitor/hmp.c index 516aa25d4c..2bb2333da5 100644 --- a/monitor/hmp.c +++ b/monitor/hmp.c @@ -48,6 +48,10 @@ OBJECT_DEFINE_TYPE(MonitorHMP, monitor_hmp, MONITOR_HMP,= MONITOR); =20 static void monitor_hmp_finalize(Object *obj) { + MonitorHMP *mon =3D MONITOR_HMP(obj); + if (mon->rs) { + readline_free(mon->rs); + } } =20 static bool monitor_hmp_get_readline(Object *obj, Error **errp) @@ -1590,8 +1594,6 @@ void monitor_new_hmp(const char *chardev_id, bool use= _readline, Error **errp) return; } =20 - monitor_data_init(&mon->parent_obj, false, false); - if (mon->use_readline) { mon->rs =3D readline_init(monitor_readline_printf, monitor_readline_flush, diff --git a/monitor/monitor-internal.h b/monitor/monitor-internal.h index d34f9be139..6a4c3b0f37 100644 --- a/monitor/monitor-internal.h +++ b/monitor/monitor-internal.h @@ -193,8 +193,7 @@ extern QemuMutex monitor_lock; extern MonitorList mon_list; =20 void monitor_complete(Monitor *mon, Error **errp); -void monitor_data_init(Monitor *mon, bool is_qmp, bool use_io_thread); -void monitor_data_destroy(Monitor *mon); +void monitor_iothread_init(Monitor *mon); int monitor_can_read(void *opaque); void monitor_list_append(Monitor *mon); void monitor_fdsets_cleanup(void); diff --git a/monitor/monitor.c b/monitor/monitor.c index e3e5623a4b..76df379a2c 100644 --- a/monitor/monitor.c +++ b/monitor/monitor.c @@ -80,6 +80,10 @@ static void monitor_finalize(Object *obj) Monitor *mon =3D MONITOR(obj); =20 g_free(mon->chardev_id); + g_free(mon->mon_cpu_path); + qemu_chr_fe_deinit(&mon->chr, false); + g_string_free(mon->outbuf, true); + qemu_mutex_destroy(&mon->mon_lock); } =20 static char *monitor_get_chardev_id(Object *obj, Error **errp) @@ -106,6 +110,11 @@ static void monitor_class_init(ObjectClass *cls, const= void *data) =20 static void monitor_init(Object *obj) { + Monitor *mon =3D MONITOR(obj); + + qemu_mutex_init(&mon->mon_lock); + mon->is_qmp =3D !!object_dynamic_cast(obj, TYPE_MONITOR_QMP); + mon->outbuf =3D g_string_new(NULL); } =20 Monitor *monitor_cur(void) @@ -637,38 +646,16 @@ void monitor_list_append(Monitor *mon) qemu_mutex_unlock(&monitor_lock); =20 if (mon) { - monitor_data_destroy(mon); object_unparent(OBJECT(mon)); } } =20 -static void monitor_iothread_init(void) -{ - mon_iothread =3D iothread_create("mon_iothread", &error_abort); -} - -void monitor_data_init(Monitor *mon, bool is_qmp, bool use_io_thread) +void monitor_iothread_init(Monitor *mon) { - if (use_io_thread && !mon_iothread) { - monitor_iothread_init(); + if (!mon_iothread) { + mon_iothread =3D iothread_create("mon_iothread", &error_abort); } - qemu_mutex_init(&mon->mon_lock); - mon->is_qmp =3D is_qmp; - mon->outbuf =3D g_string_new(NULL); - mon->use_io_thread =3D use_io_thread; -} - -void monitor_data_destroy(Monitor *mon) -{ - g_free(mon->mon_cpu_path); - qemu_chr_fe_deinit(&mon->chr, false); - if (monitor_is_qmp(mon)) { - monitor_data_destroy_qmp(container_of(mon, MonitorQMP, parent_obj)= ); - } else { - readline_free(container_of(mon, MonitorHMP, parent_obj)->rs); - } - g_string_free(mon->outbuf, true); - qemu_mutex_destroy(&mon->mon_lock); + mon->use_io_thread =3D true; } =20 void monitor_cleanup(void) @@ -686,7 +673,7 @@ void monitor_cleanup(void) * Letting the iothread continue while shutting down the dispatcher * means that new requests may still be coming in. This is okay, * we'll just leave them in the queue without sending a response - * and monitor_data_destroy() will free them. + * and object finalization will free them. */ WITH_QEMU_LOCK_GUARD(&monitor_lock) { qmp_dispatcher_co_shutdown =3D true; @@ -700,8 +687,8 @@ void monitor_cleanup(void) /* * We need to explicitly stop the I/O thread (but not destroy it), * clean up the monitor resources, then destroy the I/O thread since - * we need to unregister from chardev below in - * monitor_data_destroy(), and chardev is not thread-safe yet + * we need to unregister from chardev below in object + * finalization, and chardev is not thread-safe yet */ if (mon_iothread) { iothread_stop(mon_iothread); @@ -716,7 +703,6 @@ void monitor_cleanup(void) /* Permit QAPI event emission from character frontend release */ qemu_mutex_unlock(&monitor_lock); monitor_flush(mon); - monitor_data_destroy(mon); qemu_mutex_lock(&monitor_lock); object_unparent(OBJECT(mon)); } diff --git a/monitor/qmp-cmds.c b/monitor/qmp-cmds.c index 0d9adad288..6cb0b587fb 100644 --- a/monitor/qmp-cmds.c +++ b/monitor/qmp-cmds.c @@ -168,8 +168,6 @@ char *qmp_human_monitor_command(const char *command_lin= e, bool has_cpu_index, char *output =3D NULL; MonitorHMP *hmp =3D MONITOR_HMP(object_new(TYPE_MONITOR_HMP)); =20 - monitor_data_init(&hmp->parent_obj, false, false); - if (has_cpu_index) { int ret =3D monitor_set_cpu(&hmp->parent_obj, cpu_index); if (ret < 0) { @@ -186,7 +184,6 @@ char *qmp_human_monitor_command(const char *command_lin= e, bool has_cpu_index, } =20 out: - monitor_data_destroy(&hmp->parent_obj); object_unref(hmp); return output; } diff --git a/monitor/qmp.c b/monitor/qmp.c index e3318b57db..694d303215 100644 --- a/monitor/qmp.c +++ b/monitor/qmp.c @@ -73,8 +73,16 @@ QmpCommandList qmp_commands, qmp_cap_negotiation_command= s; =20 OBJECT_DEFINE_TYPE(MonitorQMP, monitor_qmp, MONITOR_QMP, MONITOR); =20 +static void monitor_qmp_cleanup_req_queue_locked(MonitorQMP *mon); + static void monitor_qmp_finalize(Object *obj) { + MonitorQMP *mon =3D MONITOR_QMP(obj); + + json_message_parser_destroy(&mon->parser); + qemu_mutex_destroy(&mon->qmp_queue_lock); + monitor_qmp_cleanup_req_queue_locked(mon); + g_queue_free(mon->qmp_requests); } =20 static bool monitor_qmp_get_pretty(Object *obj, Error **errp) @@ -98,8 +106,15 @@ static void monitor_qmp_class_init(ObjectClass *cls, co= nst void *data) monitor_qmp_set_pretty); } =20 +static void handle_qmp_command(void *opaque, QObject *req, Error *err); static void monitor_qmp_init(Object *obj) { + MonitorQMP *mon =3D MONITOR_QMP(obj); + + qemu_mutex_init(&mon->qmp_queue_lock); + mon->qmp_requests =3D g_queue_new(); + + json_message_parser_init(&mon->parser, handle_qmp_command, mon, NULL); } =20 static bool qmp_oob_enabled(MonitorQMP *mon) @@ -522,14 +537,6 @@ static void monitor_qmp_event(void *opaque, QEMUChrEve= nt event) } } =20 -void monitor_data_destroy_qmp(MonitorQMP *mon) -{ - json_message_parser_destroy(&mon->parser); - qemu_mutex_destroy(&mon->qmp_queue_lock); - monitor_qmp_cleanup_req_queue_locked(mon); - g_queue_free(mon->qmp_requests); -} - static void monitor_qmp_setup_handlers_bh(void *opaque) { MonitorQMP *mon =3D opaque; @@ -572,14 +579,11 @@ void monitor_new_qmp(const char *chardev_id, bool pre= tty, Error **errp) qemu_chr_fe_set_echo(&mon->parent_obj.chr, true); =20 /* Note: we run QMP monitor in I/O thread when @chr supports that */ - monitor_data_init(&mon->parent_obj, true, - qemu_chr_has_feature(mon->parent_obj.chr.chr, - QEMU_CHAR_FEATURE_GCONTEXT)); - - qemu_mutex_init(&mon->qmp_queue_lock); - mon->qmp_requests =3D g_queue_new(); + if (qemu_chr_has_feature(mon->parent_obj.chr.chr, + QEMU_CHAR_FEATURE_GCONTEXT)) { + monitor_iothread_init(&mon->parent_obj); + } =20 - json_message_parser_init(&mon->parser, handle_qmp_command, mon, NULL); if (mon->parent_obj.use_io_thread) { /* * Make sure the old iowatch is gone. It's possible when --=20 2.54.0 From nobody Wed Jun 24 21:40:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1782322744; cv=none; d=zohomail.com; s=zohoarc; b=b56SL8qCismaPKCvnr2a9O1Oz8xa+3GmthsAVt93d7mlBSAXEATRXb8Ng3XNyW1rwvelN/Qynx1B9kwtCLKjl2Vkv3kZAUH2p1/BpupYgO9LBVpLYobd3fiK+y61TPLPGuy4t9tLCBzDAlhBbakikIByRIBInzjkX0N0/FaRB0Y= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782322744; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=zl/8J9grj7A0lRTASY/+INx7eXK95DhlGLMsm7OEuo0=; b=GIARt9qf1WAH1c9jz2/gbgKvSuQUkLoEyzN09s3RIQE+N+BUNKdcJB6LWFjSR54Bj8KbyhGmcT7tKNsFLjjgdwXnGIq9Gppjh0lDb0stLDzINcfAg80FGm7ExMT6Rg5UqGHe3bPQUEoVX11TRfvP4EajJkfzTUsHsawfpxfBd5I= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782322744708788.0637042911615; Wed, 24 Jun 2026 10:39:04 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcRYs-00079Y-3x; Wed, 24 Jun 2026 13:38:54 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRYp-00076Q-IL for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:38:51 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRYn-0004Uk-Cr for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:38:51 -0400 Received: from mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-21-pAn2jd7gMCSHALmjJLfQQw-1; Wed, 24 Jun 2026 13:38:44 -0400 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 872BA1954195; Wed, 24 Jun 2026 17:38:43 +0000 (UTC) Received: from berrange.com (unknown [10.44.32.102]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id CF63D180028B; Wed, 24 Jun 2026 17:38:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1782322728; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=zl/8J9grj7A0lRTASY/+INx7eXK95DhlGLMsm7OEuo0=; b=ioWCOOt90dFr42hmVSxlw4Em8hs+6qmAMP/nq3+mVwfVtw7oFQ3lyYJ/77q6K5GVVQ0hkh zRI2sefmAfKL5xc97JyuohtRivLUqBMTrf6qsD9rP4zfewmYUluqv/27mmXXCKB36jzx0y caVNUQzdl23TQQOVnK9XPf018yBzWi0= X-MC-Unique: pAn2jd7gMCSHALmjJLfQQw-1 X-Mimecast-MFC-AGG-ID: pAn2jd7gMCSHALmjJLfQQw_1782322723 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: qemu-devel@nongnu.org Cc: devel@lists.libvirt.org, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Markus Armbruster , Paolo Bonzini , "Dr. David Alan Gilbert" , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Brauner , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Peter Krempa Subject: [PATCH v5 11/35] monitor: use class methods for monitor_vprintf Date: Wed, 24 Jun 2026 18:37:27 +0100 Message-ID: <20260624173752.2928717-12-berrange@redhat.com> In-Reply-To: <20260624173752.2928717-1-berrange@redhat.com> References: <20260624173752.2928717-1-berrange@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: 8 X-Spam_score: 0.8 X-Spam_bar: / X-Spam_report: (0.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.445, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_SBL_CSS=3.335, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1782322747464158500 This removes the need for using monitor_is_qmp() to check the subclass type, which is an anti-pattern. Reviewed-by: Marc-Andr=C3=A9 Lureau Reviewed-by: Dr. David Alan Gilbert Tested-by: Peter Krempa Signed-off-by: Daniel P. Berrang=C3=A9 --- monitor/hmp.c | 13 +++++++++++++ monitor/monitor-internal.h | 7 +++++++ monitor/monitor.c | 11 ++++------- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/monitor/hmp.c b/monitor/hmp.c index 2bb2333da5..08055839a4 100644 --- a/monitor/hmp.c +++ b/monitor/hmp.c @@ -68,11 +68,18 @@ static void monitor_hmp_set_readline(Object *obj, bool = val, Error **errp) mon->use_readline =3D val; } =20 +int monitor_hmp_vprintf(Monitor *mon, const char *fmt, va_list ap) + G_GNUC_PRINTF(2, 0); + static void monitor_hmp_class_init(ObjectClass *cls, const void *data) { + MonitorClass *moncls =3D MONITOR_CLASS(cls); + object_class_property_add_bool(cls, "readline", monitor_hmp_get_readline, monitor_hmp_set_readline); + + moncls->vprintf =3D monitor_hmp_vprintf; } =20 static void monitor_hmp_init(Object *obj) @@ -87,6 +94,12 @@ static void monitor_hmp_init(Object *obj) hmp->use_readline =3D true; } =20 +int monitor_hmp_vprintf(Monitor *mon, const char *fmt, va_list ap) +{ + g_autofree char *buf =3D g_strdup_vprintf(fmt, ap); + return monitor_puts(mon, buf); +} + static void monitor_command_cb(void *opaque, const char *cmdline, void *readline_opaque) { diff --git a/monitor/monitor-internal.h b/monitor/monitor-internal.h index 6a4c3b0f37..23cef68153 100644 --- a/monitor/monitor-internal.h +++ b/monitor/monitor-internal.h @@ -104,6 +104,13 @@ typedef struct HMPCommand { =20 struct MonitorClass { ObjectClass parent_class; + + /* + * If non-NULL, the monitor is able to print messages + * for attention of the client user + */ + int (*vprintf)(Monitor *mon, const char *fmt, va_list ap) + G_GNUC_PRINTF(2, 0); }; =20 struct Monitor { diff --git a/monitor/monitor.c b/monitor/monitor.c index 76df379a2c..8b70380d64 100644 --- a/monitor/monitor.c +++ b/monitor/monitor.c @@ -262,21 +262,18 @@ int monitor_puts(Monitor *mon, const char *str) =20 int monitor_vprintf(Monitor *mon, const char *fmt, va_list ap) { - char *buf; - int n; + MonitorClass *moncls; =20 if (!mon) { return -1; } =20 - if (monitor_is_qmp(mon)) { + moncls =3D MONITOR_GET_CLASS(mon); + if (!moncls->vprintf) { return -1; } =20 - buf =3D g_strdup_vprintf(fmt, ap); - n =3D monitor_puts(mon, buf); - g_free(buf); - return n; + return moncls->vprintf(mon, fmt, ap); } =20 int monitor_printf(Monitor *mon, const char *fmt, ...) --=20 2.54.0 From nobody Wed Jun 24 21:40:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1782322770; cv=none; d=zohomail.com; s=zohoarc; b=NdjcuuEgaqW1blWr/deAOxZIsI+tBFIkjKX/WI+Ky6jNPYAHvb5awwx0nBNp3hHKHbsOv6sJnxM61x+JZxy9h3rl3YCVIy/2RmddOdYr8NCNR5Icwn44Serr2IF4N4crIdy5U6mAcR7sllgaD0ef5Xiin0/XC+UH+TwBJc61kMo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782322770; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=oxgB1BJN6KN90dDx7sdBCyyuBQFI0XRsI6DnTy8BmQ0=; b=WpmSHMHXbH4gtfbSVAapKzWVxGPB+MipLjoIUdqdZMkjFkE8C+ime2ljqmTBB1rf5hivbwpxiqj74HFR7JUZZxKARQobszZ8Cy7+v1Tdr8GvJz74G16mzjM99uAGexlxGxOHC3OxEL+0mA0KzZIjwpL5oRZNaEqqXirIb82fjUA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782322770600381.3157689745417; Wed, 24 Jun 2026 10:39:30 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcRYz-0007AU-8k; Wed, 24 Jun 2026 13:39:02 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRYt-00079w-8H for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:38:55 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRYr-0004VN-8v for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:38:55 -0400 Received: from mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-331-atr7EL1JM6y7cG_sAqbbiA-1; Wed, 24 Jun 2026 13:38:49 -0400 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 24BFD1801BDC; Wed, 24 Jun 2026 17:38:48 +0000 (UTC) Received: from berrange.com (unknown [10.44.32.102]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 24EF7180034F; Wed, 24 Jun 2026 17:38:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1782322732; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=oxgB1BJN6KN90dDx7sdBCyyuBQFI0XRsI6DnTy8BmQ0=; b=P0Jo31hxEfCh7+CsZkorppWnVZz3rAfQ8oogZ5yk9kwZElB7+YtB6VTF9hnNEglf1+aALI 4lpYooNk3xyq/8UmOm8MhzYxnGTW/BYhJP8bpZGZ/0s3g55XIgZgTDnqApOvhvaY7y6/B6 raHse3K4CBxuQy4vgkAGXwUcYj4VYzg= X-MC-Unique: atr7EL1JM6y7cG_sAqbbiA-1 X-Mimecast-MFC-AGG-ID: atr7EL1JM6y7cG_sAqbbiA_1782322728 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: qemu-devel@nongnu.org Cc: devel@lists.libvirt.org, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Markus Armbruster , Paolo Bonzini , "Dr. David Alan Gilbert" , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Brauner , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Peter Krempa Subject: [PATCH v5 12/35] monitor: use class methods for monitor_qapi_event_emit Date: Wed, 24 Jun 2026 18:37:28 +0100 Message-ID: <20260624173752.2928717-13-berrange@redhat.com> In-Reply-To: <20260624173752.2928717-1-berrange@redhat.com> References: <20260624173752.2928717-1-berrange@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -24 X-Spam_score: -2.5 X-Spam_bar: -- X-Spam_report: (-2.5 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.445, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1782322771260158500 This removes the need for using monitor_is_qmp() to check the subclass type, which is an anti-pattern. Reviewed-by: Marc-Andr=C3=A9 Lureau Tested-by: Peter Krempa Signed-off-by: Daniel P. Berrang=C3=A9 --- include/monitor/monitor.h | 1 + monitor/monitor-internal.h | 5 +++++ monitor/monitor.c | 15 +++------------ monitor/qmp.c | 20 ++++++++++++++++++++ 4 files changed, 29 insertions(+), 12 deletions(-) diff --git a/include/monitor/monitor.h b/include/monitor/monitor.h index a135b3a590..8cb3db677b 100644 --- a/include/monitor/monitor.h +++ b/include/monitor/monitor.h @@ -3,6 +3,7 @@ =20 #include "block/block.h" #include "qapi/qapi-types-misc.h" +#include "qapi/qapi-emit-events.h" #include "qemu/readline.h" #include "exec/hwaddr.h" #include "qom/object.h" diff --git a/monitor/monitor-internal.h b/monitor/monitor-internal.h index 23cef68153..763b5c9625 100644 --- a/monitor/monitor-internal.h +++ b/monitor/monitor-internal.h @@ -111,6 +111,11 @@ struct MonitorClass { */ int (*vprintf)(Monitor *mon, const char *fmt, va_list ap) G_GNUC_PRINTF(2, 0); + /* + * If non-NULL, the monitor is able to send event + * notifications back to the client + */ + void (*emit_event)(Monitor *mon, QAPIEvent event, QDict *qdict); }; =20 struct Monitor { diff --git a/monitor/monitor.c b/monitor/monitor.c index 8b70380d64..6f0353d9f1 100644 --- a/monitor/monitor.c +++ b/monitor/monitor.c @@ -346,22 +346,13 @@ static inline QEMUClockType monitor_get_event_clock(v= oid) static void monitor_qapi_event_emit(QAPIEvent event, QDict *qdict) { Monitor *mon; - MonitorQMP *qmp_mon; =20 trace_monitor_protocol_event_emit(event, qdict); QTAILQ_FOREACH(mon, &mon_list, entry) { - if (!monitor_is_qmp(mon)) { - continue; + MonitorClass *cls =3D MONITOR_GET_CLASS(mon); + if (cls->emit_event) { + cls->emit_event(mon, event, qdict); } - - qmp_mon =3D container_of(mon, MonitorQMP, parent_obj); - { - QEMU_LOCK_GUARD(&mon->mon_lock); - if (qmp_mon->commands =3D=3D &qmp_cap_negotiation_commands) { - continue; - } - } - qmp_send_response(qmp_mon, qdict); } } =20 diff --git a/monitor/qmp.c b/monitor/qmp.c index 694d303215..ec17050a70 100644 --- a/monitor/qmp.c +++ b/monitor/qmp.c @@ -99,11 +99,17 @@ static void monitor_qmp_set_pretty(Object *obj, bool va= l, Error **errp) mon->pretty =3D val; } =20 +static void monitor_qmp_emit_event(Monitor *mon, QAPIEvent event, QDict *q= dict); + static void monitor_qmp_class_init(ObjectClass *cls, const void *data) { + MonitorClass *moncls =3D MONITOR_CLASS(cls); + object_class_property_add_bool(cls, "pretty", monitor_qmp_get_pretty, monitor_qmp_set_pretty); + + moncls->emit_event =3D monitor_qmp_emit_event; } =20 static void handle_qmp_command(void *opaque, QObject *req, Error *err); @@ -117,6 +123,20 @@ static void monitor_qmp_init(Object *obj) json_message_parser_init(&mon->parser, handle_qmp_command, mon, NULL); } =20 +static void monitor_qmp_emit_event(Monitor *mon, QAPIEvent event, QDict *q= dict) +{ + MonitorQMP *qmp =3D MONITOR_QMP(mon); + + WITH_QEMU_LOCK_GUARD(&mon->mon_lock) { + if (qmp->commands =3D=3D &qmp_cap_negotiation_commands) { + return; + } + } + + qmp_send_response(qmp, qdict); +} + + static bool qmp_oob_enabled(MonitorQMP *mon) { return mon->capab[QMP_CAPABILITY_OOB]; --=20 2.54.0 From nobody Wed Jun 24 21:40:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1782322784; cv=none; d=zohomail.com; s=zohoarc; b=NwcpXP1XYEu83KLDtDMIh6pBGrVJ8ZGtAYptDC+K2U1ADhXtAUjGQ2RYJLinpWwgSbcc7TLcMibAM/lJfBQBABoqikX9c867nws3wAq6PSx+0tuehfpRMXfQEMvy6WfnF6ZTBK8052mUgyWFRtWvffNaPvQ7nBZwZ7vuKKmJknM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782322784; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=hW++Kt6N/D3eeQ10Ld2bzSjINpCrWEfHFcxHGThMbIY=; b=gjG+IgDxRjYc5Q5zmc55fXnsOq0rMb11tS2K5SyKn3Av4mI2Sxssxtg/KjahQYCgBoR6cSFAumB2pkJLYI/VWLKs6+kFA3UYAPoa0JVWU/WqjrTt7f1vHQv/DQpZmTzTrJuZn4lxB81LrFe0U0BVBqXlqv/VFG7DorMxwbj2am8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782322784775564.5537327270908; Wed, 24 Jun 2026 10:39:44 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcRZL-0007U2-AX; Wed, 24 Jun 2026 13:39:25 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRZ3-0007OC-E0 for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:39:08 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRZ1-0004W2-R6 for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:39:05 -0400 Received: from mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-455-fJcpDgXoMNqDS2WUhIc9IQ-1; Wed, 24 Jun 2026 13:38:53 -0400 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 2D76D1955EB1; Wed, 24 Jun 2026 17:38:52 +0000 (UTC) Received: from berrange.com (unknown [10.44.32.102]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 7F5B5180034F; Wed, 24 Jun 2026 17:38:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1782322736; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=hW++Kt6N/D3eeQ10Ld2bzSjINpCrWEfHFcxHGThMbIY=; b=iVLkr8H9CS8Sh9k+Es8PNvl2JDyx5p61ubf44eCgVprRbpxeTlYxIO5gO9TdT+4h5yCgvG 8HSDnhsmSqaOTtL/uEINSYhg6tDKjMydIwh17AVNcx3UOO7U9gFUTS3wypOiI4kKv7YDf+ ho9eVtMuZ2LNMNPuXm++YsYVfjy0Olk= X-MC-Unique: fJcpDgXoMNqDS2WUhIc9IQ-1 X-Mimecast-MFC-AGG-ID: fJcpDgXoMNqDS2WUhIc9IQ_1782322732 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: qemu-devel@nongnu.org Cc: devel@lists.libvirt.org, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Markus Armbruster , Paolo Bonzini , "Dr. David Alan Gilbert" , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Brauner , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Peter Krempa Subject: [PATCH v5 13/35] monitor: use class methods for monitor_accept_input Date: Wed, 24 Jun 2026 18:37:29 +0100 Message-ID: <20260624173752.2928717-14-berrange@redhat.com> In-Reply-To: <20260624173752.2928717-1-berrange@redhat.com> References: <20260624173752.2928717-1-berrange@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: 8 X-Spam_score: 0.8 X-Spam_bar: / X-Spam_report: (0.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.445, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_SBL_CSS=3.335, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1782322787039158502 This removes the need for using monitor_is_qmp() to check the subclass type, which is an anti-pattern. Reviewed-by: Marc-Andr=C3=A9 Lureau Tested-by: Peter Krempa Signed-off-by: Daniel P. Berrang=C3=A9 --- monitor/hmp.c | 16 ++++++++++++++++ monitor/monitor-internal.h | 5 +++++ monitor/monitor.c | 12 +++--------- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/monitor/hmp.c b/monitor/hmp.c index 08055839a4..1da9370ead 100644 --- a/monitor/hmp.c +++ b/monitor/hmp.c @@ -70,6 +70,7 @@ static void monitor_hmp_set_readline(Object *obj, bool va= l, Error **errp) =20 int monitor_hmp_vprintf(Monitor *mon, const char *fmt, va_list ap) G_GNUC_PRINTF(2, 0); +static void monitor_hmp_accept_input(Monitor *mon); =20 static void monitor_hmp_class_init(ObjectClass *cls, const void *data) { @@ -80,6 +81,7 @@ static void monitor_hmp_class_init(ObjectClass *cls, cons= t void *data) monitor_hmp_set_readline); =20 moncls->vprintf =3D monitor_hmp_vprintf; + moncls->accept_input =3D monitor_hmp_accept_input; } =20 static void monitor_hmp_init(Object *obj) @@ -100,6 +102,20 @@ int monitor_hmp_vprintf(Monitor *mon, const char *fmt,= va_list ap) return monitor_puts(mon, buf); } =20 +static void monitor_hmp_accept_input(Monitor *mon) +{ + qemu_mutex_lock(&mon->mon_lock); + if (mon->reset_seen) { + MonitorHMP *hmp =3D MONITOR_HMP(mon); + assert(hmp->rs); + readline_restart(hmp->rs); + qemu_mutex_unlock(&mon->mon_lock); + readline_show_prompt(hmp->rs); + } else { + qemu_mutex_unlock(&mon->mon_lock); + } +} + static void monitor_command_cb(void *opaque, const char *cmdline, void *readline_opaque) { diff --git a/monitor/monitor-internal.h b/monitor/monitor-internal.h index 763b5c9625..592f146331 100644 --- a/monitor/monitor-internal.h +++ b/monitor/monitor-internal.h @@ -116,6 +116,11 @@ struct MonitorClass { * notifications back to the client */ void (*emit_event)(Monitor *mon, QAPIEvent event, QDict *qdict); + /* + * If non-NULL, perform any actions needed to prepare + * the monitor to accept further client input + */ + void (*accept_input)(Monitor *mon); }; =20 struct Monitor { diff --git a/monitor/monitor.c b/monitor/monitor.c index 6f0353d9f1..2f16cd3053 100644 --- a/monitor/monitor.c +++ b/monitor/monitor.c @@ -576,16 +576,10 @@ int monitor_suspend(Monitor *mon) static void monitor_accept_input(void *opaque) { Monitor *mon =3D opaque; + MonitorClass *cls =3D MONITOR_GET_CLASS(mon); =20 - qemu_mutex_lock(&mon->mon_lock); - if (!monitor_is_qmp(mon) && mon->reset_seen) { - MonitorHMP *hmp_mon =3D container_of(mon, MonitorHMP, parent_obj); - assert(hmp_mon->rs); - readline_restart(hmp_mon->rs); - qemu_mutex_unlock(&mon->mon_lock); - readline_show_prompt(hmp_mon->rs); - } else { - qemu_mutex_unlock(&mon->mon_lock); + if (cls->accept_input) { + cls->accept_input(mon); } =20 qemu_chr_fe_accept_input(&mon->chr); --=20 2.54.0 From nobody Wed Jun 24 21:40:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1782322952; cv=none; d=zohomail.com; s=zohoarc; b=a94Ji2pOHrSSsfGPRqnAKf/svbsD18kvD6NeVOxjwYbE1va3YZ1XZYVd9lnOi1QKQWcYJegW1nZwZvle7Eh6ZFJKiMgiXyg1+XI4MRI8OVI5qY1nHpV182pQorZcw74mhzAtvne08EdXZvJ3UzEVYBfbfEmDyGUs33xloccXx3U= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782322952; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=gWfLSXC+ag5yvX/MQyvRADXKEV7f85UUWjKpKh1FA3k=; b=Mra7Ulksie7bm7Dax4to05qeM69CPYamW+te58dmPjR3Vc1lZlaM/Jj0Turw4JXutk6VloCJR+t8nYDX8qYoG/RO79d85xDKuCa8U6Ui2ThaM29s/MLknoOyCcM13ZSzbtASiwkk4SV5hJ8NRqopiHmTN7rG+l+6pb1tt+iKHi8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782322952791404.05489765128004; Wed, 24 Jun 2026 10:42:32 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcRZQ-0007ls-GW; Wed, 24 Jun 2026 13:39:28 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRZ5-0007OJ-3P for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:39:13 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRZ1-0004WK-Rw for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:39:06 -0400 Received: from mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-119-YfOs5ZlxO1KL2DRR2zP4Wg-1; Wed, 24 Jun 2026 13:38:57 -0400 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id F1567180060C; Wed, 24 Jun 2026 17:38:55 +0000 (UTC) Received: from berrange.com (unknown [10.44.32.102]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 85C9F1800667; Wed, 24 Jun 2026 17:38:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1782322740; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=gWfLSXC+ag5yvX/MQyvRADXKEV7f85UUWjKpKh1FA3k=; b=VuTct1LnZY2qqM2Euoc2PWwsm3iVnaA797DnLV78mfyVeafwkWXsi0seYlnhefN+AzruTb fYMIeB+4Cx6/SV8ie9sPuacoKPahzfJovIdAgG3jKzf12vA22n2fSh7KL3HQCVST7GAJSj Vz52gYz5TKIjNQfplfuEArv+O1860NA= X-MC-Unique: YfOs5ZlxO1KL2DRR2zP4Wg-1 X-Mimecast-MFC-AGG-ID: YfOs5ZlxO1KL2DRR2zP4Wg_1782322736 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: qemu-devel@nongnu.org Cc: devel@lists.libvirt.org, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Markus Armbruster , Paolo Bonzini , "Dr. David Alan Gilbert" , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Brauner , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Peter Krempa Subject: [PATCH v5 14/35] monitor: use class method for I/O thread request Date: Wed, 24 Jun 2026 18:37:30 +0100 Message-ID: <20260624173752.2928717-15-berrange@redhat.com> In-Reply-To: <20260624173752.2928717-1-berrange@redhat.com> References: <20260624173752.2928717-1-berrange@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -24 X-Spam_score: -2.5 X-Spam_bar: -- X-Spam_report: (-2.5 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.445, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1782322954216158500 Introducing a virtual "requires_iothread" method allows the code to automatically initialize the I/O thread during object completion. Reviewed-by: Marc-Andr=C3=A9 Lureau Tested-by: Peter Krempa Signed-off-by: Daniel P. Berrang=C3=A9 --- monitor/monitor-internal.h | 14 +++++++++----- monitor/monitor.c | 22 ++++++++++++---------- monitor/qmp.c | 20 +++++++++++--------- 3 files changed, 32 insertions(+), 24 deletions(-) diff --git a/monitor/monitor-internal.h b/monitor/monitor-internal.h index 592f146331..efd21b8912 100644 --- a/monitor/monitor-internal.h +++ b/monitor/monitor-internal.h @@ -121,6 +121,12 @@ struct MonitorClass { * the monitor to accept further client input */ void (*accept_input)(Monitor *mon); + + /* + * If non-NULL and returns true, then an I/O thread + * is required for processing the monitor + */ + bool (*requires_iothread)(const Monitor *mon); }; =20 struct Monitor { @@ -129,7 +135,6 @@ struct Monitor { CharFrontend chr; int suspend_cnt; /* Needs to be accessed atomically */ bool is_qmp; - bool use_io_thread; =20 char *mon_cpu_path; QTAILQ_ENTRY(Monitor) entry; @@ -159,9 +164,8 @@ struct MonitorHMP { bool use_readline; /* * State used only in the thread "owning" the monitor. - * If @use_io_thread, this is @mon_iothread. (This does not actually h= appen - * in the current state of the code.) - * Else, it's the main thread. + * This is currently always the main thread, since + * HMP does not allow use of the I/O thread at this time. * These members can be safely accessed without locks. */ ReadLineState *rs; @@ -210,7 +214,7 @@ extern QemuMutex monitor_lock; extern MonitorList mon_list; =20 void monitor_complete(Monitor *mon, Error **errp); -void monitor_iothread_init(Monitor *mon); +bool monitor_requires_iothread(const Monitor *mon); int monitor_can_read(void *opaque); void monitor_list_append(Monitor *mon); void monitor_fdsets_cleanup(void); diff --git a/monitor/monitor.c b/monitor/monitor.c index 2f16cd3053..b788669f1f 100644 --- a/monitor/monitor.c +++ b/monitor/monitor.c @@ -160,6 +160,12 @@ bool monitor_cur_is_qmp(void) return cur_mon && monitor_is_qmp(cur_mon); } =20 +bool monitor_requires_iothread(const Monitor *mon) +{ + MonitorClass *cls =3D MONITOR_GET_CLASS(mon); + return cls->requires_iothread && cls->requires_iothread(mon); +} + /** * Is @mon is using readline? * Note: not all HMP monitors use readline, e.g., gdbserver has a @@ -561,7 +567,7 @@ int monitor_suspend(Monitor *mon) =20 qatomic_inc(&mon->suspend_cnt); =20 - if (mon->use_io_thread) { + if (monitor_requires_iothread(mon)) { /* * Kick I/O thread to make sure this takes effect. It'll be * evaluated again in prepare() of the watch object. @@ -594,7 +600,7 @@ void monitor_resume(Monitor *mon) if (qatomic_dec_fetch(&mon->suspend_cnt) =3D=3D 0) { AioContext *ctx; =20 - if (mon->use_io_thread) { + if (monitor_requires_iothread(mon)) { ctx =3D iothread_get_aio_context(mon_iothread); } else { ctx =3D qemu_get_aio_context(); @@ -632,14 +638,6 @@ void monitor_list_append(Monitor *mon) } } =20 -void monitor_iothread_init(Monitor *mon) -{ - if (!mon_iothread) { - mon_iothread =3D iothread_create("mon_iothread", &error_abort); - } - mon->use_io_thread =3D true; -} - void monitor_cleanup(void) { /* @@ -734,6 +732,10 @@ void monitor_complete(Monitor *mon, Error **errp) return; } } + + if (monitor_requires_iothread(mon) && !mon_iothread) { + mon_iothread =3D iothread_create("mon_iothread", &error_abort); + } } =20 int monitor_new(MonitorOptions *opts, bool allow_hmp, Error **errp) diff --git a/monitor/qmp.c b/monitor/qmp.c index ec17050a70..93f576c19d 100644 --- a/monitor/qmp.c +++ b/monitor/qmp.c @@ -100,6 +100,7 @@ static void monitor_qmp_set_pretty(Object *obj, bool va= l, Error **errp) } =20 static void monitor_qmp_emit_event(Monitor *mon, QAPIEvent event, QDict *q= dict); +static bool monitor_qmp_requires_iothread(const Monitor *mon); =20 static void monitor_qmp_class_init(ObjectClass *cls, const void *data) { @@ -110,6 +111,7 @@ static void monitor_qmp_class_init(ObjectClass *cls, co= nst void *data) monitor_qmp_set_pretty); =20 moncls->emit_event =3D monitor_qmp_emit_event; + moncls->requires_iothread =3D monitor_qmp_requires_iothread; } =20 static void handle_qmp_command(void *opaque, QObject *req, Error *err); @@ -136,6 +138,11 @@ static void monitor_qmp_emit_event(Monitor *mon, QAPIE= vent event, QDict *qdict) qmp_send_response(qmp, qdict); } =20 +static bool monitor_qmp_requires_iothread(const Monitor *mon) +{ + return qemu_chr_has_feature(mon->chr.chr, + QEMU_CHAR_FEATURE_GCONTEXT); +} =20 static bool qmp_oob_enabled(MonitorQMP *mon) { @@ -146,7 +153,8 @@ static void monitor_qmp_caps_reset(MonitorQMP *mon) { memset(mon->capab_offered, 0, sizeof(mon->capab_offered)); memset(mon->capab, 0, sizeof(mon->capab)); - mon->capab_offered[QMP_CAPABILITY_OOB] =3D mon->parent_obj.use_io_thre= ad; + mon->capab_offered[QMP_CAPABILITY_OOB] =3D + monitor_requires_iothread(MONITOR(mon)); } =20 static void qmp_request_free(QMPRequest *req) @@ -562,7 +570,7 @@ static void monitor_qmp_setup_handlers_bh(void *opaque) MonitorQMP *mon =3D opaque; GMainContext *context; =20 - assert(mon->parent_obj.use_io_thread); + assert(monitor_requires_iothread(MONITOR(mon))); context =3D iothread_get_g_main_context(mon_iothread); assert(context); qemu_chr_fe_set_handlers(&mon->parent_obj.chr, monitor_can_read, @@ -598,13 +606,7 @@ void monitor_new_qmp(const char *chardev_id, bool pret= ty, Error **errp) =20 qemu_chr_fe_set_echo(&mon->parent_obj.chr, true); =20 - /* Note: we run QMP monitor in I/O thread when @chr supports that */ - if (qemu_chr_has_feature(mon->parent_obj.chr.chr, - QEMU_CHAR_FEATURE_GCONTEXT)) { - monitor_iothread_init(&mon->parent_obj); - } - - if (mon->parent_obj.use_io_thread) { + if (monitor_requires_iothread(MONITOR(mon))) { /* * Make sure the old iowatch is gone. It's possible when * e.g. the chardev is in client mode, with wait=3Don. --=20 2.54.0 From nobody Wed Jun 24 21:40:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1782322773; cv=none; d=zohomail.com; s=zohoarc; b=Z79Coc1UOq70KfZ27qz7+g05dwGcNtNjHJ+bOYIcrI2Tcb3ZkklRC/540/fPbLGst9nVE0qpLxQSGkMLgm89JvLeaZfoNlSpSjiBss0+/LB4Ra3WkdhQlrtm8Z3lrYR/M6Brqr5Fd1izSID/eCpcomdyJzUBlki8MxpsH0XbP/k= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782322773; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=NCiWl8Uu96YcyBgDZQxBRzAjrkK49k0QQZeqqThOUV0=; b=OScUKayNrNziPuMN/a+bkCkXVeJDtaOrD2sl1Vs1SqwhGqmUqpiMqw9lgMuYc9byXJZWWDC05CQr5gHs36omTE87HzHFPcfxEU15HxXPVjXCYG6iDHbceCBAPslg3dm1Bdneq0lvs+y7DXwGkIHUfYVDz/2E4Bx4MlBfWzU4FmU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782322773099596.718533289506; Wed, 24 Jun 2026 10:39:33 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcRZL-0007U4-FT; Wed, 24 Jun 2026 13:39:25 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRZ4-0007OH-Pl for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:39:13 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRZ1-0004WY-RH for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:39:06 -0400 Received: from mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-249-X7jJr9IsPSK0xfA54qWUNg-1; Wed, 24 Jun 2026 13:39:01 -0400 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id B60251955EA4; Wed, 24 Jun 2026 17:38:59 +0000 (UTC) Received: from berrange.com (unknown [10.44.32.102]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 6B7FD1800661; Wed, 24 Jun 2026 17:38:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1782322742; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=NCiWl8Uu96YcyBgDZQxBRzAjrkK49k0QQZeqqThOUV0=; b=i9SNJNoMdgF3JnUKP1WiI8JISUXmUXowVkbhwLl7cnFs/8NTPJkjqJW8vc6DYOGVSWdB1l lmiGhuG1fl9leqPwQz6IxBkA3PilR+3RZsTJzYU/MOPQU1JwnG0NezW9zyDl/8xI+AokBo RDcgfQYkNcLLsExNFpJTNQEUlP5pna8= X-MC-Unique: X7jJr9IsPSK0xfA54qWUNg-1 X-Mimecast-MFC-AGG-ID: X7jJr9IsPSK0xfA54qWUNg_1782322739 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: qemu-devel@nongnu.org Cc: devel@lists.libvirt.org, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Markus Armbruster , Paolo Bonzini , "Dr. David Alan Gilbert" , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Brauner , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Peter Krempa Subject: [PATCH v5 15/35] monitor: use dynamic cast in monitor_qmp_requests_pop_any_with_lock Date: Wed, 24 Jun 2026 18:37:31 +0100 Message-ID: <20260624173752.2928717-16-berrange@redhat.com> In-Reply-To: <20260624173752.2928717-1-berrange@redhat.com> References: <20260624173752.2928717-1-berrange@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: 8 X-Spam_score: 0.8 X-Spam_bar: / X-Spam_report: (0.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.445, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_SBL_CSS=3.335, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1782322774958158500 This eliminates a use of monitor_is_qmp() from the QMP coroutine dispatch path. Reviewed-by: Marc-Andr=C3=A9 Lureau Tested-by: Peter Krempa Signed-off-by: Daniel P. Berrang=C3=A9 --- monitor/qmp.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/monitor/qmp.c b/monitor/qmp.c index 93f576c19d..d2a03bb7e3 100644 --- a/monitor/qmp.c +++ b/monitor/qmp.c @@ -277,11 +277,12 @@ static QMPRequest *monitor_qmp_requests_pop_any_with_= lock(void) MonitorQMP *qmp_mon; =20 QTAILQ_FOREACH(mon, &mon_list, entry) { - if (!monitor_is_qmp(mon)) { + qmp_mon =3D MONITOR_QMP( + object_dynamic_cast(OBJECT(mon), TYPE_MONITOR_QMP)); + if (!qmp_mon) { continue; } =20 - qmp_mon =3D container_of(mon, MonitorQMP, parent_obj); qemu_mutex_lock(&qmp_mon->qmp_queue_lock); req_obj =3D g_queue_pop_head(qmp_mon->qmp_requests); if (req_obj) { --=20 2.54.0 From nobody Wed Jun 24 21:40:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1782322914; cv=none; d=zohomail.com; s=zohoarc; b=Q8wJAS8t3vJi2Mgqzo6bDlvh9BrM/+mGVjkMTBiCd9X6FiHQobZtD02nYJ7vxEacCIr1+Y68NTbrH6eMPxft9eWgNYX4X47RT//9oPea4XnrQn/0oF/5G9x6y33yNz++JvsRRusu8wDWzrQVNaFUpIIT3tRLK2m/keqO9VMJahg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782322914; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=7YF8SGjVc4j/plrKmGgEPuCjHKI/xMIjZciHxi1WJFI=; b=G4/iT5VdcIR3sk94QDnsxSqcUNUzTMk+ypZz2eTb0ZdviiwXy5FYAyUtmJZ5+7G/GPFctfUdgDg9OpMC+RB4SOil+8dezzM4EyDS1gmlkxRPxh1Bsu4oZvLodamTFzq3GOx1eHtaw2lGNOAvwuAPLpKBPzgPOG7bgblxB+jt9fc= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782322914399935.6192708787066; Wed, 24 Jun 2026 10:41:54 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcRZP-0007eL-RO; Wed, 24 Jun 2026 13:39:27 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRZD-0007SA-VT for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:39:18 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRZB-0004XN-Or for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:39:15 -0400 Received: from mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-347-_OdvGTwAO-2iO3ahdt3SCw-1; Wed, 24 Jun 2026 13:39:05 -0400 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 262DF1800601; Wed, 24 Jun 2026 17:39:04 +0000 (UTC) Received: from berrange.com (unknown [10.44.32.102]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 2F785180034F; Wed, 24 Jun 2026 17:38:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1782322748; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=7YF8SGjVc4j/plrKmGgEPuCjHKI/xMIjZciHxi1WJFI=; b=hwN/V6SVaFX4uHGKJeBSOXrbaXC0dJHremb2i3ZlBdkSN4jOqFI6y4VP77wDU75G5rskbn rc1mrK1cZV+hxyQTY/QLu0W47Y9kNTKt05GFZN3tBvJyUEBhTY6nEXF3gy4Okio0CDLIJ1 MNR4QcnXsC3DcJgZ4k3DoFlRnh4LL2w= X-MC-Unique: _OdvGTwAO-2iO3ahdt3SCw-1 X-Mimecast-MFC-AGG-ID: _OdvGTwAO-2iO3ahdt3SCw_1782322744 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: qemu-devel@nongnu.org Cc: devel@lists.libvirt.org, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Markus Armbruster , Paolo Bonzini , "Dr. David Alan Gilbert" , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Brauner , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Peter Krempa Subject: [PATCH v5 16/35] util: use dynamic cast in error vreport Date: Wed, 24 Jun 2026 18:37:32 +0100 Message-ID: <20260624173752.2928717-17-berrange@redhat.com> In-Reply-To: <20260624173752.2928717-1-berrange@redhat.com> References: <20260624173752.2928717-1-berrange@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -24 X-Spam_score: -2.5 X-Spam_bar: -- X-Spam_report: (-2.5 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.445, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1782322915824158500 This eliminates a use of monitor_is_qmp() from the error reporting path. Reviewed-by: Marc-Andr=C3=A9 Lureau Tested-by: Peter Krempa Signed-off-by: Daniel P. Berrang=C3=A9 --- util/error-report.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/util/error-report.c b/util/error-report.c index f832ad9b6b..f333af9249 100644 --- a/util/error-report.c +++ b/util/error-report.c @@ -231,16 +231,15 @@ char *real_time_iso8601(void) G_GNUC_PRINTF(2, 0) static void vreport(report_type type, const char *fmt, va_list ap) { - Monitor *cur =3D monitor_cur(); - gchar *timestr; - /* * When current monitor is QMP, messages must go to stderr - * and have prefixes added + * and have prefixes added, so we cast to HMP, leaving 'cur' + * as NULL in QMP case */ - if (monitor_cur_is_qmp()) { - cur =3D NULL; - } + Monitor *cur =3D MONITOR( + object_dynamic_cast(OBJECT(monitor_cur()), TYPE_MONITOR_HMP)); + gchar *timestr; + if (!cur) { qemu_flockfile(stderr); } --=20 2.54.0 From nobody Wed Jun 24 21:40:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1782322991; cv=none; d=zohomail.com; s=zohoarc; b=eGlkzcuKxcoErpE3snTnjfdlI3I1UQMSRit8eghubaoa7SUKF9l4W5lwezLldmqZBFpNb9uukvZ6o96R05bGGE81dHvJzv2Pznfb3iXpHYIWqvrANiRdgzn/jgHhMxsJDKwqAmnbR2NCAgLOOeJUL4b7T51sQNtfYeFO3HOBmdg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782322991; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=48scUZ/AVH6sBd0rwVqS48vcL7DzpHoZlAUp7mirFwQ=; b=B7+9KiifYO+I+uazwHkaHFdrQm7YQKpVvs7Ac7+5F7q+vFLzJFOlGJlkzvJ9KS7xgckEaSk00Z7+CB4By/znKpdhgkMlv33c5OoZq85lTS63VXDYJxj7Vw3fuX9JaS+Y3di+vdr2hDK4s2jOq8LqtFYmFtdTYXKlZPCEJRT7W8Y= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782322991308830.2496869816096; Wed, 24 Jun 2026 10:43:11 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcRZR-0007xB-HE; Wed, 24 Jun 2026 13:39:29 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRZG-0007SL-TP for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:39:19 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRZB-0004XZ-Vy for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:39:16 -0400 Received: from mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-554-7KJzwyZtNROf_liKguexoA-1; Wed, 24 Jun 2026 13:39:09 -0400 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 5A5A41955EBA; Wed, 24 Jun 2026 17:39:08 +0000 (UTC) Received: from berrange.com (unknown [10.44.32.102]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 934B4180034F; Wed, 24 Jun 2026 17:39:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1782322750; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=48scUZ/AVH6sBd0rwVqS48vcL7DzpHoZlAUp7mirFwQ=; b=UXt3u+IobvhUzvmxI7MiamCwbcSjy1cE8Y0Y2+WNOWD3Je0X9k6PQyoBo6dZC8mbjabAEh sugtIQMSDZWMgQlYTIOZ7K3QE3h6taBAHCxOp3YQOFwq4m6dwgokhv9Z5vSEWPbo5kAkso EQ5xCoOObO+h1fURO08txyMBBzRz4Rw= X-MC-Unique: 7KJzwyZtNROf_liKguexoA-1 X-Mimecast-MFC-AGG-ID: 7KJzwyZtNROf_liKguexoA_1782322748 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: qemu-devel@nongnu.org Cc: devel@lists.libvirt.org, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Markus Armbruster , Paolo Bonzini , "Dr. David Alan Gilbert" , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Brauner , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Peter Krempa Subject: [PATCH v5 17/35] monitor: drop unused monitor_cur_is_qmp Date: Wed, 24 Jun 2026 18:37:33 +0100 Message-ID: <20260624173752.2928717-18-berrange@redhat.com> In-Reply-To: <20260624173752.2928717-1-berrange@redhat.com> References: <20260624173752.2928717-1-berrange@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: 8 X-Spam_score: 0.8 X-Spam_bar: / X-Spam_report: (0.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.445, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_SBL_CSS=3.335, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1782322992572158501 The previous patch dropped the only remaining use of monitor_cur_is_qmp. Reviewed-by: Marc-Andr=C3=A9 Lureau Tested-by: Peter Krempa Signed-off-by: Daniel P. Berrang=C3=A9 --- include/monitor/monitor.h | 1 - monitor/monitor.c | 10 ---------- stubs/monitor-core.c | 5 ----- tests/unit/test-util-sockets.c | 1 - tools/qemu-vnc/stubs.c | 5 ----- 5 files changed, 22 deletions(-) diff --git a/include/monitor/monitor.h b/include/monitor/monitor.h index 8cb3db677b..3f730cffee 100644 --- a/include/monitor/monitor.h +++ b/include/monitor/monitor.h @@ -25,7 +25,6 @@ extern QemuOptsList qemu_mon_opts; =20 Monitor *monitor_cur(void); Monitor *monitor_set_cur(Coroutine *co, Monitor *mon); -bool monitor_cur_is_qmp(void); =20 void monitor_init_globals(void); void monitor_init_globals_core(void); diff --git a/monitor/monitor.c b/monitor/monitor.c index b788669f1f..0db7903795 100644 --- a/monitor/monitor.c +++ b/monitor/monitor.c @@ -150,16 +150,6 @@ Monitor *monitor_set_cur(Coroutine *co, Monitor *mon) return old_monitor; } =20 -/** - * Is the current monitor, if any, a QMP monitor? - */ -bool monitor_cur_is_qmp(void) -{ - Monitor *cur_mon =3D monitor_cur(); - - return cur_mon && monitor_is_qmp(cur_mon); -} - bool monitor_requires_iothread(const Monitor *mon) { MonitorClass *cls =3D MONITOR_GET_CLASS(mon); diff --git a/stubs/monitor-core.c b/stubs/monitor-core.c index 078a5012e9..a7c32297c9 100644 --- a/stubs/monitor-core.c +++ b/stubs/monitor-core.c @@ -7,11 +7,6 @@ Monitor *monitor_cur(void) return NULL; } =20 -bool monitor_cur_is_qmp(void) -{ - return false; -} - Monitor *monitor_set_cur(Coroutine *co, Monitor *mon) { return NULL; diff --git a/tests/unit/test-util-sockets.c b/tests/unit/test-util-sockets.c index b9f2453e29..ee66d727c3 100644 --- a/tests/unit/test-util-sockets.c +++ b/tests/unit/test-util-sockets.c @@ -74,7 +74,6 @@ int monitor_get_fd(Monitor *mon, const char *fdname, Erro= r **errp) Monitor *monitor_cur(void) { return cur_mon; } Monitor *monitor_set_cur(Coroutine *co, Monitor *mon) { abort(); } int monitor_vprintf(Monitor *mon, const char *fmt, va_list ap) { abort(); } -bool monitor_cur_is_qmp(void) { abort(); }; =20 #ifndef _WIN32 static void test_socket_fd_pass_name_good(void) diff --git a/tools/qemu-vnc/stubs.c b/tools/qemu-vnc/stubs.c index a865ce85f0..1c82d8cff4 100644 --- a/tools/qemu-vnc/stubs.c +++ b/tools/qemu-vnc/stubs.c @@ -36,11 +36,6 @@ Monitor *monitor_cur(void) return NULL; } =20 -bool monitor_cur_is_qmp(void) -{ - return false; -} - Monitor *monitor_set_cur(Coroutine *co, Monitor *mon) { return NULL; --=20 2.54.0 From nobody Wed Jun 24 21:40:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1782322984; cv=none; d=zohomail.com; s=zohoarc; b=RRk/0kjMYYDnF+RVufzhgZELZOuhPh9ySvss2dHOxeSIvq8dnPTH/O/bQUFM45GoOWrrxqbRcMNcMqh/yreLgfF8NC3BpQ3jywp3gCenbVqTvqq/6cQNGf3xoXXEqCK8t8VmgtXL7mDeetrn+aS6OZZyIR6TU37lofGGR3vR3yo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782322984; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=ZZrM5fOskwl+JBf9uANf+y6dk2/mlPVy4FXHK5L6GrI=; b=lPLRH1AUGwBRG5Q2a3z6L17ZAPEdQkzz0hvGD7OaeoYq9RQ17kqsDVfnmoTrw7xMjssR+ekYqTrlFT/bhEu/f/TKz0ksVG0K7gPrcCt9LdcrZHfb0yEkICZjyyFsl7NjlHVaTqx9VVt+S9br2fOI80FE5KTo5dgv5LFQEsVfoAw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782322984971459.8088413466771; Wed, 24 Jun 2026 10:43:04 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcRZR-0007xu-N0; Wed, 24 Jun 2026 13:39:29 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRZI-0007U8-6T for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:39:21 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRZG-0004YU-Lu for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:39:19 -0400 Received: from mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-615-nA8ulpKnMoabQSidctlH4A-1; Wed, 24 Jun 2026 13:39:13 -0400 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 26A4C19540DE; Wed, 24 Jun 2026 17:39:12 +0000 (UTC) Received: from berrange.com (unknown [10.44.32.102]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id CA672180028B; Wed, 24 Jun 2026 17:39:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1782322756; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ZZrM5fOskwl+JBf9uANf+y6dk2/mlPVy4FXHK5L6GrI=; b=JS1ay22nQu9keE8J1+pp9vGU5eP/SQUx8tqM/6xRK/vfnf3C9blDDrRNsH36WsomFioX9N JIlgYtn/xM3EsxpeCFlTwtCwslyFIJDPDBA1a6mq7DBD8J9tlWRLFie6Mcwjy2O3U6zj5m LG/AkoY6qqjwXoCzoKSmrdZkRtCRfok= X-MC-Unique: nA8ulpKnMoabQSidctlH4A-1 X-Mimecast-MFC-AGG-ID: nA8ulpKnMoabQSidctlH4A_1782322752 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: qemu-devel@nongnu.org Cc: devel@lists.libvirt.org, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Markus Armbruster , Paolo Bonzini , "Dr. David Alan Gilbert" , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Brauner , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Peter Krempa Subject: [PATCH v5 18/35] monitor: use dynamic cast in QMP commands Date: Wed, 24 Jun 2026 18:37:34 +0100 Message-ID: <20260624173752.2928717-19-berrange@redhat.com> In-Reply-To: <20260624173752.2928717-1-berrange@redhat.com> References: <20260624173752.2928717-1-berrange@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: 8 X-Spam_score: 0.8 X-Spam_bar: / X-Spam_report: (0.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.445, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_SBL_CSS=3.335, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1782322986510158500 Rather than asserting monitor_is_qmp(), use a QOM cast via MONITOR_QMP which performs an assert already. Reviewed-by: Marc-Andr=C3=A9 Lureau Tested-by: Peter Krempa Signed-off-by: Daniel P. Berrang=C3=A9 --- monitor/qmp-cmds-control.c | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/monitor/qmp-cmds-control.c b/monitor/qmp-cmds-control.c index af6a2a118b..8fe0876a3d 100644 --- a/monitor/qmp-cmds-control.c +++ b/monitor/qmp-cmds-control.c @@ -72,11 +72,7 @@ static bool qmp_caps_accept(MonitorQMP *mon, QMPCapabili= tyList *list, void qmp_qmp_capabilities(bool has_enable, QMPCapabilityList *enable, Error **errp) { - Monitor *cur_mon =3D monitor_cur(); - MonitorQMP *mon; - - assert(monitor_is_qmp(cur_mon)); - mon =3D container_of(cur_mon, MonitorQMP, parent_obj); + MonitorQMP *mon =3D MONITOR_QMP(monitor_cur()); =20 if (mon->commands =3D=3D &qmp_commands) { error_set(errp, ERROR_CLASS_COMMAND_NOT_FOUND, @@ -122,11 +118,7 @@ static void query_commands_cb(const QmpCommand *cmd, v= oid *opaque) CommandInfoList *qmp_query_commands(Error **errp) { CommandInfoList *list =3D NULL; - Monitor *cur_mon =3D monitor_cur(); - MonitorQMP *mon; - - assert(monitor_is_qmp(cur_mon)); - mon =3D container_of(cur_mon, MonitorQMP, parent_obj); + MonitorQMP *mon =3D MONITOR_QMP(monitor_cur()); =20 qmp_for_each_command(mon->commands, query_commands_cb, &list); =20 --=20 2.54.0 From nobody Wed Jun 24 21:40:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1782322940; cv=none; d=zohomail.com; s=zohoarc; b=FVimAjlXXqSrNk/F5Y7ZL4lz4aaTJBdqbsUWh/7PMtRob7xzUiPQzqNRUzZGPq5jaa48dfL3DmBBYjEpKmEf0IVwa3eDBy+/6hyVTiedo7veW2SaAz5BzIlrsRfQKTAP7KExkIQXXnUrF6xjw4xcbb4qCWlrrCnzmJR4LfTG0Fw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782322940; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=EtHBwhGM0OxedP9yj0wwn9Z3d1R71OEvrcfGERIJzXM=; b=XJZ27iafFNwlnbsPZvxZSD5sZlPxOEQAo9+vVvYlq45wUpzV7IS4jAx8nKcLv8V6zJ1ubnCCAnpS51swmZTlQYR8riYdYzunVJ0M5ZLRnKRYcMoKIxA60WcLkx1RuJd1b+62ZEVuEYk6j9Lt6JgYTpOvUbhN4V4iUudefsxQmP8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782322940344243.64502231468043; Wed, 24 Jun 2026 10:42:20 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcRZQ-0007l0-Fn; Wed, 24 Jun 2026 13:39:28 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRZM-0007X5-ES for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:39:25 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRZL-0004ZC-2r for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:39:24 -0400 Received: from mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-677-4pCTdj5aOYOU5s5EDp878A-1; Wed, 24 Jun 2026 13:39:17 -0400 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 0632A1955E91; Wed, 24 Jun 2026 17:39:16 +0000 (UTC) Received: from berrange.com (unknown [10.44.32.102]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 957AF180034F; Wed, 24 Jun 2026 17:39:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1782322762; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=EtHBwhGM0OxedP9yj0wwn9Z3d1R71OEvrcfGERIJzXM=; b=gYfa6xt6DM+CdCkkXCa1PbsvJfv3EssE57HQjauYJv5tjrTW/B7mUk6Ui/eQwrP79VY0CZ nOqy0NgY7ze1SVr4syf4j77NLje3NQyKtdXEllhPT/UolXIEAjrm4YYzEbbnayXJfag5rr C65zMRynq3w1Iew+suDrCMrXvc46fiA= X-MC-Unique: 4pCTdj5aOYOU5s5EDp878A-1 X-Mimecast-MFC-AGG-ID: 4pCTdj5aOYOU5s5EDp878A_1782322756 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: qemu-devel@nongnu.org Cc: devel@lists.libvirt.org, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Markus Armbruster , Paolo Bonzini , "Dr. David Alan Gilbert" , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Brauner , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Peter Krempa Subject: [PATCH v5 19/35] monitor: use dynamic cast in monitor_is_hmp_non_interactive Date: Wed, 24 Jun 2026 18:37:35 +0100 Message-ID: <20260624173752.2928717-20-berrange@redhat.com> In-Reply-To: <20260624173752.2928717-1-berrange@redhat.com> References: <20260624173752.2928717-1-berrange@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: 8 X-Spam_score: 0.8 X-Spam_bar: / X-Spam_report: (0.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.445, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_SBL_CSS=3.335, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1782322942001158500 Rather than checking !monitor_is_qmp(), use a dynamic cast to check for HMP. Reviewed-by: Marc-Andr=C3=A9 Lureau Tested-by: Peter Krempa Signed-off-by: Daniel P. Berrang=C3=A9 --- monitor/monitor.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monitor/monitor.c b/monitor/monitor.c index 0db7903795..15e49d78d7 100644 --- a/monitor/monitor.c +++ b/monitor/monitor.c @@ -168,7 +168,7 @@ static inline bool monitor_uses_readline(const MonitorH= MP *mon) =20 static inline bool monitor_is_hmp_non_interactive(const Monitor *mon) { - if (monitor_is_qmp(mon)) { + if (!object_dynamic_cast(OBJECT(mon), TYPE_MONITOR_HMP)) { return false; } =20 --=20 2.54.0 From nobody Wed Jun 24 21:40:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1782322799; cv=none; d=zohomail.com; s=zohoarc; b=E/2rL4HP/15o7HYvkEpgQIvb1pNgYcSjkhVgoXCSwNb/6tOTN1Fx8YDEX4qV3UUk2hTc9A9FhsJJKlUqhkQx72GLpP0QZc09D58+ftQuxEG3xquCahgFswjVHsL5LsrMP9X1/KZCfxVSMad6JDGKJOKia1Phx9kcnKRhQ4+VMXc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782322799; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=cDw7FK2GFc0CLOHzGAmCMXIdnC3eWhgOvX3tnpiV70g=; b=YjbxdbHV/dJRjTUFKIasJyXeEAX/bahBUDncEWu3517yZZkrH1GVfQ2N4KECLpmEF94P64G3cguisi7Lue5IkHxdu4sk9uqMgumbpcVxt4qCrKKQ5cqpojIANm/c/MMjG1qiOoRgbOeQrpU6fDRKQ8uApmyBSy/pcuuUXWDB2rM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782322799670502.69383415165805; Wed, 24 Jun 2026 10:39:59 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcRZU-0008A4-0X; Wed, 24 Jun 2026 13:39:32 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRZQ-0007pI-US for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:39:29 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRZP-0004ZP-5I for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:39:28 -0400 Received: from mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-33-PnGHmbtBOoiWwKzGz_RkaA-1; Wed, 24 Jun 2026 13:39:21 -0400 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id D80451955EA4; Wed, 24 Jun 2026 17:39:19 +0000 (UTC) Received: from berrange.com (unknown [10.44.32.102]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 74C7A180028B; Wed, 24 Jun 2026 17:39:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1782322764; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=cDw7FK2GFc0CLOHzGAmCMXIdnC3eWhgOvX3tnpiV70g=; b=UyFWjU2k2d3cIK6tpxmO4C0NdvFqOL1mnI/HEy89Fzyh3rpJL+AV/aL+APKGI/DS0NbBVI aWiTFeVfWBchswrHCBglCsEgbdmwD0RCXdMMxsUlmSX2LKSOhTJ7Yz2Rte3fKZS9/TaejA ZNS8GgroE7xRDIV0ir8eZhL/s+pOF34= X-MC-Unique: PnGHmbtBOoiWwKzGz_RkaA-1 X-Mimecast-MFC-AGG-ID: PnGHmbtBOoiWwKzGz_RkaA_1782322760 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: qemu-devel@nongnu.org Cc: devel@lists.libvirt.org, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Markus Armbruster , Paolo Bonzini , "Dr. David Alan Gilbert" , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Brauner , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Peter Krempa Subject: [PATCH v5 20/35] monitor: drop unused monitor_is_qmp method Date: Wed, 24 Jun 2026 18:37:36 +0100 Message-ID: <20260624173752.2928717-21-berrange@redhat.com> In-Reply-To: <20260624173752.2928717-1-berrange@redhat.com> References: <20260624173752.2928717-1-berrange@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: 8 X-Spam_score: 0.8 X-Spam_bar: / X-Spam_report: (0.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.445, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_SBL_CSS=3.335, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1782322801100158500 The previous patch dropped the only remaining use of monitor_is_qmp. Reviewed-by: Marc-Andr=C3=A9 Lureau Tested-by: Peter Krempa Signed-off-by: Daniel P. Berrang=C3=A9 --- monitor/monitor-internal.h | 9 --------- monitor/monitor.c | 1 - 2 files changed, 10 deletions(-) diff --git a/monitor/monitor-internal.h b/monitor/monitor-internal.h index efd21b8912..fe5703af6d 100644 --- a/monitor/monitor-internal.h +++ b/monitor/monitor-internal.h @@ -134,7 +134,6 @@ struct Monitor { char *chardev_id; CharFrontend chr; int suspend_cnt; /* Needs to be accessed atomically */ - bool is_qmp; =20 char *mon_cpu_path; QTAILQ_ENTRY(Monitor) entry; @@ -197,14 +196,6 @@ struct MonitorQMP { GQueue *qmp_requests; }; =20 -/** - * Is @mon a QMP monitor? - */ -static inline bool monitor_is_qmp(const Monitor *mon) -{ - return mon->is_qmp; -} - typedef QTAILQ_HEAD(MonitorList, Monitor) MonitorList; extern IOThread *mon_iothread; extern Coroutine *qmp_dispatcher_co; diff --git a/monitor/monitor.c b/monitor/monitor.c index 15e49d78d7..6ed586fc4f 100644 --- a/monitor/monitor.c +++ b/monitor/monitor.c @@ -113,7 +113,6 @@ static void monitor_init(Object *obj) Monitor *mon =3D MONITOR(obj); =20 qemu_mutex_init(&mon->mon_lock); - mon->is_qmp =3D !!object_dynamic_cast(obj, TYPE_MONITOR_QMP); mon->outbuf =3D g_string_new(NULL); } =20 --=20 2.54.0 From nobody Wed Jun 24 21:40:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1782322883; cv=none; d=zohomail.com; s=zohoarc; b=muVbtQHIJib1/xJIUt4zaV0HEJRTBXGR4hinZrNnYFxrpiTJWbzFpftAIrvppbhyEBAt2WHjMVD08ekiunAEWLWiXX90tiWljLxGT9R7HhxH84UJdVNn9kP7FYwHj7359jJr8iPO+lCs9IVM11Gad94seLP4lE1n4Hj3aTs6G8g= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782322883; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=49VmJdPBQFt7XW7Zwm56uj3jkNQpAb7KfbJJGWpDGNc=; b=jgrb32QWEeBq82MX5BL1V0fwr6M8wP5a4Pg4iDUbxetzxhGb1YrwuYUcmWTYg8aDoQK5B6b3bzgvnXlv82PhmBNOBfisqUGmdFcBCmewCQFijmOwyOZs3vOxLgxBtMwKen+Hxf5KGspqmKsIlIgHvVQoevSQVHMZ191g4HUyaTE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782322883251903.040825601665; Wed, 24 Jun 2026 10:41:23 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcRZT-00087i-GZ; Wed, 24 Jun 2026 13:39:31 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRZR-0007wx-BR for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:39:29 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRZP-0004Zb-5y for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:39:29 -0400 Received: from mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-146-RwPXa1d8MUuOBAgAK-vKMw-1; Wed, 24 Jun 2026 13:39:24 -0400 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 95D771954237; Wed, 24 Jun 2026 17:39:23 +0000 (UTC) Received: from berrange.com (unknown [10.44.32.102]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 5532A180034F; Wed, 24 Jun 2026 17:39:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1782322766; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=49VmJdPBQFt7XW7Zwm56uj3jkNQpAb7KfbJJGWpDGNc=; b=hiX3vxSNmHyG7DVMO9OPxfn6XLpJgb6zAdDhkKr8/Q89vqXkHlWVbAjfooj14dH2hPZOnV UFGMf/sA6kOvX2MQmEnFUWqw76nABKolv8optD92GHVq5hhN7Ea0W+I115DLAeaRq5is2n 8r6ouGtq/EV4axuhHi/33IFAJAIWAXU= X-MC-Unique: RwPXa1d8MUuOBAgAK-vKMw-1 X-Mimecast-MFC-AGG-ID: RwPXa1d8MUuOBAgAK-vKMw_1782322763 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: qemu-devel@nongnu.org Cc: devel@lists.libvirt.org, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Markus Armbruster , Paolo Bonzini , "Dr. David Alan Gilbert" , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Brauner , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Peter Krempa Subject: [PATCH v5 21/35] monitor: eliminate monitor_is_hmp_non_interactive method Date: Wed, 24 Jun 2026 18:37:37 +0100 Message-ID: <20260624173752.2928717-22-berrange@redhat.com> In-Reply-To: <20260624173752.2928717-1-berrange@redhat.com> References: <20260624173752.2928717-1-berrange@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: 8 X-Spam_score: 0.8 X-Spam_bar: / X-Spam_report: (0.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.445, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_SBL_CSS=3.335, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1782322883936158500 The monitor_is_hmp_non_interactive method is used by monitor_suspend and monitor_resume, to make them a no-op if the HMP does not use readline. There are only a handful of callers of suspend/resume and they can be made to skip the call when readline is not present. Reviewed-by: Marc-Andr=C3=A9 Lureau Tested-by: Peter Krempa Signed-off-by: Daniel P. Berrang=C3=A9 --- include/monitor/monitor.h | 2 +- migration/migration-hmp-cmds.c | 5 ++++- monitor/hmp-cmds.c | 5 ++++- monitor/hmp.c | 11 ++++++++--- monitor/monitor.c | 30 +----------------------------- 5 files changed, 18 insertions(+), 35 deletions(-) diff --git a/include/monitor/monitor.h b/include/monitor/monitor.h index 3f730cffee..ffda343585 100644 --- a/include/monitor/monitor.h +++ b/include/monitor/monitor.h @@ -34,7 +34,7 @@ int monitor_new(MonitorOptions *opts, bool allow_hmp, Err= or **errp); int monitor_new_opts(QemuOpts *opts, Error **errp); void monitor_cleanup(void); =20 -int monitor_suspend(Monitor *mon); +void monitor_suspend(Monitor *mon); void monitor_resume(Monitor *mon); =20 int monitor_get_fd(Monitor *mon, const char *fdname, Error **errp); diff --git a/migration/migration-hmp-cmds.c b/migration/migration-hmp-cmds.c index 8b385f560e..502ca704da 100644 --- a/migration/migration-hmp-cmds.c +++ b/migration/migration-hmp-cmds.c @@ -19,6 +19,7 @@ #include "monitor/hmp.h" #include "monitor/hmp-completion.h" #include "monitor/monitor.h" +#include "monitor/monitor-internal.h" #include "qapi/error.h" #include "qapi/qapi-commands-migration.h" #include "qapi/qapi-visit-migration.h" @@ -853,12 +854,14 @@ void hmp_migrate(Monitor *mon, const QDict *qdict) =20 if (!detach) { HMPMigrationStatus *status; + MonitorHMP *hmp =3D MONITOR_HMP(mon); =20 - if (monitor_suspend(mon) < 0) { + if (!hmp->use_readline) { monitor_printf(mon, "terminal does not allow synchronous " "migration, continuing detached\n"); return; } + monitor_suspend(mon); =20 status =3D g_malloc0(sizeof(*status)); status->mon =3D mon; diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c index e139caeba9..e9fb8d827a 100644 --- a/monitor/hmp-cmds.c +++ b/monitor/hmp-cmds.c @@ -129,7 +129,10 @@ void hmp_info_version(Monitor *mon, const QDict *qdict) =20 void hmp_quit(Monitor *mon, const QDict *qdict) { - monitor_suspend(mon); + MonitorHMP *hmp =3D MONITOR_HMP(mon); + if (hmp->use_readline) { + monitor_suspend(mon); + } qmp_quit(NULL); } =20 diff --git a/monitor/hmp.c b/monitor/hmp.c index 1da9370ead..b8cccdcde3 100644 --- a/monitor/hmp.c +++ b/monitor/hmp.c @@ -1528,13 +1528,16 @@ static void monitor_read(void *opaque, const uint8_= t *buf, int size) static void monitor_event(void *opaque, QEMUChrEvent event) { Monitor *mon =3D opaque; + MonitorHMP *hmp =3D MONITOR_HMP(mon); =20 switch (event) { case CHR_EVENT_MUX_IN: qemu_mutex_lock(&mon->mon_lock); if (mon->mux_out) { mon->mux_out =3D 0; - monitor_resume(mon); + if (hmp->use_readline) { + monitor_resume(mon); + } } qemu_mutex_unlock(&mon->mon_lock); break; @@ -1547,7 +1550,9 @@ static void monitor_event(void *opaque, QEMUChrEvent = event) } else { monitor_flush_locked(mon); } - monitor_suspend(mon); + if (hmp->use_readline) { + monitor_suspend(mon); + } mon->mux_out =3D 1; } qemu_mutex_unlock(&mon->mon_lock); @@ -1558,7 +1563,7 @@ static void monitor_event(void *opaque, QEMUChrEvent = event) "information\n", QEMU_VERSION); qemu_mutex_lock(&mon->mon_lock); mon->reset_seen =3D 1; - if (!mon->mux_out) { + if (!mon->mux_out && hmp->use_readline) { /* Suspend-resume forces the prompt to be printed. */ monitor_suspend(mon); monitor_resume(mon); diff --git a/monitor/monitor.c b/monitor/monitor.c index 6ed586fc4f..f88364a574 100644 --- a/monitor/monitor.c +++ b/monitor/monitor.c @@ -155,25 +155,6 @@ bool monitor_requires_iothread(const Monitor *mon) return cls->requires_iothread && cls->requires_iothread(mon); } =20 -/** - * Is @mon is using readline? - * Note: not all HMP monitors use readline, e.g., gdbserver has a - * non-interactive HMP monitor, so readline is not used there. - */ -static inline bool monitor_uses_readline(const MonitorHMP *mon) -{ - return mon->use_readline; -} - -static inline bool monitor_is_hmp_non_interactive(const Monitor *mon) -{ - if (!object_dynamic_cast(OBJECT(mon), TYPE_MONITOR_HMP)) { - return false; - } - - return !monitor_uses_readline(container_of(mon, MonitorHMP, parent_obj= )); -} - static gboolean monitor_unblocked(void *do_not_use, GIOCondition cond, void *opaque) { @@ -548,12 +529,8 @@ static gboolean qapi_event_throttle_equal(const void *= a, const void *b) return TRUE; } =20 -int monitor_suspend(Monitor *mon) +void monitor_suspend(Monitor *mon) { - if (monitor_is_hmp_non_interactive(mon)) { - return -ENOTTY; - } - qatomic_inc(&mon->suspend_cnt); =20 if (monitor_requires_iothread(mon)) { @@ -565,7 +542,6 @@ int monitor_suspend(Monitor *mon) } =20 trace_monitor_suspend(mon, 1); - return 0; } =20 static void monitor_accept_input(void *opaque) @@ -582,10 +558,6 @@ static void monitor_accept_input(void *opaque) =20 void monitor_resume(Monitor *mon) { - if (monitor_is_hmp_non_interactive(mon)) { - return; - } - if (qatomic_dec_fetch(&mon->suspend_cnt) =3D=3D 0) { AioContext *ctx; =20 --=20 2.54.0 From nobody Wed Jun 24 21:40:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1782322964; cv=none; d=zohomail.com; s=zohoarc; b=P4bRq2oOL4YWhiAVa/3mUFup+OMOiUj1DwcFhFPSYQKMj/MI0riEKhKI6WaQCzGgI+CbESHu75GfHN5G1fLyQAsZqxiTMAbBb4RRs3PZWbJH4mh5C2iqrithUzwTlgeD7FpROWgyFPt/xTUB0Dm6NdGZbklK9+n1rcr+zCrh1nk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782322964; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=N9XoFvS3r9VpL+U+YunYnw0ier3DD+LnH6jGHL/N9ic=; b=gHkRRwMic8YxG1XoZLvAczi7FAiWuxP0T8CgOjovdFFwDFDfmrQ68I0k5EG23fdbMsYuMaino4rVdnly7q9NrWih+uq8j4jeBb2RFusQWzGemdsurVFap/Dr/vY9vjbg4+hC0OsWV/FMN9f8xtBNJMjOQ7TL7vTtoncZA4wo7KE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782322964322894.3152382293295; Wed, 24 Jun 2026 10:42:44 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcRZZ-0000dF-Qy; Wed, 24 Jun 2026 13:39:37 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRZX-0000EZ-6y for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:39:35 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRZU-0004aO-N6 for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:39:34 -0400 Received: from mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-453-uzHwfGhtO0q9UB3NA--tjw-1; Wed, 24 Jun 2026 13:39:28 -0400 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 79E691955F6F; Wed, 24 Jun 2026 17:39:27 +0000 (UTC) Received: from berrange.com (unknown [10.44.32.102]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 1C3EB180034F; Wed, 24 Jun 2026 17:39:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1782322771; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=N9XoFvS3r9VpL+U+YunYnw0ier3DD+LnH6jGHL/N9ic=; b=IYEIy8RGDl4QvynqfHFT1id9i0MnwDNYg7l0RUFfL48tZ65hwMFFxMXqGz94cY5Sx883U1 GLfb+kCiFXiLpAVpXOVKNu9KbvVCJ9y4q35vWavoWVKDEG02PE3sOCl8LjRLQ5akjqGrOn ibG/cn4MCYHW5HxsyXVNy9IuWLDWORo= X-MC-Unique: uzHwfGhtO0q9UB3NA--tjw-1 X-Mimecast-MFC-AGG-ID: uzHwfGhtO0q9UB3NA--tjw_1782322767 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: qemu-devel@nongnu.org Cc: devel@lists.libvirt.org, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Markus Armbruster , Paolo Bonzini , "Dr. David Alan Gilbert" , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Brauner , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Peter Krempa Subject: [PATCH v5 22/35] monitor: implement "user creatable" interface for adding monitors Date: Wed, 24 Jun 2026 18:37:38 +0100 Message-ID: <20260624173752.2928717-23-berrange@redhat.com> In-Reply-To: <20260624173752.2928717-1-berrange@redhat.com> References: <20260624173752.2928717-1-berrange@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: 8 X-Spam_score: 0.8 X-Spam_bar: / X-Spam_report: (0.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.445, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_SBL_CSS=3.335, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1782322966481158500 Implement the user creatable QOM interface and define the monitor-qmp and monitor-hmp types in QAPI. This unlocks the ability to create them on the command line with -object or in HMP/QMP with object_add. For example: $QEMU -chardev stdio,id=3Dmonchr0 -object monitor-hmp,id=3Dmon0,chrdev=3D= monchr0 Initially the "prepare_delete" callback is hardcoded to return an error which means -object and object_add can be used, but object_del will fail. Support for deleting monitors will be introduced in subsequent commits. Reviewed-by: Marc-Andr=C3=A9 Lureau Tested-by: Peter Krempa Signed-off-by: Daniel P. Berrang=C3=A9 --- monitor/hmp.c | 70 ++++++++++++++++++++++++-------------- monitor/monitor-internal.h | 1 - monitor/monitor.c | 14 ++++++-- monitor/qmp.c | 46 +++++++++++++++++-------- qapi/qom.json | 43 +++++++++++++++++++++++ stubs/monitor-internal.c | 1 + system/vl.c | 8 ++++- 7 files changed, 138 insertions(+), 45 deletions(-) diff --git a/monitor/hmp.c b/monitor/hmp.c index b8cccdcde3..2cd508f1ee 100644 --- a/monitor/hmp.c +++ b/monitor/hmp.c @@ -40,6 +40,7 @@ #include "qemu/base-arch-defs.h" #include "qemu/target-info.h" #include "qemu/units.h" +#include "qom/object_interfaces.h" #include "exec/gdbstub.h" #include "system/block-backend.h" #include "trace.h" @@ -71,10 +72,13 @@ static void monitor_hmp_set_readline(Object *obj, bool = val, Error **errp) int monitor_hmp_vprintf(Monitor *mon, const char *fmt, va_list ap) G_GNUC_PRINTF(2, 0); static void monitor_hmp_accept_input(Monitor *mon); +static void monitor_hmp_complete(UserCreatable *uc, Error **errp); +static bool monitor_hmp_prepare_delete(UserCreatable *uc, Error **errp); =20 static void monitor_hmp_class_init(ObjectClass *cls, const void *data) { MonitorClass *moncls =3D MONITOR_CLASS(cls); + UserCreatableClass *ucc =3D USER_CREATABLE_CLASS(cls); =20 object_class_property_add_bool(cls, "readline", monitor_hmp_get_readline, @@ -82,6 +86,9 @@ static void monitor_hmp_class_init(ObjectClass *cls, cons= t void *data) =20 moncls->vprintf =3D monitor_hmp_vprintf; moncls->accept_input =3D monitor_hmp_accept_input; + + ucc->complete =3D monitor_hmp_complete; + ucc->prepare_delete =3D monitor_hmp_prepare_delete; } =20 static void monitor_hmp_init(Object *obj) @@ -1604,42 +1611,53 @@ static void monitor_readline_flush(void *opaque) =20 void monitor_new_hmp(const char *chardev_id, bool use_readline, Error **er= rp) { - ERRP_GUARD(); - MonitorHMP *mon; static int counter; g_autofree char *id =3D g_strdup_printf("hmpcompat%d", counter++); - Object *obj =3D object_new_with_props(TYPE_MONITOR_HMP, - object_get_objects_root(), - id, - errp, - "chardev", chardev_id, - "readline", use_readline ? "yes" := "no", - NULL); - - if (!obj) { - return; - } + object_new_with_props(TYPE_MONITOR_HMP, + object_get_objects_root(), + id, + errp, + "chardev", chardev_id, + "readline", use_readline ? "yes" : "no", + NULL); +} =20 - mon =3D MONITOR_HMP(obj); +static void monitor_hmp_complete(UserCreatable *uc, Error **errp) +{ + MonitorHMP *mon =3D MONITOR_HMP(uc); + UserCreatableClass *ucc_parent =3D + USER_CREATABLE_CLASS( + object_class_get_parent( + OBJECT_CLASS(MONITOR_HMP_GET_CLASS(mon)))); + ERRP_GUARD(); =20 - monitor_complete(MONITOR(mon), errp); + ucc_parent->complete(uc, errp); if (*errp) { - object_unparent(OBJECT(mon)); return; } =20 - if (mon->use_readline) { - mon->rs =3D readline_init(monitor_readline_printf, - monitor_readline_flush, - mon, - monitor_find_completion); - monitor_read_command(mon, 0); + if (mon->parent_obj.chardev_id) { + if (mon->use_readline) { + mon->rs =3D readline_init(monitor_readline_printf, + monitor_readline_flush, + mon, + monitor_find_completion); + monitor_read_command(mon, 0); + } + + qemu_chr_fe_set_handlers(&mon->parent_obj.chr, + monitor_can_read, + monitor_read, + monitor_event, NULL, + &mon->parent_obj, NULL, true); + monitor_list_append(&mon->parent_obj); } +} =20 - qemu_chr_fe_set_handlers(&mon->parent_obj.chr, - monitor_can_read, monitor_read, monitor_event, - NULL, &mon->parent_obj, NULL, true); - monitor_list_append(&mon->parent_obj); +static bool monitor_hmp_prepare_delete(UserCreatable *uc, Error **errp) +{ + error_setg(errp, "Deleting HMP monitors is not supported"); + return false; } =20 /** diff --git a/monitor/monitor-internal.h b/monitor/monitor-internal.h index fe5703af6d..012d442a20 100644 --- a/monitor/monitor-internal.h +++ b/monitor/monitor-internal.h @@ -204,7 +204,6 @@ extern QmpCommandList qmp_commands, qmp_cap_negotiation= _commands; extern QemuMutex monitor_lock; extern MonitorList mon_list; =20 -void monitor_complete(Monitor *mon, Error **errp); bool monitor_requires_iothread(const Monitor *mon); int monitor_can_read(void *opaque); void monitor_list_append(Monitor *mon); diff --git a/monitor/monitor.c b/monitor/monitor.c index f88364a574..bf5e8a184a 100644 --- a/monitor/monitor.c +++ b/monitor/monitor.c @@ -29,6 +29,7 @@ #include "qapi/qapi-emit-events.h" #include "qapi/qapi-visit-control.h" #include "qobject/qdict.h" +#include "qom/object_interfaces.h" #include "qemu/error-report.h" #include "qemu/option.h" #include "system/qtest.h" @@ -73,7 +74,8 @@ static GHashTable *coroutine_mon; /* Maps Coroutine* to M= onitor* */ MonitorList mon_list; static bool monitor_destroyed; =20 -OBJECT_DEFINE_TYPE(Monitor, monitor, MONITOR, OBJECT); +OBJECT_DEFINE_TYPE_EXTENDED(Monitor, monitor, MONITOR, OBJECT, true, + { TYPE_USER_CREATABLE }, {}); =20 static void monitor_finalize(Object *obj) { @@ -101,11 +103,17 @@ static void monitor_set_chardev_id(Object *obj, const= char *str, Error **errp) mon->chardev_id =3D g_strdup(str); } =20 +static void monitor_complete(UserCreatable *uc, Error **errp); + static void monitor_class_init(ObjectClass *cls, const void *data) { + UserCreatableClass *ucc =3D USER_CREATABLE_CLASS(cls); + object_class_property_add_str(cls, "chardev", monitor_get_chardev_id, monitor_set_chardev_id); + + ucc->complete =3D monitor_complete; } =20 static void monitor_init(Object *obj) @@ -680,8 +688,10 @@ void monitor_init_globals(void) aio_co_schedule(iohandler_get_aio_context(), qmp_dispatcher_co); } =20 -void monitor_complete(Monitor *mon, Error **errp) +static void monitor_complete(UserCreatable *uc, Error **errp) { + Monitor *mon =3D MONITOR(uc); + if (mon->chardev_id) { Chardev *chr =3D qemu_chr_find(mon->chardev_id); if (chr =3D=3D NULL) { diff --git a/monitor/qmp.c b/monitor/qmp.c index d2a03bb7e3..0e1c3eb52b 100644 --- a/monitor/qmp.c +++ b/monitor/qmp.c @@ -31,6 +31,7 @@ #include "qobject/qdict.h" #include "qobject/qjson.h" #include "qobject/qlist.h" +#include "qom/object_interfaces.h" #include "trace.h" =20 /* @@ -101,10 +102,13 @@ static void monitor_qmp_set_pretty(Object *obj, bool = val, Error **errp) =20 static void monitor_qmp_emit_event(Monitor *mon, QAPIEvent event, QDict *q= dict); static bool monitor_qmp_requires_iothread(const Monitor *mon); +static void monitor_qmp_complete(UserCreatable *uc, Error **errp); +static bool monitor_qmp_prepare_delete(UserCreatable *uc, Error **errp); =20 static void monitor_qmp_class_init(ObjectClass *cls, const void *data) { MonitorClass *moncls =3D MONITOR_CLASS(cls); + UserCreatableClass *ucc =3D USER_CREATABLE_CLASS(cls); =20 object_class_property_add_bool(cls, "pretty", monitor_qmp_get_pretty, @@ -112,6 +116,9 @@ static void monitor_qmp_class_init(ObjectClass *cls, co= nst void *data) =20 moncls->emit_event =3D monitor_qmp_emit_event; moncls->requires_iothread =3D monitor_qmp_requires_iothread; + + ucc->complete =3D monitor_qmp_complete; + ucc->prepare_delete =3D monitor_qmp_prepare_delete; } =20 static void handle_qmp_command(void *opaque, QObject *req, Error *err); @@ -583,25 +590,28 @@ static void monitor_qmp_setup_handlers_bh(void *opaqu= e) void monitor_new_qmp(const char *chardev_id, bool pretty, Error **errp) { ERRP_GUARD(); - MonitorQMP *mon; static int counter; g_autofree char *id =3D g_strdup_printf("qmpcompat%d", counter++); - Object *obj =3D object_new_with_props(TYPE_MONITOR_QMP, - object_get_objects_root(), - id, - errp, - "chardev", chardev_id, - "pretty", pretty ? "yes" : "no", - NULL); - - if (!obj) { - return; - } + object_new_with_props(TYPE_MONITOR_QMP, + object_get_objects_root(), + id, + errp, + "chardev", chardev_id, + "pretty", pretty ? "yes" : "no", + NULL); +} =20 - mon =3D MONITOR_QMP(obj); - monitor_complete(MONITOR(mon), errp); +static void monitor_qmp_complete(UserCreatable *uc, Error **errp) +{ + MonitorQMP *mon =3D MONITOR_QMP(uc); + UserCreatableClass *ucc_parent =3D + USER_CREATABLE_CLASS( + object_class_get_parent( + OBJECT_CLASS(MONITOR_QMP_GET_CLASS(mon)))); + ERRP_GUARD(); + + ucc_parent->complete(uc, errp); if (*errp) { - object_unparent(OBJECT(mon)); return; } =20 @@ -633,3 +643,9 @@ void monitor_new_qmp(const char *chardev_id, bool prett= y, Error **errp) monitor_list_append(&mon->parent_obj); } } + +static bool monitor_qmp_prepare_delete(UserCreatable *uc, Error **errp) +{ + error_setg(errp, "Deleting QMP monitors is not supported"); + return false; +} diff --git a/qapi/qom.json b/qapi/qom.json index dd45ac1087..6affb70a59 100644 --- a/qapi/qom.json +++ b/qapi/qom.json @@ -1187,6 +1187,45 @@ 'data': { '*cpu-affinity': ['uint16'], '*node-affinity': ['uint16'] } } =20 +## +# @MonitorProperties: +# +# Properties for all monitors +# +# @chardev: ID of the character device providing the monitor transport +# +# Since: 11.1 +## +{ 'struct': 'MonitorProperties', + 'data': { 'chardev': 'str' }} + +## +# @MonitorHMPProperties: +# +# Properties for the HMP monitor +# +# @readline: whether to enable readline for line editing +# (default: enabled) +# +# Since: 11.1 +## +{ 'struct': 'MonitorHMPProperties', + 'base': 'MonitorProperties', + 'data': { '*readline': 'bool' } } + +## +# @MonitorQMPProperties: +# +# Properties for the QMP monitor +# +# @pretty: whether to pretty print JSON responses (default: disabled) +# +# Since: 11.1 +## +{ 'struct': 'MonitorQMPProperties', + 'base': 'MonitorProperties', + 'data': { '*pretty': 'bool' } } + ## # @ObjectType: # @@ -1237,6 +1276,8 @@ 'memory-backend-ram', { 'name': 'memory-backend-shm', 'if': 'CONFIG_POSIX' }, + 'monitor-hmp', + 'monitor-qmp', 'pef-guest', { 'name': 'pr-manager-helper', 'if': 'CONFIG_LINUX' }, @@ -1315,6 +1356,8 @@ 'memory-backend-ram': 'MemoryBackendProperties', 'memory-backend-shm': { 'type': 'MemoryBackendShmProperties', 'if': 'CONFIG_POSIX' }, + 'monitor-hmp': {'type': 'MonitorHMPProperties' }, + 'monitor-qmp': {'type': 'MonitorQMPProperties' }, 'pr-manager-helper': { 'type': 'PrManagerHelperProperties', 'if': 'CONFIG_LINUX' }, 'qtest': 'QtestProperties', diff --git a/stubs/monitor-internal.c b/stubs/monitor-internal.c index 51db7588b9..59ccc4b35c 100644 --- a/stubs/monitor-internal.c +++ b/stubs/monitor-internal.c @@ -10,4 +10,5 @@ int monitor_get_fd(Monitor *mon, const char *name, Error = **errp) =20 void monitor_new_hmp(const char *chardev_id, bool use_readline, Error **er= rp) { + g_assert_not_reached(); } diff --git a/system/vl.c b/system/vl.c index fb36140aac..79ed2be449 100644 --- a/system/vl.c +++ b/system/vl.c @@ -1830,6 +1830,10 @@ static void object_option_add_visitor(Visitor *v) { ObjectOption *opt =3D g_new0(ObjectOption, 1); visit_type_ObjectOptions(v, NULL, &opt->opts, &error_fatal); + if (opt->opts->qom_type =3D=3D OBJECT_TYPE_MONITOR_HMP || + opt->opts->qom_type =3D=3D OBJECT_TYPE_MONITOR_QMP) { + default_monitor =3D 0; + } QTAILQ_INSERT_TAIL(&object_opts, opt, next); } =20 @@ -1971,7 +1975,9 @@ static bool object_create_early(const char *type) =20 /* Reason: property "chardev" */ if (g_str_equal(type, "rng-egd") || - g_str_equal(type, "qtest")) { + g_str_equal(type, "qtest") || + g_str_equal(type, "monitor-hmp") || + g_str_equal(type, "monitor-qmp")) { return false; } =20 --=20 2.54.0 From nobody Wed Jun 24 21:40:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1782322934; cv=none; d=zohomail.com; s=zohoarc; b=fIvq/NJa8FEIfLKqpfKRy9RW3JSHjn2sRVauKLzLrDxDpsxob0Td2rcmRz9GCTH1NoGcARfFnxlrWcfFgbd2RMN044Ax2g6JfUU9Ff6FacRMInyvf1p9GQr6fbpT3S6dg9G3WVwtB/DAvUznmy7rH69qxcJ/vXI560Er7uYZ2C4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782322934; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=pjg3MQaAr0kIcgIv6aL0lBES8v7wwQv165yvF3BidFM=; b=dg1n2ORNRWOXHljgAeA2MrEpbxXmVg9ZKB9R82Dc5eQR2PSJOs5xIt0Ua6Y/W7i3fkQ7qKmv2Z+FX2tP0ygLEFf9Xzhis/xeOxjwebSfpxPAJZ/e4S5oM1KHs4z+sI0KTmTO+Q4VTmyI+CT/B+iBz7Out6vCR/0O57cUidnz9NA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782322934525112.8274798558831; Wed, 24 Jun 2026 10:42:14 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcRZZ-0000br-HQ; Wed, 24 Jun 2026 13:39:37 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRZY-0000OP-1t for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:39:36 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRZW-0004ab-Db for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:39:35 -0400 Received: from mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-119-Uk366DagMJuS5ynpI9IRJw-1; Wed, 24 Jun 2026 13:39:32 -0400 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 4BAAD1955EB1; Wed, 24 Jun 2026 17:39:31 +0000 (UTC) Received: from berrange.com (unknown [10.44.32.102]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id E5BAC180034F; Wed, 24 Jun 2026 17:39:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1782322773; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=pjg3MQaAr0kIcgIv6aL0lBES8v7wwQv165yvF3BidFM=; b=ZckGqI7KpmbThSFU8TzKrYNuMW77ZkYl7lyF8x5Bt/yd3fBH7QaKCrjrGZmSUUctrEdEOH SZMWU059XhbvCPhHnNQao6Vm6MaICrxSeOC2p+xLFm8tz3gBtirfiKC1ALXWznD8jfESf6 BFDDm5zQCJa5WtlJhK45HTLGgTDYVgY= X-MC-Unique: Uk366DagMJuS5ynpI9IRJw-1 X-Mimecast-MFC-AGG-ID: Uk366DagMJuS5ynpI9IRJw_1782322771 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: qemu-devel@nongnu.org Cc: devel@lists.libvirt.org, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Markus Armbruster , Paolo Bonzini , "Dr. David Alan Gilbert" , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Brauner , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Peter Krempa Subject: [PATCH v5 23/35] monitor: convert from oneshot BH to persistent BH Date: Wed, 24 Jun 2026 18:37:39 +0100 Message-ID: <20260624173752.2928717-24-berrange@redhat.com> In-Reply-To: <20260624173752.2928717-1-berrange@redhat.com> References: <20260624173752.2928717-1-berrange@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: 8 X-Spam_score: 0.8 X-Spam_bar: / X-Spam_report: (0.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.445, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_SBL_CSS=3.335, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1782322936020158500 From: Christian Brauner Convert monitor_accept_input from a oneshot BH (aio_bh_schedule_oneshot) to a persistent BH (aio_bh_new + qemu_bh_schedule). Oneshot BHs cannot be cancelled, so monitor_resume() racing with destruction would schedule a callback against memory that monitor_qmp_destroy() is about to free. A persistent BH can be deleted during destruction, cancelling any pending schedule. Signed-off-by: Christian Brauner (Amutable) [DB: extracted oneshot BH conversion from larger commit] Reviewed-by: Marc-Andr=C3=A9 Lureau Tested-by: Peter Krempa Signed-off-by: Daniel P. Berrang=C3=A9 --- monitor/monitor-internal.h | 2 +- monitor/monitor.c | 25 ++++++++++++++----------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/monitor/monitor-internal.h b/monitor/monitor-internal.h index 012d442a20..a82e1aacb6 100644 --- a/monitor/monitor-internal.h +++ b/monitor/monitor-internal.h @@ -134,7 +134,7 @@ struct Monitor { char *chardev_id; CharFrontend chr; int suspend_cnt; /* Needs to be accessed atomically */ - + QEMUBH *accept_input_bh; /* persistent BH for monitor_accept_input = */ char *mon_cpu_path; QTAILQ_ENTRY(Monitor) entry; =20 diff --git a/monitor/monitor.c b/monitor/monitor.c index bf5e8a184a..312e069bc5 100644 --- a/monitor/monitor.c +++ b/monitor/monitor.c @@ -81,6 +81,9 @@ static void monitor_finalize(Object *obj) { Monitor *mon =3D MONITOR(obj); =20 + if (mon->accept_input_bh) { + qemu_bh_delete(mon->accept_input_bh); + } g_free(mon->chardev_id); g_free(mon->mon_cpu_path); qemu_chr_fe_deinit(&mon->chr, false); @@ -567,15 +570,7 @@ static void monitor_accept_input(void *opaque) void monitor_resume(Monitor *mon) { if (qatomic_dec_fetch(&mon->suspend_cnt) =3D=3D 0) { - AioContext *ctx; - - if (monitor_requires_iothread(mon)) { - ctx =3D iothread_get_aio_context(mon_iothread); - } else { - ctx =3D qemu_get_aio_context(); - } - - aio_bh_schedule_oneshot(ctx, monitor_accept_input, mon); + qemu_bh_schedule(mon->accept_input_bh); } =20 trace_monitor_suspend(mon, -1); @@ -691,6 +686,7 @@ void monitor_init_globals(void) static void monitor_complete(UserCreatable *uc, Error **errp) { Monitor *mon =3D MONITOR(uc); + AioContext *ctx; =20 if (mon->chardev_id) { Chardev *chr =3D qemu_chr_find(mon->chardev_id); @@ -704,9 +700,16 @@ static void monitor_complete(UserCreatable *uc, Error = **errp) } } =20 - if (monitor_requires_iothread(mon) && !mon_iothread) { - mon_iothread =3D iothread_create("mon_iothread", &error_abort); + if (monitor_requires_iothread(mon)) { + if (!mon_iothread) { + mon_iothread =3D iothread_create("mon_iothread", &error_abort); + } + + ctx =3D iothread_get_aio_context(mon_iothread); + } else { + ctx =3D qemu_get_aio_context(); } + mon->accept_input_bh =3D aio_bh_new(ctx, monitor_accept_input, mon); } =20 int monitor_new(MonitorOptions *opts, bool allow_hmp, Error **errp) --=20 2.54.0 From nobody Wed Jun 24 21:40:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1782322808; cv=none; d=zohomail.com; s=zohoarc; b=TbnokmleEjrRDG1OnjamPz5tDDjFPn4Y9W3OvTCcCcItVpWN7jxiHlYs5ScgoGkVv7pTipiTVvDGn5z7elMX6ZJG3+aGnHnNuczLdAudd4J8MgAS7h2Wezdfr6vAMOuggO7NIUfKLUtAVhv5LwR3dc61QbvgBIGNOaKNYvNKHQw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782322808; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=qct9syha0Ea7OHzgDYRSm3VM3WvVH27KZLPe/ILOwPE=; b=CPaVvZ1RIvITzRzi3k1Quu+OukIDZcRiCjqkmbXNRczKzEjcrSheBSFxj/WqIm+FknN+X+RUZBSy8ZDoR2JtrzAJI32OG6PoLqkQ3uxdc81MbxumzD9dx4pvrMt/4MQ8KGrylUbBfVA5F69hvqKNnW3u1znw80JCepON4b7QJt0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782322808316948.8624369411267; Wed, 24 Jun 2026 10:40:08 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcRZk-00027A-7A; Wed, 24 Jun 2026 13:39:48 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRZf-0001gQ-Fy for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:39:43 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRZd-0004ba-JI for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:39:42 -0400 Received: from mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-413-UzOxt4_TNuyq2NBaJpqcKw-1; Wed, 24 Jun 2026 13:39:36 -0400 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 5873E180059D; Wed, 24 Jun 2026 17:39:35 +0000 (UTC) Received: from berrange.com (unknown [10.44.32.102]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id D4064180028B; Wed, 24 Jun 2026 17:39:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1782322780; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=qct9syha0Ea7OHzgDYRSm3VM3WvVH27KZLPe/ILOwPE=; b=H2oQsDSg6DKIwKNi6B2Ne+xbKya3n1rXBZFA51ZYZDTtkdkSo+q0phajly0/1hSMAswOGR jCdJBWslH5uvGaidE+aF3fp+ezUGUHc6Q3LobZ5RgiR9/YC8RIc+RjIxyqfUwFzEvhXfJ4 LoO3h0506SxyNcnHHd/voKuy/mYwb04= X-MC-Unique: UzOxt4_TNuyq2NBaJpqcKw-1 X-Mimecast-MFC-AGG-ID: UzOxt4_TNuyq2NBaJpqcKw_1782322775 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: qemu-devel@nongnu.org Cc: devel@lists.libvirt.org, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Markus Armbruster , Paolo Bonzini , "Dr. David Alan Gilbert" , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Brauner , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Peter Krempa Subject: [PATCH v5 24/35] monitor: reject attempts to delete the current monitor Date: Wed, 24 Jun 2026 18:37:40 +0100 Message-ID: <20260624173752.2928717-25-berrange@redhat.com> In-Reply-To: <20260624173752.2928717-1-berrange@redhat.com> References: <20260624173752.2928717-1-berrange@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -24 X-Spam_score: -2.5 X-Spam_bar: -- X-Spam_report: (-2.5 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.445, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1782322809194158500 From: Christian Brauner If an 'object_del' command for a QMP monitor arrives targetting the current monitor, reject this request. If the current monitor is deleted, it will be impossible to send any reply and the client won't be able to remove the corresponding chardev backend. Note, it is not possible to rely on checking monitor_cur() because if 'object_del' is called via human-monitor-command, monitor_cur() will reflect the temporary HMP, not the QMP target that needs to be checked. Signed-off-by: Christian Brauner (Amutable) [DB: extracted monitor tracking from larger commit; added logic to monitor_qmp_prepare_delete to reject request] Reviewed-by: Marc-Andr=C3=A9 Lureau Tested-by: Peter Krempa Signed-off-by: Daniel P. Berrang=C3=A9 --- monitor/qmp.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/monitor/qmp.c b/monitor/qmp.c index 0e1c3eb52b..b0535dec68 100644 --- a/monitor/qmp.c +++ b/monitor/qmp.c @@ -72,6 +72,9 @@ typedef struct QMPRequest QMPRequest; =20 QmpCommandList qmp_commands, qmp_cap_negotiation_commands; =20 +/* Monitor being serviced by the dispatcher. Protected by BQL. */ +static MonitorQMP *qmp_dispatcher_current_mon; + OBJECT_DEFINE_TYPE(MonitorQMP, monitor_qmp, MONITOR_QMP, MONITOR); =20 static void monitor_qmp_cleanup_req_queue_locked(MonitorQMP *mon); @@ -369,6 +372,7 @@ void coroutine_fn monitor_qmp_dispatcher_co(void *data) */ =20 mon =3D req_obj->mon; + qmp_dispatcher_current_mon =3D mon; =20 /* * We need to resume the monitor if handle_qmp_command() @@ -429,6 +433,7 @@ void coroutine_fn monitor_qmp_dispatcher_co(void *data) } =20 qmp_request_free(req_obj); + qmp_dispatcher_current_mon =3D NULL; } qatomic_set(&qmp_dispatcher_co, NULL); } @@ -573,6 +578,11 @@ static void monitor_qmp_event(void *opaque, QEMUChrEve= nt event) } } =20 +static bool monitor_qmp_dispatcher_is_servicing(MonitorQMP *mon) +{ + return qmp_dispatcher_current_mon =3D=3D mon; +} + static void monitor_qmp_setup_handlers_bh(void *opaque) { MonitorQMP *mon =3D opaque; @@ -646,6 +656,13 @@ static void monitor_qmp_complete(UserCreatable *uc, Er= ror **errp) =20 static bool monitor_qmp_prepare_delete(UserCreatable *uc, Error **errp) { + MonitorQMP *qmp =3D MONITOR_QMP(uc); + + if (monitor_qmp_dispatcher_is_servicing(qmp)) { + error_setg(errp, "Cannot delete the current QMP monitor"); + return false; + } + error_setg(errp, "Deleting QMP monitors is not supported"); return false; } --=20 2.54.0 From nobody Wed Jun 24 21:40:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1782322907; cv=none; d=zohomail.com; s=zohoarc; b=f2jj/j693PDDiCTRvc20TZAZjzSF2CdnpJzCDGlJmD0OOB3uWddOFrHi2YoZ6l4xF9hc7qP57sp/9VpLgAWiYZHruORs9ii1kEAiH8TQvsP5S4ENeRAQDVDVeBos9cXGcAsmvK+E+AiVciux51XlO7U2wQZrbgi5fAqMRvYKH0s= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782322907; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=ZMkZ02y0Ujxt6mEnlddq9uDx+HlCAn90Oui7n9sODVY=; b=fiaSMVKSGUiPKeA4ulLEg5Yuz1W1D+HtF456oLEr5RdCE/PK3NxJKW9FAFMXMrUOx9ued+T388q8pD3IRU2HKBOed+raWUXLCKbqGxmKywCwxPllM62ZZFYbvfUymIiXI8xLo/MYKeC8xmo2bMepqNQrpwm1V3ZboiytH4dMFog= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782322907284531.0936592249828; Wed, 24 Jun 2026 10:41:47 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcRZn-0002Ku-Dv; Wed, 24 Jun 2026 13:39:51 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRZi-0001xl-Ps for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:39:46 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRZg-0004bt-Ii for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:39:46 -0400 Received: from mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-569-3qbJzw7AMJ2eNu5ceL_YhQ-1; Wed, 24 Jun 2026 13:39:40 -0400 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 323D21806C8E; Wed, 24 Jun 2026 17:39:39 +0000 (UTC) Received: from berrange.com (unknown [10.44.32.102]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id AA73C1800661; Wed, 24 Jun 2026 17:39:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1782322783; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ZMkZ02y0Ujxt6mEnlddq9uDx+HlCAn90Oui7n9sODVY=; b=SSpvST/KU07u7aCbvOvqO9W1xq5ObDRMODjLuLcKEp8KROrlo8rZdgLKaG0+mqyHGCzbpo Cmdrt0gMTuw69FgZGS3mM6L7lVBbMZjD/rUb687owq6sT1wc7fgYfhHkfZNn5qRZZz0/e0 YP4l2ecqflTzIeZ8/Mpzqz20g/S+iPc= X-MC-Unique: 3qbJzw7AMJ2eNu5ceL_YhQ-1 X-Mimecast-MFC-AGG-ID: 3qbJzw7AMJ2eNu5ceL_YhQ_1782322779 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: qemu-devel@nongnu.org Cc: devel@lists.libvirt.org, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Markus Armbruster , Paolo Bonzini , "Dr. David Alan Gilbert" , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Brauner , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Peter Krempa Subject: [PATCH v5 25/35] monitor: protect qemu_chr_fe_accept_input with monitor lock Date: Wed, 24 Jun 2026 18:37:41 +0100 Message-ID: <20260624173752.2928717-26-berrange@redhat.com> In-Reply-To: <20260624173752.2928717-1-berrange@redhat.com> References: <20260624173752.2928717-1-berrange@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -24 X-Spam_score: -2.5 X-Spam_bar: -- X-Spam_report: (-2.5 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.445, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1782322907825158501 From: Christian Brauner The monitor_accept_input API is called from a bottom half, and will invoke qemu_chr_fe_accept_input(). When a following patch introduces the ability to delete monitors, it will be neccesary to delete the bottom half. Protecting the call to qemu_chr_fe_accept_input with the monitor lock will allow for synchronization with the deletion process. Signed-off-by: Christian Brauner (Amutable) [DB: extracted from a larger commit and refactored to apply to the new monitor class structure] Reviewed-by: Marc-Andr=C3=A9 Lureau Tested-by: Peter Krempa Signed-off-by: Daniel P. Berrang=C3=A9 --- monitor/hmp.c | 2 ++ monitor/monitor.c | 6 +----- monitor/qmp.c | 9 +++++++++ 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/monitor/hmp.c b/monitor/hmp.c index 2cd508f1ee..7b084c6ff8 100644 --- a/monitor/hmp.c +++ b/monitor/hmp.c @@ -116,9 +116,11 @@ static void monitor_hmp_accept_input(Monitor *mon) MonitorHMP *hmp =3D MONITOR_HMP(mon); assert(hmp->rs); readline_restart(hmp->rs); + qemu_chr_fe_accept_input(&mon->chr); qemu_mutex_unlock(&mon->mon_lock); readline_show_prompt(hmp->rs); } else { + qemu_chr_fe_accept_input(&mon->chr); qemu_mutex_unlock(&mon->mon_lock); } } diff --git a/monitor/monitor.c b/monitor/monitor.c index 312e069bc5..0e1c623555 100644 --- a/monitor/monitor.c +++ b/monitor/monitor.c @@ -560,11 +560,7 @@ static void monitor_accept_input(void *opaque) Monitor *mon =3D opaque; MonitorClass *cls =3D MONITOR_GET_CLASS(mon); =20 - if (cls->accept_input) { - cls->accept_input(mon); - } - - qemu_chr_fe_accept_input(&mon->chr); + cls->accept_input(mon); } =20 void monitor_resume(Monitor *mon) diff --git a/monitor/qmp.c b/monitor/qmp.c index b0535dec68..2131be82c7 100644 --- a/monitor/qmp.c +++ b/monitor/qmp.c @@ -107,6 +107,7 @@ static void monitor_qmp_emit_event(Monitor *mon, QAPIEv= ent event, QDict *qdict); static bool monitor_qmp_requires_iothread(const Monitor *mon); static void monitor_qmp_complete(UserCreatable *uc, Error **errp); static bool monitor_qmp_prepare_delete(UserCreatable *uc, Error **errp); +static void monitor_qmp_accept_input(Monitor *mon); =20 static void monitor_qmp_class_init(ObjectClass *cls, const void *data) { @@ -119,6 +120,7 @@ static void monitor_qmp_class_init(ObjectClass *cls, co= nst void *data) =20 moncls->emit_event =3D monitor_qmp_emit_event; moncls->requires_iothread =3D monitor_qmp_requires_iothread; + moncls->accept_input =3D monitor_qmp_accept_input; =20 ucc->complete =3D monitor_qmp_complete; ucc->prepare_delete =3D monitor_qmp_prepare_delete; @@ -666,3 +668,10 @@ static bool monitor_qmp_prepare_delete(UserCreatable *= uc, Error **errp) error_setg(errp, "Deleting QMP monitors is not supported"); return false; } + +static void monitor_qmp_accept_input(Monitor *mon) +{ + WITH_QEMU_LOCK_GUARD(&mon->mon_lock) { + qemu_chr_fe_accept_input(&mon->chr); + } +} --=20 2.54.0 From nobody Wed Jun 24 21:40:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1782322934; cv=none; d=zohomail.com; s=zohoarc; b=Kjb4rV/0jnQtk1Mm5qS5q7ExhPSXpF2YaC/Ss2ANrVRk1lNSgLju8DMcenIAJgua3N93aAPWYZrd/Y6wHZWJ3LPOpz844VR7UXX+F/ujSBcls4WZgEEW2x83SYUP09udBiKUVhSf7OkfFYPokwfB6iVbshMVpgZ/ob/UDhDwAsM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782322934; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=HG04jvCaASuoWmLpdlApDmB3VEsSjERPjbaP1ArEzwg=; b=QdIq60wm9eallG/mZBwHO7OFDU25plAPz2CIDzfUQ4q5LN21W5PFMAdECrdd6ISeTYbpAFJruAFtry2pgoWCpFkgt0zHUmRbDpB3UlaTWy+Znn1KBPv80TWaPn5ptTkZ/c0KHXwYjuxOd5dtiMifhKOHffmhW6fxqiqzWafUgrM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782322934593664.194219231196; Wed, 24 Jun 2026 10:42:14 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcRZo-0002Ml-Gn; Wed, 24 Jun 2026 13:39:52 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRZk-0002Bs-Or for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:39:49 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRZi-0004c5-IU for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:39:48 -0400 Received: from mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-635-LTBhYroPN7G9BkoLb1QxHw-1; Wed, 24 Jun 2026 13:39:44 -0400 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 158B51955EB3; Wed, 24 Jun 2026 17:39:43 +0000 (UTC) Received: from berrange.com (unknown [10.44.32.102]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 95538180075D; Wed, 24 Jun 2026 17:39:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1782322785; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=HG04jvCaASuoWmLpdlApDmB3VEsSjERPjbaP1ArEzwg=; b=Wg5uYjYyn/1zD3wz+ov5+Ov8Yc2BvjZG2KBCFA6lB0b2QsSk932KtQPOMNbKCi49bln23Q DrydFGT4i63liWzt55HKAQ81+XU0hi9AhwX++fNgEy7gDo4H+m7jIBF68/6kvCm5m3OqCx ikqXnwG0rfqLeBKHBEqEdTzO69zQIhQ= X-MC-Unique: LTBhYroPN7G9BkoLb1QxHw-1 X-Mimecast-MFC-AGG-ID: LTBhYroPN7G9BkoLb1QxHw_1782322783 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: qemu-devel@nongnu.org Cc: devel@lists.libvirt.org, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Markus Armbruster , Paolo Bonzini , "Dr. David Alan Gilbert" , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Brauner , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Peter Krempa Subject: [PATCH v5 26/35] monitor: implement support for deleting QMP objects Date: Wed, 24 Jun 2026 18:37:42 +0100 Message-ID: <20260624173752.2928717-27-berrange@redhat.com> In-Reply-To: <20260624173752.2928717-1-berrange@redhat.com> References: <20260624173752.2928717-1-berrange@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: 8 X-Spam_score: 0.8 X-Spam_bar: / X-Spam_report: (0.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.445, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_SBL_CSS=3.335, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1782322936077158500 From: Christian Brauner The removal sequence is: 1. Remove from mon_list under monitor_lock. This must happen before disconnecting chardev handlers to prevent event broadcast from calling monitor_flush_locked() after the gcontext reset, which would create an out_watch on the wrong GMainContext (see monitor_cancel_out_watch()). 2. Cancel any pending out_watch while gcontext still points to the correct context. 3. Disconnect chardev handlers, passing context=3DNULL and close the connection. 4. Drain pending requests from any in-flight monitor_qmp_read(). 5. Destroy the monitor object Signed-off-by: Christian Brauner (Amutable) [DB: extracted from a larger commit and refactored to apply to the new monitor class structure. Remove 'self delete' feature which requires complex special-case code] Reviewed-by: Marc-Andr=C3=A9 Lureau Tested-by: Peter Krempa Signed-off-by: Daniel P. Berrang=C3=A9 --- monitor/monitor-internal.h | 2 ++ monitor/monitor.c | 22 ++++++++++++++++ monitor/qmp.c | 54 ++++++++++++++++++++++++++++++++++++-- 3 files changed, 76 insertions(+), 2 deletions(-) diff --git a/monitor/monitor-internal.h b/monitor/monitor-internal.h index a82e1aacb6..5522e05464 100644 --- a/monitor/monitor-internal.h +++ b/monitor/monitor-internal.h @@ -178,6 +178,7 @@ struct MonitorQMP { Monitor parent_obj; JSONMessageParser parser; bool pretty; + bool setup_pending; /* iothread BH has not yet set up chardev handlers= */ /* * When a client connects, we're in capabilities negotiation mode. * @commands is &qmp_cap_negotiation_commands then. When command @@ -206,6 +207,7 @@ extern MonitorList mon_list; =20 bool monitor_requires_iothread(const Monitor *mon); int monitor_can_read(void *opaque); +void monitor_cancel_out_watch(Monitor *mon); void monitor_list_append(Monitor *mon); void monitor_fdsets_cleanup(void); int monitor_set_cpu(Monitor *mon, int cpu_index); diff --git a/monitor/monitor.c b/monitor/monitor.c index 0e1c623555..b155f58546 100644 --- a/monitor/monitor.c +++ b/monitor/monitor.c @@ -177,6 +177,28 @@ static gboolean monitor_unblocked(void *do_not_use, GI= OCondition cond, return G_SOURCE_REMOVE; } =20 +/* Cancel a pending out_watch GSource. Caller must hold mon_lock. */ +void monitor_cancel_out_watch(Monitor *mon) +{ + if (mon->out_watch) { + GMainContext *ctx =3D NULL; + GSource *src; + + if (monitor_requires_iothread(mon)) { + ctx =3D iothread_get_g_main_context(mon_iothread); + } + src =3D g_main_context_find_source_by_id(ctx, mon->out_watch); + if (!src && ctx) { + /* Handler disconnect may have reset gcontext to NULL. */ + src =3D g_main_context_find_source_by_id(NULL, mon->out_watch); + } + if (src) { + g_source_destroy(src); + } + mon->out_watch =3D 0; + } +} + /* Caller must hold mon->mon_lock */ void monitor_flush_locked(Monitor *mon) { diff --git a/monitor/qmp.c b/monitor/qmp.c index 2131be82c7..5301927f09 100644 --- a/monitor/qmp.c +++ b/monitor/qmp.c @@ -184,6 +184,12 @@ static void monitor_qmp_cleanup_req_queue_locked(Monit= orQMP *mon) } } =20 +static void monitor_qmp_drain_queue(MonitorQMP *mon) +{ + QEMU_LOCK_GUARD(&mon->qmp_queue_lock); + monitor_qmp_cleanup_req_queue_locked(mon); +} + static void monitor_qmp_cleanup_queue_and_resume(MonitorQMP *mon) { QEMU_LOCK_GUARD(&mon->qmp_queue_lock); @@ -597,6 +603,7 @@ static void monitor_qmp_setup_handlers_bh(void *opaque) monitor_qmp_read, monitor_qmp_event, NULL, &mon->parent_obj, context, true); monitor_list_append(&mon->parent_obj); + qatomic_set(&mon->setup_pending, false); } =20 void monitor_new_qmp(const char *chardev_id, bool pretty, Error **errp) @@ -645,6 +652,7 @@ static void monitor_qmp_complete(UserCreatable *uc, Err= or **errp) * since chardev might be running in the monitor I/O * thread. Schedule a bottom half. */ + mon->setup_pending =3D true; aio_bh_schedule_oneshot(iothread_get_aio_context(mon_iothread), monitor_qmp_setup_handlers_bh, mon); /* The bottom half will add @mon to @mon_list */ @@ -656,8 +664,14 @@ static void monitor_qmp_complete(UserCreatable *uc, Er= ror **errp) } } =20 +static void monitor_qmp_iothread_quiesce(void *opaque) +{ + /* No-op: synchronization point only */ +} + static bool monitor_qmp_prepare_delete(UserCreatable *uc, Error **errp) { + Monitor *mon =3D MONITOR(uc); MonitorQMP *qmp =3D MONITOR_QMP(uc); =20 if (monitor_qmp_dispatcher_is_servicing(qmp)) { @@ -665,8 +679,44 @@ static bool monitor_qmp_prepare_delete(UserCreatable *= uc, Error **errp) return false; } =20 - error_setg(errp, "Deleting QMP monitors is not supported"); - return false; + if (qatomic_read(&qmp->setup_pending)) { + error_setg(errp, "monitor is still initializing"); + return false; + } + + /* Remove from mon_list before chardev disconnect. */ + WITH_QEMU_LOCK_GUARD(&monitor_lock) { + QTAILQ_REMOVE(&mon_list, mon, entry); + } + + /* Cancel out_watch while gcontext still points to the right ctx. */ + WITH_QEMU_LOCK_GUARD(&mon->mon_lock) { + monitor_cancel_out_watch(mon); + } + + qemu_chr_fe_set_handlers(&mon->chr, NULL, NULL, NULL, NULL, + NULL, NULL, true); + + /* Drain requests from any in-flight monitor_qmp_read(). */ + monitor_qmp_drain_queue(qmp); + + WITH_QEMU_LOCK_GUARD(&mon->mon_lock) { + /* Disable flushes before cancel -- gcontext is already wrong. */ + qemu_chr_fe_set_open(&mon->chr, false); + monitor_cancel_out_watch(mon); + } + + /* Synchronize with in-flight iothread callbacks. */ + if (monitor_requires_iothread(mon)) { + aio_wait_bh_oneshot(iothread_get_aio_context(mon_iothread), + monitor_qmp_iothread_quiesce, NULL); + } + + /* Catch requests from a racing monitor_qmp_read(). */ + monitor_qmp_drain_queue(qmp); + monitor_fdsets_cleanup(); + + return true; } =20 static void monitor_qmp_accept_input(Monitor *mon) --=20 2.54.0 From nobody Wed Jun 24 21:40:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1782322973; cv=none; d=zohomail.com; s=zohoarc; b=clP/r7Rz94D+yqFDHoLpmNmRcVFnXU7us8cMTfJZtkC7Liz73F7Rh0xQRRjFxvjniDiZl5CHClHe1n4EYU6jl4WDGAn7thkGYdYMW4EUfSvlYjCvINc3bLI1J9a9Q6JgQ8G8uv4ixDoyFpIxDbI5GeV/TNOfK8dbI3+k7dIuN2M= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782322973; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=WmXiKJwuZlJGTmsCKQ9MyCSK/vDUcw/QkiDQvZYMMbM=; b=NJgq1Yni7IB735rus5TZa2AG5U8zGzYTdLWO9JOqmg6xpA7XVQ2wVKU/APwPeZkkPLy9LeiH+SUNSNyL/pCv/4nLeghvyAxeu0XWgXvlr0buGT5Pu9gwcqQUFoDe3n6eIT4+zJfSlwV0K3XnyBXxoqMzAkvj2I1r4siO3uZVCw8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782322973470846.435526632908; Wed, 24 Jun 2026 10:42:53 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcRZr-0002Zu-1H; Wed, 24 Jun 2026 13:39:55 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRZo-0002SS-V6 for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:39:52 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRZm-0004cj-DS for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:39:52 -0400 Received: from mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-711-jrphLVcmP-Cal_Lg4LnoWg-1; Wed, 24 Jun 2026 13:39:47 -0400 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id B984C1805C1E; Wed, 24 Jun 2026 17:39:46 +0000 (UTC) Received: from berrange.com (unknown [10.44.32.102]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 8E3EB180034F; Wed, 24 Jun 2026 17:39:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1782322789; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=WmXiKJwuZlJGTmsCKQ9MyCSK/vDUcw/QkiDQvZYMMbM=; b=CFQKyNRbfPHo3IbgVUWKhVGyNZoLJa9YT9pWojfLCHmxlqFjUtG5NbLiAY2Djj9nCWNWjb 2o3vj6VfF3hqNKV7YMzXdAQwsoeibA8bv172LgMTUacrxYwcZn0F3ttO1YaSFfCoJh4+nz cjz9ZKCx+VYTBU81ZIXb2oTvSHfk0II= X-MC-Unique: jrphLVcmP-Cal_Lg4LnoWg-1 X-Mimecast-MFC-AGG-ID: jrphLVcmP-Cal_Lg4LnoWg_1782322786 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: qemu-devel@nongnu.org Cc: devel@lists.libvirt.org, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Markus Armbruster , Paolo Bonzini , "Dr. David Alan Gilbert" , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Brauner , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Peter Krempa Subject: [PATCH v5 27/35] tests/qtest: add tests for dynamic monitor add/remove Date: Wed, 24 Jun 2026 18:37:43 +0100 Message-ID: <20260624173752.2928717-28-berrange@redhat.com> In-Reply-To: <20260624173752.2928717-1-berrange@redhat.com> References: <20260624173752.2928717-1-berrange@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -24 X-Spam_score: -2.5 X-Spam_bar: -- X-Spam_report: (-2.5 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.445, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1782322974479158500 From: Christian Brauner Test the object-add/object-del QMP commands with the monitor-qmp object type. - Basic lifecycle: chardev-add -> object-add -> object-del -> chardev-remove - Error: object-add with nonexistent chardev - Error: second monitor on same chardev (chardev already in use) - Removal of CLI-created QMP monitor succeeds - Error: object-remove on HMP monitor - Re-add after remove: same id and chardev reusable after removal Signed-off-by: Christian Brauner (Amutable) [DB: modified to use object-add/object-del, removing redundant scenarios already handled by object-add/del code] Reviewed-by: Marc-Andr=C3=A9 Lureau Tested-by: Peter Krempa Signed-off-by: Daniel P. Berrang=C3=A9 --- tests/qtest/qmp-test.c | 174 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 174 insertions(+) diff --git a/tests/qtest/qmp-test.c b/tests/qtest/qmp-test.c index edf0886787..3a325a04e0 100644 --- a/tests/qtest/qmp-test.c +++ b/tests/qtest/qmp-test.c @@ -337,6 +337,174 @@ static void test_qmp_missing_any_arg(void) qtest_quit(qts); } =20 +static void test_qmp_monitor_add_remove(void) +{ + QTestState *qts; + QDict *resp; + + qts =3D qtest_init(common_args); + + /* Create a null chardev for the dynamic monitor */ + resp =3D qtest_qmp(qts, + "{'execute': 'chardev-add'," + " 'arguments': {'id': 'monitor-chardev'," + " 'backend': {'type': 'null'," + " 'data': {}}}}"); + g_assert(qdict_haskey(resp, "return")); + qobject_unref(resp); + + /* Add a dynamic monitor */ + resp =3D qtest_qmp(qts, + "{'execute': 'object-add'," + " 'arguments': {'qom-type': 'monitor-qmp'," + " 'id': 'dyn-mon'," + " 'chardev': 'monitor-chardev'}}"); + g_assert(qdict_haskey(resp, "return")); + qobject_unref(resp); + + /* Remove the dynamic monitor */ + resp =3D qtest_qmp(qts, + "{'execute': 'object-del'," + " 'arguments': {'id': 'dyn-mon'}}"); + g_assert(qdict_haskey(resp, "return")); + qobject_unref(resp); + + /* Add again after remove -- same id and chardev should work */ + resp =3D qtest_qmp(qts, + "{'execute': 'object-add'," + " 'arguments': {'qom-type': 'monitor-qmp'," + " 'id': 'dyn-mon'," + " 'chardev': 'monitor-chardev'}}"); + g_assert(qdict_haskey(resp, "return")); + qobject_unref(resp); + + /* Clean up */ + resp =3D qtest_qmp(qts, + "{'execute': 'object-del'," + " 'arguments': {'id': 'dyn-mon'}}"); + g_assert(qdict_haskey(resp, "return")); + qobject_unref(resp); + + resp =3D qtest_qmp(qts, + "{'execute': 'chardev-remove'," + " 'arguments': {'id': 'monitor-chardev'}}"); + g_assert(qdict_haskey(resp, "return")); + qobject_unref(resp); + + qtest_quit(qts); +} + +static void test_qmp_monitor_error_paths(void) +{ + QTestState *qts; + QDict *resp; + + qts =3D qtest_init(common_args); + + /* Error: chardev does not exist */ + resp =3D qtest_qmp(qts, + "{'execute': 'object-add'," + " 'arguments': {'qom-type': 'monitor-qmp'," + " 'id': 'bad-mon'," + " 'chardev': 'nonexistent'}}"); + qmp_expect_error_and_unref(resp, "GenericError"); + + qtest_quit(qts); +} + +static void test_qmp_monitor_chardev_in_use(void) +{ + QTestState *qts; + QDict *resp; + + qts =3D qtest_init(common_args); + + /* Create a null chardev */ + resp =3D qtest_qmp(qts, + "{'execute': 'chardev-add'," + " 'arguments': {'id': 'shared-chr'," + " 'backend': {'type': 'null'," + " 'data': {}}}}"); + g_assert(qdict_haskey(resp, "return")); + qobject_unref(resp); + + /* Attach first monitor */ + resp =3D qtest_qmp(qts, + "{'execute': 'object-add'," + " 'arguments': {'qom-type': 'monitor-qmp'," + " 'id': 'mon-1'," + " 'chardev': 'shared-chr'}}"); + g_assert(qdict_haskey(resp, "return")); + qobject_unref(resp); + + /* Error: second monitor on the same chardev */ + resp =3D qtest_qmp(qts, + "{'execute': 'object-add'," + " 'arguments': {'qom-type': 'monitor-qmp'," + " 'id': 'mon-2'," + " 'chardev': 'shared-chr'}}"); + qmp_expect_error_and_unref(resp, "GenericError"); + + /* Clean up */ + resp =3D qtest_qmp(qts, + "{'execute': 'object-del'," + " 'arguments': {'id': 'mon-1'}}"); + g_assert(qdict_haskey(resp, "return")); + qobject_unref(resp); + + resp =3D qtest_qmp(qts, + "{'execute': 'chardev-remove'," + " 'arguments': {'id': 'shared-chr'}}"); + g_assert(qdict_haskey(resp, "return")); + qobject_unref(resp); + + qtest_quit(qts); +} + +static void test_qmp_monitor_remove_cli(void) +{ + QTestState *qts; + QDict *resp; + + /* Launch with a named CLI monitor on a null chardev */ + qts =3D qtest_initf("%s -chardev null,id=3Dcli-chr" + " -object monitor-qmp,id=3Dcli-mon,chardev=3Dcli-chr= ", + common_args); + + /* CLI-created QMP monitors can be removed */ + resp =3D qtest_qmp(qts, + "{'execute': 'object-del'," + " 'arguments': {'id': 'cli-mon'}}"); + g_assert(qdict_haskey(resp, "return")); + qobject_unref(resp); + + resp =3D qtest_qmp(qts, + "{'execute': 'chardev-remove'," + " 'arguments': {'id': 'cli-chr'}}"); + g_assert(qdict_haskey(resp, "return")); + qobject_unref(resp); + + qtest_quit(qts); +} + +static void test_qmp_monitor_remove_hmp(void) +{ + QTestState *qts; + QDict *resp; + + qts =3D qtest_initf("%s -chardev null,id=3Dhmp-chr" + " -object monitor-hmp,id=3Dhmp-mon,chardev=3Dhmp-chr= ", + common_args); + + /* Error: object_del must reject HMP monitors */ + resp =3D qtest_qmp(qts, + "{'execute': 'object-del'," + " 'arguments': {'id': 'hmp-mon'}}"); + qmp_expect_error_and_unref(resp, "GenericError"); + + qtest_quit(qts); +} + int main(int argc, char *argv[]) { g_test_init(&argc, &argv, NULL); @@ -348,6 +516,12 @@ int main(int argc, char *argv[]) #endif qtest_add_func("qmp/preconfig", test_qmp_preconfig); qtest_add_func("qmp/missing-any-arg", test_qmp_missing_any_arg); + qtest_add_func("qmp/monitor-add-remove", test_qmp_monitor_add_remove); + qtest_add_func("qmp/monitor-error-paths", test_qmp_monitor_error_paths= ); + qtest_add_func("qmp/monitor-chardev-in-use", + test_qmp_monitor_chardev_in_use); + qtest_add_func("qmp/monitor-remove-cli", test_qmp_monitor_remove_cli); + qtest_add_func("qmp/monitor-remove-hmp", test_qmp_monitor_remove_hmp); =20 return g_test_run(); } --=20 2.54.0 From nobody Wed Jun 24 21:40:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1782322845; cv=none; d=zohomail.com; s=zohoarc; b=bdHm/af0HeeF69kd7eSPwPHQ/5JdqED69m8WHcZ0hEaokgBF5FzdPUr9sKkxQoFa93f5U8evX3oQcJ7aRg6yGXNFlmy6LNsK3ljuFRM0jbSu4KwvTF692ANsjYDwwU2BIVJ9In433EkpWQj9neXU9AGPxojgHG6D5ga9rxwXZvw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782322845; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=gHcDmHbgJI4p+ZIwjwIx//lexhs8DCr8CWxaidW5nWE=; b=mGEH0JcwQgZmHaD23FCdQI2efh1K9IQVy9bjSA/PEIFdLbNdbaRqEm6qfzqq13WFigbHLIFMpn/DrWfbqXvTW93wpkjtKiFLDHJELwqx/uT2kU/vgP2bm6HO4daVyWU37NsYlPysyjwaNvH1+kVoJrcZb97aFn2QQ8laScQlJdQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782322845735865.5994152959873; Wed, 24 Jun 2026 10:40:45 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcRZx-00034e-Qf; Wed, 24 Jun 2026 13:40:01 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRZv-00030N-Rd for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:39:59 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRZt-0004dS-Qe for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:39:59 -0400 Received: from mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-630-cEpnaqcLOtOI8avT8MA4fQ-1; Wed, 24 Jun 2026 13:39:51 -0400 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 7DB521955EA6; Wed, 24 Jun 2026 17:39:50 +0000 (UTC) Received: from berrange.com (unknown [10.44.32.102]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 37800180034F; Wed, 24 Jun 2026 17:39:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1782322797; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=gHcDmHbgJI4p+ZIwjwIx//lexhs8DCr8CWxaidW5nWE=; b=I+OJogePdHL85f4t7G6gwv197ekN6Qr1uCjPe5RJWGYIJGD0qrBRwW6+oPRn+Dg1z3y0zw 0htmqNX1R4MgXoezYaQS7dSW1eEAf63rZ3r9bjvnH7NP5bYiLcmF5EvhDlHWfSdqsvDygP c7BAZ1/OvoiYumEXMXZbSsm1xhlERdI= X-MC-Unique: cEpnaqcLOtOI8avT8MA4fQ-1 X-Mimecast-MFC-AGG-ID: cEpnaqcLOtOI8avT8MA4fQ_1782322790 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: qemu-devel@nongnu.org Cc: devel@lists.libvirt.org, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Markus Armbruster , Paolo Bonzini , "Dr. David Alan Gilbert" , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Brauner , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Peter Krempa Subject: [PATCH v5 28/35] tests/functional: add e2e test for dynamic QMP monitor hotplug Date: Wed, 24 Jun 2026 18:37:44 +0100 Message-ID: <20260624173752.2928717-29-berrange@redhat.com> In-Reply-To: <20260624173752.2928717-1-berrange@redhat.com> References: <20260624173752.2928717-1-berrange@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: 8 X-Spam_score: 0.8 X-Spam_bar: / X-Spam_report: (0.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.445, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_SBL_CSS=3.335, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1782322847490158500 From: Christian Brauner Add functional tests that exercise dynamic monitor hotplug with real socket connections: - Hotplug cycle: chardev-add a unix socket, object-add, connect to the socket, receive the QMP greeting, negotiate capabilities, send query-version, disconnect, remove the monitor and chardev, then repeat the entire cycle a second time to verify cleanup and reuse. - Self-removal: a dynamically-added monitor sends object-del targeting itself, verifying that the request is rejected - Large response: send query-qmp-schema on a dynamic monitor to exercise the output buffer flush path with a large response payload. - Events after negotiation: trigger STOP/RESUME events via the main monitor and verify they are delivered on the dynamic monitor. This complements the qtest unit tests by verifying that a real QMP client can connect to a dynamically-added monitor and exchange messages. Signed-off-by: Christian Brauner (Amutable) [DB: modified to use object-add/object-del; adjust self-removal test to validate rejection of request] Reviewed-by: Marc-Andr=C3=A9 Lureau Tested-by: Peter Krempa Signed-off-by: Daniel P. Berrang=C3=A9 --- MAINTAINERS | 1 + tests/functional/generic/meson.build | 1 + .../generic/test_monitor_hotplug.py | 168 ++++++++++++++++++ 3 files changed, 170 insertions(+) create mode 100755 tests/functional/generic/test_monitor_hotplug.py diff --git a/MAINTAINERS b/MAINTAINERS index 93df53d87f..c74ffe56ae 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -3616,6 +3616,7 @@ F: docs/interop/*qmp-* F: scripts/qmp/ F: tests/qtest/qmp-test.c F: tests/qtest/qmp-cmd-test.c +F: tests/functional/generic/test_monitor_hotplug.py T: git https://repo.or.cz/qemu/armbru.git qapi-next =20 qtest diff --git a/tests/functional/generic/meson.build b/tests/functional/generi= c/meson.build index 09763c5d22..c94105c62e 100644 --- a/tests/functional/generic/meson.build +++ b/tests/functional/generic/meson.build @@ -4,6 +4,7 @@ tests_generic_system =3D [ 'empty_cpu_model', 'info_usernet', 'linters', + 'monitor_hotplug', 'version', 'vnc', ] diff --git a/tests/functional/generic/test_monitor_hotplug.py b/tests/funct= ional/generic/test_monitor_hotplug.py new file mode 100755 index 0000000000..5d8a159eb0 --- /dev/null +++ b/tests/functional/generic/test_monitor_hotplug.py @@ -0,0 +1,168 @@ +#!/usr/bin/env python3 +# +# SPDX-License-Identifier: GPL-2.0-or-later +# +# Functional test for dynamic QMP monitor hotplug +# +# Copyright (c) 2026 Christian Brauner + +import os + +from qemu_test import QemuSystemTest + +from qemu.qmp.legacy import QEMUMonitorProtocol + + +class MonitorHotplug(QemuSystemTest): + + def setUp(self): + super().setUp() + sock_dir =3D self.socket_dir() + self._sock_path =3D os.path.join(sock_dir.name, 'hotplug.sock') + + def _add_monitor(self): + """Create a chardev + monitor and return the socket path.""" + sock =3D self._sock_path + self.vm.cmd('chardev-add', id=3D'hotplug-chr', backend=3D{ + 'type': 'socket', + 'data': { + 'addr': { + 'type': 'unix', + 'data': {'path': sock} + }, + 'server': True, + 'wait': False, + } + }) + self.vm.cmd('object-add', id=3D'hotplug-mon', + qom_type=3D'monitor-qmp', + chardev=3D'hotplug-chr') + return sock + + def _remove_monitor(self): + """Remove the monitor + chardev.""" + self.vm.cmd('object-del', id=3D'hotplug-mon') + self.vm.cmd('chardev-remove', id=3D'hotplug-chr') + + def _connect_and_handshake(self, sock_path): + """ + Connect to the dynamic monitor socket, perform the QMP + greeting and capability negotiation, send a command, then + disconnect. + """ + qmp =3D QEMUMonitorProtocol(sock_path) + + # connect(negotiate=3DTrue) receives the greeting, validates it, + # and sends qmp_capabilities automatically. + greeting =3D qmp.connect(negotiate=3DTrue) + self.assertIn('QMP', greeting) + self.assertIn('version', greeting['QMP']) + self.assertIn('capabilities', greeting['QMP']) + + # Send a real command to prove the session is fully functional + resp =3D qmp.cmd_obj({'execute': 'query-version'}) + self.assertIn('return', resp) + self.assertIn('qemu', resp['return']) + + qmp.close() + + def test_hotplug_cycle(self): + """ + Hotplug a monitor, do the full QMP handshake, unplug it, + then repeat the whole cycle a second time. + """ + self.set_machine('none') + self.vm.add_args('-nodefaults') + self.vm.launch() + + # First cycle + sock =3D self._add_monitor() + self._connect_and_handshake(sock) + self._remove_monitor() + + # Second cycle -- same ids, same path, must work + sock =3D self._add_monitor() + self._connect_and_handshake(sock) + self._remove_monitor() + + def test_self_removal(self): + """ + A dynamically-added monitor sends object-del targeting + itself. Verify the request is rejected, but the monitor + can still be deleted from outside its own context. + """ + self.set_machine('none') + self.vm.add_args('-nodefaults') + self.vm.launch() + + sock =3D self._add_monitor() + + qmp =3D QEMUMonitorProtocol(sock) + greeting =3D qmp.connect(negotiate=3DTrue) + self.assertIn('QMP', greeting) + + # Self-removal: the dynamic monitor raises error + resp =3D qmp.cmd_obj({'execute': 'object-del', + 'arguments': {'id': 'hotplug-mon'}}) + self.assertIn('error', resp) + + qmp.close() + + resp =3D self.vm.cmd('object-del', id=3D'hotplug-mon') + + # Clean up the chardev + self.vm.cmd('chardev-remove', id=3D'hotplug-chr') + + def test_large_response(self): + """ + Send a command with a large response (query-qmp-schema) on a + dynamically-added monitor to exercise the output buffer flush + path. + """ + self.set_machine('none') + self.vm.add_args('-nodefaults') + self.vm.launch() + + sock =3D self._add_monitor() + + qmp =3D QEMUMonitorProtocol(sock) + qmp.connect(negotiate=3DTrue) + + resp =3D qmp.cmd_obj({'execute': 'query-qmp-schema'}) + self.assertIn('return', resp) + self.assertIsInstance(resp['return'], list) + self.assertGreater(len(resp['return']), 0) + + qmp.close() + self._remove_monitor() + + def test_events_after_negotiation(self): + """ + Verify that QMP events are delivered on a dynamically-added + monitor after capability negotiation completes. + """ + self.set_machine('none') + self.vm.add_args('-nodefaults') + self.vm.launch() + + sock =3D self._add_monitor() + + qmp =3D QEMUMonitorProtocol(sock) + qmp.connect(negotiate=3DTrue) + + # Trigger a STOP event via the main monitor, then read it + # from the dynamic monitor. + self.vm.cmd('stop') + resp =3D qmp.pull_event(wait=3DTrue) + self.assertEqual(resp['event'], 'STOP') + + self.vm.cmd('cont') + resp =3D qmp.pull_event(wait=3DTrue) + self.assertEqual(resp['event'], 'RESUME') + + qmp.close() + self._remove_monitor() + + +if __name__ =3D=3D '__main__': + QemuSystemTest.main() --=20 2.54.0 From nobody Wed Jun 24 21:40:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1782322970; cv=none; d=zohomail.com; s=zohoarc; b=RyCWiQqiyZRtxfZ6RrF2wi5nwyTlRLci7ccLTQBLfEw4c3aic6CiBm3lA+S7itEGDHfjjXtF4qyHDEEWlHqDSK1Vk0WjLRjn41KXFsM8Ra1t+hRUEycdh8j1SP/1x7iygEvRtbv1Em+D9urB1HKgsDV1+RE7TkRRgk/eBegvpTA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782322970; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=d1ncO9vn+ZIS+PTHi9PgVZbJYipsd40hqXYNJp/rezk=; b=M7KgLiSleQtIOhkMbvZTpMfOJn4fQIAM58E9dCpqv2moOd33HpUhQ65czrcnA6spTjwcsu6oANhLxwpHEdBEds60ZTk1HHa8ZpkJeZLGk9OtdbASb3sEVSY62WN8n9iZ+WBHG/pifNY5S5SvqqOFrmIwPdecR9dTRaEfwzv85+0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782322970768216.82070225008715; Wed, 24 Jun 2026 10:42:50 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcRZy-00036K-Q6; Wed, 24 Jun 2026 13:40:02 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRZx-00033t-Cg for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:40:01 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRZv-0004dj-Or for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:40:01 -0400 Received: from mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-75-e_TfHvT8Ml-j4uByYT9aAQ-1; Wed, 24 Jun 2026 13:39:55 -0400 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 607FE180065A; Wed, 24 Jun 2026 17:39:54 +0000 (UTC) Received: from berrange.com (unknown [10.44.32.102]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 04358180034F; Wed, 24 Jun 2026 17:39:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1782322799; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=d1ncO9vn+ZIS+PTHi9PgVZbJYipsd40hqXYNJp/rezk=; b=Gd/OBUhJ8XQvI4bk6oMyqfyDANfD95VjxIOAQY7O6kc3Ai8b1eJP/GrXTQ8RtF2FBHuB1z gcgnzTtMqWhmiBk9CbJSL0GM2W4EcIZ8k5u3gYTOF5G/wX/TJZI9avKm4/vJlsk2ppnpBg kFhCo3M+oMV/A08iUEn3sVkShJooPp4= X-MC-Unique: e_TfHvT8Ml-j4uByYT9aAQ-1 X-Mimecast-MFC-AGG-ID: e_TfHvT8Ml-j4uByYT9aAQ_1782322794 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: qemu-devel@nongnu.org Cc: devel@lists.libvirt.org, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Markus Armbruster , Paolo Bonzini , "Dr. David Alan Gilbert" , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Brauner , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Peter Krempa Subject: [PATCH v5 29/35] tests/functional: add a stress test for monitor hot unplug Date: Wed, 24 Jun 2026 18:37:45 +0100 Message-ID: <20260624173752.2928717-30-berrange@redhat.com> In-Reply-To: <20260624173752.2928717-1-berrange@redhat.com> References: <20260624173752.2928717-1-berrange@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -24 X-Spam_score: -2.5 X-Spam_bar: -- X-Spam_report: (-2.5 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.445, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1782322972581158500 When unplugging a monitor there is a careful synchronization dance between the monitor handling the "object-del" command and the command processing for the monitor being deleted. The stress test runs a busy loop of 'query-qmp-schema' on a second monitor, while the primary monitor requests its deletion. Reviewed-by: Marc-Andr=C3=A9 Lureau Tested-by: Peter Krempa Signed-off-by: Daniel P. Berrang=C3=A9 --- .../generic/test_monitor_hotplug.py | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/tests/functional/generic/test_monitor_hotplug.py b/tests/funct= ional/generic/test_monitor_hotplug.py index 5d8a159eb0..55af8a238f 100755 --- a/tests/functional/generic/test_monitor_hotplug.py +++ b/tests/functional/generic/test_monitor_hotplug.py @@ -6,11 +6,16 @@ # # Copyright (c) 2026 Christian Brauner =20 +import asyncio import os +import random +import threading +import time =20 from qemu_test import QemuSystemTest =20 from qemu.qmp.legacy import QEMUMonitorProtocol +from qemu.qmp import QMPClient =20 =20 class MonitorHotplug(QemuSystemTest): @@ -163,6 +168,63 @@ def test_events_after_negotiation(self): qmp.close() self._remove_monitor() =20 + def stress_mon(self, sock): + async def main(): + qmp =3D QMPClient('testvm') + await qmp.connect(sock) + # Run query-version in a tight loop so that the + # monitor thread/dispatcher is very busy at the + # time we try to delete the monitor + while True: + try: + # A command which returns a lot of data to make + # it more likely we're in the I/O reply path + # when deleting the monitor + res =3D await qmp.execute('query-qmp-schema') + # Some commands which generate async events + # as those can trigger different code paths + res =3D await qmp.execute('stop') + res =3D await qmp.execute('cont') + except: + # we'll get here if the monitor is terminated + # by QEMU in which case we must disconnect + # out side, but.... + try: + await qmp.disconnect() + except (ConnectionResetError, EOFError, BrokenPipeErro= r): + # ... disconnect() will probably see + # errors too, but we must try to call it + # regardless to cleanup asyncio state + # and prevent python warnings at GC time + pass + return + asyncio.run(main()) + + def test_hotplug_stress(self): + """ + Repeatedly hotplug and unplug a monitor, while another thread + concurrently issues commands on that monitor. This stresses + the synchronization with the monitor thread during cleanup + """ + self.set_machine('none') + self.vm.add_args('-nodefaults') + self.vm.launch() + + # Each loop sleeps at most 0.5 seconds, so this should + # give an upper bound of approx 5 seconds execution + # time which is reasonable to run by default + repeat =3D 10 + for i in range(repeat): + # First cycle + sock =3D self._add_monitor() + print ("# stress cycle %02d/%02d" % (i, repeat)) + stress =3D threading.Thread(target=3Dself.stress_mon, args=3D[= sock]) + stress.start() + # Sleep upto 1/2 second to vary the races + time.sleep(random.random() / 2) + self._remove_monitor() + stress.join() + =20 if __name__ =3D=3D '__main__': QemuSystemTest.main() --=20 2.54.0 From nobody Wed Jun 24 21:40:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1782322851; cv=none; d=zohomail.com; s=zohoarc; b=H6YDg44mUGlxjJDwD9HyKWiPCFPG13IWzsqzsMreZ7iJXq5LdqqbSAhVLnLY8cT06ljjADht5btmBhgwPE2UamFTI2ywpxhuRX3YnRtWWkHGR4xnFWwGEuOdUz8npYBcS6fk12LYe6ZpW/ur3ggIOivRIdhntrwZ7N9JY2zlIuI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782322851; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=o1rJcZ14dB8JQNOyy+L2uBZqp+ZSHNsTjFAdWWw+MTQ=; b=Nipt6ihz4hyGSsJp5k4lyVO3qUoRcAU4m3NJCVi/gd+WgjNcrfoQwpNE3DOpm/MusK0UE5FcXDArfsrAUpWJnwOo/xUqTvAXpc85Aor2T1qgD/c9IfN0vda/AGp71poMzYuG6jdpdjsxztPdHK4926yNmfDgILVsgNfdr836lV0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782322851937329.4208590890439; Wed, 24 Jun 2026 10:40:51 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcRa2-0003L5-Gh; Wed, 24 Jun 2026 13:40:06 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRa0-0003FE-TO for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:40:05 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRZz-0004fO-Bq for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:40:04 -0400 Received: from mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-478-kGl-W-u8NKuu7mags4NB0Q-1; Wed, 24 Jun 2026 13:39:59 -0400 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 05C1B1956060; Wed, 24 Jun 2026 17:39:58 +0000 (UTC) Received: from berrange.com (unknown [10.44.32.102]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id CE3D5180034F; Wed, 24 Jun 2026 17:39:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1782322802; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=o1rJcZ14dB8JQNOyy+L2uBZqp+ZSHNsTjFAdWWw+MTQ=; b=AdMq5GTSOqWhGsDdj0acnwUbDCrINYCHXCkNJwAGCjpEBIdQLHOnnAUDEQOcIdHUrFGJgt KQGm8/VTFU9XB8x8t6cHvFoO8lssGOCViewxebrZUFoJLKNXQ/wXbus7hsqZLt7LiRhFGh Leni3K29yBGie09Bs+mV59Z0+uhLOOk= X-MC-Unique: kGl-W-u8NKuu7mags4NB0Q-1 X-Mimecast-MFC-AGG-ID: kGl-W-u8NKuu7mags4NB0Q_1782322798 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: qemu-devel@nongnu.org Cc: devel@lists.libvirt.org, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Markus Armbruster , Paolo Bonzini , "Dr. David Alan Gilbert" , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Brauner , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Peter Krempa Subject: [PATCH v5 30/35] qom: add method for getting the "id" of a QOM object Date: Wed, 24 Jun 2026 18:37:46 +0100 Message-ID: <20260624173752.2928717-31-berrange@redhat.com> In-Reply-To: <20260624173752.2928717-1-berrange@redhat.com> References: <20260624173752.2928717-1-berrange@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: 8 X-Spam_score: 0.8 X-Spam_bar: / X-Spam_report: (0.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.445, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_SBL_CSS=3.335, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1782322853487158500 The 'user_creatable_del' method doesn't want the 'Object *', but instead the "id" of the object to be deleted. While most of its work could be done with the "Object *" alone, purging the QemuOpts values needs the "id". The "id" is not recorded against an Object though, it is indirectly stored as a property linking the parent and child objects together. Add an accessor that can fetch this property name. Reviewed-by: Marc-Andr=C3=A9 Lureau Tested-by: Peter Krempa Signed-off-by: Daniel P. Berrang=C3=A9 --- include/qom/object.h | 10 ++++++++++ qom/object.c | 17 +++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/include/qom/object.h b/include/qom/object.h index 11f55613fc..216d2a30f6 100644 --- a/include/qom/object.h +++ b/include/qom/object.h @@ -1759,6 +1759,16 @@ ObjectProperty *object_property_try_add_child(Object= *obj, const char *name, ObjectProperty *object_property_add_child(Object *obj, const char *name, Object *child); =20 +/** + * object_property_get_child_name: + * @obj: the object that owns the property + * @child: the object referenced by the child property + * + * Return the property name against which @child is registered + * with @obj, or NULL if @obj is not a parent of @child. + */ +char *object_property_get_child_name(Object *obj, Object *child); + typedef enum { /* Unref the link pointer when the property is deleted */ OBJ_PROP_LINK_STRONG =3D 0x1, diff --git a/qom/object.c b/qom/object.c index f79b2cf361..66bbd1488b 100644 --- a/qom/object.c +++ b/qom/object.c @@ -1952,6 +1952,23 @@ object_property_add_child(Object *obj, const char *n= ame, return object_property_try_add_child(obj, name, child, &error_abort); } =20 +char *object_property_get_child_name(Object *obj, Object *child) +{ + ObjectProperty *prop; + GHashTableIter iter; + gpointer key, value; + + g_hash_table_iter_init(&iter, obj->properties); + while (g_hash_table_iter_next(&iter, &key, &value)) { + prop =3D value; + if (object_property_is_child(prop) && prop->opaque =3D=3D child) { + return g_strdup(prop->name); + } + } + return NULL; +} + + void object_property_allow_set_link(const Object *obj, const char *name, Object *val, Error **errp) { --=20 2.54.0 From nobody Wed Jun 24 21:40:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1782322972; cv=none; d=zohomail.com; s=zohoarc; b=EtbVj0LRnqYze6juqQudkts6nzT7+P3HM4G9Dalxz3of4QqhUk2UMlPzhBv/laz91nz0EE9UtuGm+IKNowwE/95CDqlpnbVcY2IInjG4zpbM1J6b27sVswI98iMm/il+V5s3dk8XfQZZhrWJqqgkKt45q2NXkdnNC1Nn7rUv8Do= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782322972; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=kfxZ1bjccOk/lXrNXT4UyR6wS/Sx3srWGe4z01GTNcw=; b=QxAZSYV1ay7/n1d/rCgYf54PgHzRDH99JzgTSaOo+rpem6cnoxLUHZXidqzDAiySaH7DjkN4FUoF9JsIByplCWUntXziEnyRC0WXTEVllvJlhaLXIESdTxQyZP6L2vFux43YuwY6gTefkrbAyN8eebsd5oF/ggX8xjSpsZ7j7vI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782322972439206.59720585511923; Wed, 24 Jun 2026 10:42:52 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcRa7-0003Vw-Ch; Wed, 24 Jun 2026 13:40:11 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRa5-0003Um-WB for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:40:10 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRa4-0004g9-EF for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:40:09 -0400 Received: from mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-575-AJqUQzBSO22XxizbMKns_w-1; Wed, 24 Jun 2026 13:40:04 -0400 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 9C3CF19560B3; Wed, 24 Jun 2026 17:40:02 +0000 (UTC) Received: from berrange.com (unknown [10.44.32.102]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 77FFD180034F; Wed, 24 Jun 2026 17:39:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1782322807; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=kfxZ1bjccOk/lXrNXT4UyR6wS/Sx3srWGe4z01GTNcw=; b=PppZ0BsaD2bu1weOlA0sdCoZzGHxh/PZz7t6HEaQWcUZlqWH+P+ufyyQ5TZtvahl6SGzuc QzRKEsLvGnFFIjRiNFWgLICr+jeVWD/2tNDnl946W20PufGqqtpXxrKREck961y4H/rq5O 6EOVwt/ebhpofc0/ghpXDDAbX6LoWyk= X-MC-Unique: AJqUQzBSO22XxizbMKns_w-1 X-Mimecast-MFC-AGG-ID: AJqUQzBSO22XxizbMKns_w_1782322802 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: qemu-devel@nongnu.org Cc: devel@lists.libvirt.org, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Markus Armbruster , Paolo Bonzini , "Dr. David Alan Gilbert" , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Brauner , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Peter Krempa Subject: [PATCH v5 31/35] qom: add trace events for user creatable create/delete APIs Date: Wed, 24 Jun 2026 18:37:47 +0100 Message-ID: <20260624173752.2928717-32-berrange@redhat.com> In-Reply-To: <20260624173752.2928717-1-berrange@redhat.com> References: <20260624173752.2928717-1-berrange@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: 8 X-Spam_score: 0.8 X-Spam_bar: / X-Spam_report: (0.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.445, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_SBL_CSS=3.335, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1782322974477158500 Reviewed-by: Marc-Andr=C3=A9 Lureau Tested-by: Peter Krempa Signed-off-by: Daniel P. Berrang=C3=A9 --- qom/object_interfaces.c | 6 ++++++ qom/trace-events | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/qom/object_interfaces.c b/qom/object_interfaces.c index 6faa0b2fd9..2e618a7623 100644 --- a/qom/object_interfaces.c +++ b/qom/object_interfaces.c @@ -20,12 +20,14 @@ #include "qapi/opts-visitor.h" #include "qemu/config-file.h" #include "qemu/keyval.h" +#include "trace.h" =20 bool user_creatable_complete(UserCreatable *uc, Error **errp) { UserCreatableClass *ucc =3D USER_CREATABLE_GET_CLASS(uc); ERRP_GUARD(); =20 + trace_user_creatable_complete(uc, object_get_typename(OBJECT(uc))); if (ucc->complete) { ucc->complete(uc, errp); } @@ -37,9 +39,13 @@ bool user_creatable_prepare_delete(UserCreatable *uc, Er= ror **errp) UserCreatableClass *ucc =3D USER_CREATABLE_GET_CLASS(uc); ERRP_GUARD(); =20 + trace_user_creatable_prepare_delete(uc, object_get_typename(OBJECT(uc)= )); if (ucc->prepare_delete) { ucc->prepare_delete(uc, errp); } + trace_user_creatable_prepare_delete_result( + uc, object_get_typename(OBJECT(uc)), + *errp ? error_get_pretty(*errp) : NULL); return !*errp; } =20 diff --git a/qom/trace-events b/qom/trace-events index 44c63e72af..bac8472618 100644 --- a/qom/trace-events +++ b/qom/trace-events @@ -11,3 +11,8 @@ object_property_del_child(void *obj, const char *type, vo= id *child, const char * object_property_parse(void *obj, const char *type, const char *name, const= char *value) "obj=3D%p type=3D%s prop=3D%s value=3D%s" object_class_dynamic_cast_assert(const char *type, const char *target, con= st char *file, int line, const char *func) "type=3D%s->%s (%s:%d:%s)" object_class_property_add(const char *type, const char *name, void *value)= "type=3D%s name=3D%s value=3D%p" + +# object_interfaces.c +user_creatable_complete(void *obj, const char *type) "obj=3D%p type=3D%s" +user_creatable_prepare_delete(void *obj, const char *type) "obj=3D%p type= =3D%s" +user_creatable_prepare_delete_result(void *obj, const char *type, const ch= ar *msg) "obj=3D%p type=3D%s msg=3D%s" --=20 2.54.0 From nobody Wed Jun 24 21:40:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1782322821; cv=none; d=zohomail.com; s=zohoarc; b=WVJVix19Y7obeO4OlIT2BQW3mvRxpB1B7pEVnbdKJeaHT1E43cBI5fA4ahzt3NGbPJWi39GCijkE7qMKuOw3n/lmi8R8W7O7jZBlUjLGy9msN9JFuv5V9j3Ta7DuB8WHoYoqTTaMYBukdTjsOfhKeErongbOVeTPplRX2C0TS1U= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782322821; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=KZ818oC779+VWCiuGiA4oz4vM0HGeQeVUHVMqzE07oU=; b=T5znxsjSZxn/G3bbM4cdTbjuYd4W/tTWQM+RxNunBfpnncguUhMNJhhbPbfNoxhQDoFQ4sPEmrR7On3g/IUpW4BaCJU3h9M7OG22KTZfd4VfgSbg3McSQCsBL4cfq2zNIhZmpl5sRb46saKSTfJJOAgtVy0uAN+fiQbcVU7Ufa0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782322821358721.6500905096639; Wed, 24 Jun 2026 10:40:21 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcRaB-0003Ww-74; Wed, 24 Jun 2026 13:40:15 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRa8-0003Wf-VX for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:40:12 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRa6-0004gX-Rs for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:40:12 -0400 Received: from mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-315-chHDJbxFMsqBRwCY-KS_yA-1; Wed, 24 Jun 2026 13:40:07 -0400 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 5001E1805A10; Wed, 24 Jun 2026 17:40:06 +0000 (UTC) Received: from berrange.com (unknown [10.44.32.102]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 184E7180028B; Wed, 24 Jun 2026 17:40:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1782322810; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=KZ818oC779+VWCiuGiA4oz4vM0HGeQeVUHVMqzE07oU=; b=A/9QoKdkSQhHv3TzNrhdLDfGFlvOSTNB0iCzBO+Q8geSnMyTVo3utYHLvkrq8u2cLtxSJh o7TvEMOAK6Mpdk78Cknlk7aJEEp+AxcQuc6O0VpBOXpZo8AddqRTiUXYmyHh6MzPjSSwyD K46+iai8Qw93+Ro9uruw/iz9sEeMsQQ= X-MC-Unique: chHDJbxFMsqBRwCY-KS_yA-1 X-Mimecast-MFC-AGG-ID: chHDJbxFMsqBRwCY-KS_yA_1782322806 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: qemu-devel@nongnu.org Cc: devel@lists.libvirt.org, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Markus Armbruster , Paolo Bonzini , "Dr. David Alan Gilbert" , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Brauner , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Peter Krempa Subject: [PATCH v5 32/35] monitor: add support for auto-deleting monitors upon close Date: Wed, 24 Jun 2026 18:37:48 +0100 Message-ID: <20260624173752.2928717-33-berrange@redhat.com> In-Reply-To: <20260624173752.2928717-1-berrange@redhat.com> References: <20260624173752.2928717-1-berrange@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -24 X-Spam_score: -2.5 X-Spam_bar: -- X-Spam_report: (-2.5 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.445, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1782322823451158500 The default monitor is usually a long lived object that will exist for the entire lifetime of the VM. A monitor can only service a single client at a time though, and so it might be desirable to hotplug additional monitors at runtime for specific tasks. If doing that, however, there is a need to remove the monitor when it is no longer needed. Allowing a client to run "object-del" against its own monitor adds complex edge cases, as it would be desirable to send the QMP response despite the monitor sending it being deleted. Doing "object-del" alone will also result in orphaning a character device backend instance, as there is no opportunity to run the companion "chardev-del" command. A simpler way to ensure cleanup is to add the concept of auto-deleting monitor objects. Specifically when the "CHR_EVENT_CLOSED" event is emitted, the equivalent of "object-del" + "chardev-del" can be run internally. Since the transient client has already droppped its monitor connection, there is no synchronization to be concerned about. This is implemented via a new "close-action=3Dnone|delete" property on the 'monitor-qmp' object. This concept could be extended with further actions in future, for example: * close-action=3Dshutdown - graceful guest shutdown * close-action=3Dterminate - immediate guest poweroff * close-action=3Dstop - pause guest CPUs while the monitor is not connected to any client This is left as an exercise for future interested contributors. Tested-by: Peter Krempa Signed-off-by: Daniel P. Berrang=C3=A9 Reviewed-by: Marc-Andr=C3=A9 Lureau --- monitor/monitor-internal.h | 3 + monitor/qmp.c | 75 +++++++++++++++++ qapi/qom.json | 21 ++++- .../generic/test_monitor_hotplug.py | 83 ++++++++++++++++++- 4 files changed, 177 insertions(+), 5 deletions(-) diff --git a/monitor/monitor-internal.h b/monitor/monitor-internal.h index 5522e05464..23829f32f9 100644 --- a/monitor/monitor-internal.h +++ b/monitor/monitor-internal.h @@ -28,6 +28,7 @@ #include "chardev/char-fe.h" #include "monitor/monitor.h" #include "qapi/qapi-types-control.h" +#include "qapi/qapi-types-qom.h" #include "qapi/qmp-registry.h" #include "qobject/json-parser.h" #include "qemu/readline.h" @@ -178,7 +179,9 @@ struct MonitorQMP { Monitor parent_obj; JSONMessageParser parser; bool pretty; + MonitorQMPCloseAction close_action; bool setup_pending; /* iothread BH has not yet set up chardev handlers= */ + bool delete_pending; /* close_action has started 'delete' process */ /* * When a client connects, we're in capabilities negotiation mode. * @commands is &qmp_cap_negotiation_commands then. When command diff --git a/monitor/qmp.c b/monitor/qmp.c index 5301927f09..1057b0d12b 100644 --- a/monitor/qmp.c +++ b/monitor/qmp.c @@ -28,6 +28,7 @@ #include "monitor-internal.h" #include "qapi/error.h" #include "qapi/qapi-commands-control.h" +#include "qapi/qapi-commands-char.h" #include "qobject/qdict.h" #include "qobject/qjson.h" #include "qobject/qlist.h" @@ -103,6 +104,20 @@ static void monitor_qmp_set_pretty(Object *obj, bool v= al, Error **errp) mon->pretty =3D val; } =20 +static int monitor_qmp_get_close_action(Object *obj, Error **errp) +{ + MonitorQMP *mon =3D MONITOR_QMP(obj); + + return mon->close_action; +} + +static void monitor_qmp_set_close_action(Object *obj, int val, Error **err= p) +{ + MonitorQMP *mon =3D MONITOR_QMP(obj); + + mon->close_action =3D val; +} + static void monitor_qmp_emit_event(Monitor *mon, QAPIEvent event, QDict *q= dict); static bool monitor_qmp_requires_iothread(const Monitor *mon); static void monitor_qmp_complete(UserCreatable *uc, Error **errp); @@ -117,6 +132,11 @@ static void monitor_qmp_class_init(ObjectClass *cls, c= onst void *data) object_class_property_add_bool(cls, "pretty", monitor_qmp_get_pretty, monitor_qmp_set_pretty); + object_class_property_add_enum(cls, "close-action", + "MonitorQMPCloseAction", + &MonitorQMPCloseAction_lookup, + monitor_qmp_get_close_action, + monitor_qmp_set_close_action); =20 moncls->emit_event =3D monitor_qmp_emit_event; moncls->requires_iothread =3D monitor_qmp_requires_iothread; @@ -550,11 +570,45 @@ static QDict *qmp_greeting(MonitorQMP *mon) ver, cap_list); } =20 +static void monitor_qmp_self_delete_bh(void *opaque) +{ + MonitorQMP *mon =3D opaque; + g_autofree char *mon_id =3D object_property_get_child_name( + object_get_objects_root(), OBJECT(mon)); + g_autofree char *chardev_id =3D g_strdup(mon->parent_obj.chardev_id); + Error *local_error =3D NULL; + + if (!mon_id) { + /* Another monitor raced & ran 'object-del' on 'mon' + * before this BH got scheduled, so we have a ref on + * mon but it is already unparented. + */ + object_unref(mon); + return; + } + + user_creatable_del(mon_id, &local_error); + object_unref(mon); + if (local_error !=3D NULL) { + error_report_err(local_error); + } else { + qmp_chardev_remove(chardev_id, NULL); + } +} + static void monitor_qmp_event(void *opaque, QEMUChrEvent event) { QDict *data; MonitorQMP *mon =3D opaque; =20 + /* Protect against race if a client drops & quickly + * reconnects - we'll have the delete BH scheduled + * so must not honour a new open request + */ + if (mon->delete_pending) { + return; + } + switch (event) { case CHR_EVENT_OPENED: WITH_QEMU_LOCK_GUARD(&mon->parent_obj.mon_lock) { @@ -577,6 +631,27 @@ static void monitor_qmp_event(void *opaque, QEMUChrEve= nt event) json_message_parser_init(&mon->parser, handle_qmp_command, mon, NULL); monitor_fdsets_cleanup(); + switch (mon->close_action) { + case MONITOR_QMP_CLOSE_ACTION_NONE: + break; /* nada */ + case MONITOR_QMP_CLOSE_ACTION_DELETE: + mon->delete_pending =3D true; + /* + * Do NOT run in the AIO context associated with the + * monitor. We need to run in the default AIO context + * which is the same context in which 'qmp_object_del' + * will execute + * + * Hold an extra ref in case a separate monitor races + * with the BH by processing an explicit 'object-del' + */ + object_ref(mon); + aio_bh_schedule_oneshot(qemu_get_aio_context(), + monitor_qmp_self_delete_bh, mon); + break; + default: + g_assert_not_reached(); + } break; case CHR_EVENT_BREAK: case CHR_EVENT_MUX_IN: diff --git a/qapi/qom.json b/qapi/qom.json index 6affb70a59..b4c49a2e8b 100644 --- a/qapi/qom.json +++ b/qapi/qom.json @@ -1213,18 +1213,37 @@ 'base': 'MonitorProperties', 'data': { '*readline': 'bool' } } =20 + +## +# @MonitorQMPCloseAction: +# +# Action to take when the character device backend is +# closed. +# +# @none: take no action (the default) +# @delete: delete both the 'monitor-qmp' object and its associated +# character device backend object +# +# Since 11.1 +## +{ 'enum' : 'MonitorQMPCloseAction', + 'data': ['none', 'delete'] } + ## # @MonitorQMPProperties: # # Properties for the QMP monitor # # @pretty: whether to pretty print JSON responses (default: disabled) +# @close-action: action to take when the character device backend +# is closed (default: none) # # Since: 11.1 ## { 'struct': 'MonitorQMPProperties', 'base': 'MonitorProperties', - 'data': { '*pretty': 'bool' } } + 'data': { '*pretty': 'bool', + '*close-action': 'MonitorQMPCloseAction' } } =20 ## # @ObjectType: diff --git a/tests/functional/generic/test_monitor_hotplug.py b/tests/funct= ional/generic/test_monitor_hotplug.py index 55af8a238f..86092e781c 100755 --- a/tests/functional/generic/test_monitor_hotplug.py +++ b/tests/functional/generic/test_monitor_hotplug.py @@ -25,7 +25,7 @@ def setUp(self): sock_dir =3D self.socket_dir() self._sock_path =3D os.path.join(sock_dir.name, 'hotplug.sock') =20 - def _add_monitor(self): + def _add_monitor(self, autodelete=3DFalse): """Create a chardev + monitor and return the socket path.""" sock =3D self._sock_path self.vm.cmd('chardev-add', id=3D'hotplug-chr', backend=3D{ @@ -39,9 +39,15 @@ def _add_monitor(self): 'wait': False, } }) - self.vm.cmd('object-add', id=3D'hotplug-mon', - qom_type=3D'monitor-qmp', - chardev=3D'hotplug-chr') + if autodelete: + self.vm.cmd('object-add', id=3D'hotplug-mon', + qom_type=3D'monitor-qmp', + chardev=3D'hotplug-chr', + close_action=3D'delete') + else: + self.vm.cmd('object-add', id=3D'hotplug-mon', + qom_type=3D'monitor-qmp', + chardev=3D'hotplug-chr') return sock =20 def _remove_monitor(self): @@ -118,6 +124,75 @@ def test_self_removal(self): # Clean up the chardev self.vm.cmd('chardev-remove', id=3D'hotplug-chr') =20 + def test_auto_delete(self): + """ + A dynamically-added monitor configured with 'close-action=3Ddelete' + should see itself deleted when the client is closed. + """ + self.set_machine('none') + self.vm.add_args('-nodefaults') + self.vm.launch() + + sock =3D self._add_monitor(autodelete=3DTrue) + + cdevs =3D [c["label"] for c in self.vm.cmd('query-chardev')] + objs =3D [o["name"] for o in self.vm.cmd('qom-list', path=3D'/obje= cts')] + assert ('hotplug-chr' in cdevs) + assert ('hotplug-mon' in objs) + + qmp =3D QEMUMonitorProtocol(sock) + greeting =3D qmp.connect(negotiate=3DTrue) + self.assertIn('QMP', greeting) + + cdevs =3D [c["label"] for c in self.vm.cmd('query-chardev')] + objs =3D [o["name"] for o in self.vm.cmd('qom-list', path=3D'/obje= cts')] + assert ('hotplug-chr' in cdevs) + assert ('hotplug-mon' in objs) + + qmp.close() + + # Wait upto 10 seconds max for chardev to auto-delete, which + # is hopefully enough for reliability under high load + for i in range(int(10 / 0.2)): + cdevs =3D [c["label"] for c in self.vm.cmd('query-chardev')] + if 'hotplug-chr' not in cdevs: + break + # Wait a little more then try again + time.sleep(0.2) + + cdevs =3D [c["label"] for c in self.vm.cmd('query-chardev')] + objs =3D [o["name"] for o in self.vm.cmd('qom-list', path=3D'/obje= cts')] + assert ('hotplug-chr' not in cdevs) + assert ('hotplug-mon' not in objs) + + def test_reconnect(self): + """ + A dynamically-added monitor configured without 'close-action' + should allow reconnects after the client is closed. + """ + self.set_machine('none') + self.vm.add_args('-nodefaults') + self.vm.launch() + + sock =3D self._add_monitor() + + qmp =3D QEMUMonitorProtocol(sock) + qmp.connect(negotiate=3DTrue) + + resp =3D qmp.cmd_obj({'execute': 'query-chardev'}) + self.assertIn('return', resp) + + qmp.close() + + qmp =3D QEMUMonitorProtocol(sock) + qmp.connect(negotiate=3DTrue) + + resp =3D qmp.cmd_obj({'execute': 'query-chardev'}) + self.assertIn('return', resp) + + qmp.close() + self._remove_monitor() + def test_large_response(self): """ Send a command with a large response (query-qmp-schema) on a --=20 2.54.0 From nobody Wed Jun 24 21:40:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1782322957; cv=none; d=zohomail.com; s=zohoarc; b=kwkoIh3HaHG22k43KFUG1i7OYz2Ri0OarcGx5Hu9jbIEbpBziFCvqFKT70Zy7nX5Q2UWtPw8J0nzUT0Iofj2kPxCgCexFGGVyJG2wT7TtH2NlDec6z9loTkmXfUzvxZJrbplNgrqXyFSzeltwUgs7SDm4kaeVeSE+dNx3b/2uQM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782322957; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=Pqi7KaiRHmEDqZfbxS9mA8im3z6ZpeLSJ3dawWCKIwc=; b=VS3mMaATvSIdVZ4LNNpi+NCEXtf2CpG7KP+GMQUP4CK5CRlbBekb7mVqI0dUM8HBmM35A488zJTzRWxLpSUvaEgGtUTcurGwdVx/UTuXXoifXaa884txi4RB2uI03hK35fk8RUuy6eAzmdy3eUCsspTKvYm5Rm/grE3awuZl+RA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782322957150407.32654731515527; Wed, 24 Jun 2026 10:42:37 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcRaE-0003Y6-Ps; Wed, 24 Jun 2026 13:40:18 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRaC-0003XY-M8 for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:40:16 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRaB-0004h1-AB for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:40:16 -0400 Received: from mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-622-yW3gEjkDP5CxQNoMlnZ0GA-1; Wed, 24 Jun 2026 13:40:11 -0400 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 122671955E9C; Wed, 24 Jun 2026 17:40:10 +0000 (UTC) Received: from berrange.com (unknown [10.44.32.102]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id C037C180028B; Wed, 24 Jun 2026 17:40:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1782322814; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Pqi7KaiRHmEDqZfbxS9mA8im3z6ZpeLSJ3dawWCKIwc=; b=clWZ4Ojw8k4qp5ShZWfH0tYH7lV/0Z/chMu6LaI/cCQFqHjjoLdRQ51Fxkd8deL9A2sTSM BI0UBKqEKnCDHChYHGOBXOU0C03eQbzN611W/9fL5sOyz0aX/eEaT2unclw23zyxqSHAWe P9jNsLliI9JSlYmb1Azg/9Vsx2xUfqo= X-MC-Unique: yW3gEjkDP5CxQNoMlnZ0GA-1 X-Mimecast-MFC-AGG-ID: yW3gEjkDP5CxQNoMlnZ0GA_1782322810 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: qemu-devel@nongnu.org Cc: devel@lists.libvirt.org, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Markus Armbruster , Paolo Bonzini , "Dr. David Alan Gilbert" , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Brauner , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Peter Krempa Subject: [PATCH v5 33/35] tests: switch from -mon to -object monitor-qmp Date: Wed, 24 Jun 2026 18:37:49 +0100 Message-ID: <20260624173752.2928717-34-berrange@redhat.com> In-Reply-To: <20260624173752.2928717-1-berrange@redhat.com> References: <20260624173752.2928717-1-berrange@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: 8 X-Spam_score: 0.8 X-Spam_bar: / X-Spam_report: (0.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.445, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_SBL_CSS=3.335, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1782322958133158500 Use the new preferred low level option for configuring the QMP service in libqtest and the python Machine class used by tests. This will avoid triggering deprecation warnings after the subsequent commit. Reviewed-by: Marc-Andr=C3=A9 Lureau Tested-by: Peter Krempa Signed-off-by: Daniel P. Berrang=C3=A9 --- python/qemu/machine/machine.py | 4 ++-- tests/qtest/libqtest.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/python/qemu/machine/machine.py b/python/qemu/machine/machine.py index ebb58d5b68..5f4845f5fb 100644 --- a/python/qemu/machine/machine.py +++ b/python/qemu/machine/machine.py @@ -304,8 +304,8 @@ def _base_args(self) -> List[str]: ) else: moncdev =3D f"socket,id=3Dmon,path=3D{self._monitor_addres= s}" - args.extend(['-chardev', moncdev, '-mon', - 'chardev=3Dmon,mode=3Dcontrol']) + args.extend(['-chardev', moncdev, '-object', + 'monitor-qmp,id=3Dqmp,chardev=3Dmon']) =20 if self._machine is not None: args.extend(['-machine', self._machine]) diff --git a/tests/qtest/libqtest.c b/tests/qtest/libqtest.c index 4e22c66b75..c33c799c92 100644 --- a/tests/qtest/libqtest.c +++ b/tests/qtest/libqtest.c @@ -460,7 +460,7 @@ gchar *qtest_qemu_args(const char *extra_args) "-qtest unix:%s " "-qtest-log %s " "-chardev socket,path=3D%s,id=3Dchar0 " - "-mon chardev=3Dchar0,mode=3Dcontrol " + "-object monitor-qmp,id=3Dqmp0,chardev=3Dchar0 " "-display none " "-audio none " "%s " --=20 2.54.0 From nobody Wed Jun 24 21:40:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1782322968; cv=none; d=zohomail.com; s=zohoarc; b=hpKH6HIwRUz1BTkmH7XWCMmqgGZ4qsH2zmDllRW9BsCPgrxQTnx349k+9yPB88pZvlHbgGKARufp9KABt5aae8bjmzpc3ytl3n2069MvEASgOYe8uNtPK51SITaizRVkyFWMMJC6sOWF3CccAYsqtoAHLo3+TLmyxs8POP7eRbo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782322968; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=Lz8lk2IsqKnoGRepbUtaYXVM/MId6jWWp/KBsh/Qpm8=; b=Sp64pRS+E5Z3JLV5jQn/eERhyTXJ7QNrMD5hpljYFDys9LVuCG1zFNN6yMV3v638eCfAww9oM+tC54xSl1I3IkV89TD8QYYAvm3xArowP7mTiPz+iC9rmdArtzkpWggycTP0Ag70eLY0q3bG4GdLaG5+aNcNi5YcjwkghJKZ70c= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782322967965959.2535002974656; Wed, 24 Jun 2026 10:42:47 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcRaI-0003cH-Cd; Wed, 24 Jun 2026 13:40:22 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRaG-0003a1-P7 for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:40:20 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRaF-0004hN-4s for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:40:20 -0400 Received: from mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-649-xcb-Jw8rPzalj9fxawf5Sw-1; Wed, 24 Jun 2026 13:40:15 -0400 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id B9D3918005A5; Wed, 24 Jun 2026 17:40:13 +0000 (UTC) Received: from berrange.com (unknown [10.44.32.102]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 80FCF180028B; Wed, 24 Jun 2026 17:40:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1782322818; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Lz8lk2IsqKnoGRepbUtaYXVM/MId6jWWp/KBsh/Qpm8=; b=KA2rcSc7W9kObCKEG5g/IfSgJBAfQfofplA4TKn/l2vn5gm5IqhFc6za73MYQ6OpkaB7CP kZV+3mhYTF0qJD9+7+1LKVst5oolpOs3khM4g6ZtFk15HlNpTOfyD98UUIG24m6idc12je 6OFK/bxGm+QAPXwAUQMkcGC1jcKkQKs= X-MC-Unique: xcb-Jw8rPzalj9fxawf5Sw-1 X-Mimecast-MFC-AGG-ID: xcb-Jw8rPzalj9fxawf5Sw_1782322813 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: qemu-devel@nongnu.org Cc: devel@lists.libvirt.org, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Markus Armbruster , Paolo Bonzini , "Dr. David Alan Gilbert" , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Brauner , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Peter Krempa Subject: [PATCH v5 34/35] qemu-options: document new monitor-hmp and monitor-qmp objects Date: Wed, 24 Jun 2026 18:37:50 +0100 Message-ID: <20260624173752.2928717-35-berrange@redhat.com> In-Reply-To: <20260624173752.2928717-1-berrange@redhat.com> References: <20260624173752.2928717-1-berrange@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -24 X-Spam_score: -2.5 X-Spam_bar: -- X-Spam_report: (-2.5 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.445, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1782322968408158500 Add new docs for the `-object monitor-hmp` and `-object monitor-qmp` options, updating `-mon` to state that it is legacy syntax sugar for the new `-object` args. Reviewed-by: Marc-Andr=C3=A9 Lureau Tested-by: Peter Krempa Signed-off-by: Daniel P. Berrang=C3=A9 --- qemu-options.hx | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/qemu-options.hx b/qemu-options.hx index c799286153..a804d5b880 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -4980,6 +4980,16 @@ SRST -mon chardev=3Dmon1,mode=3Dcontrol,pretty=3Don =20 enables the QMP monitor on localhost port 4444 with pretty-printing. + + The use of ``-mon mode=3Dreadline`` is historical syntax sugar + for the new ``-object monitor-hmp`` option, each use of which + creates an object with the ID ``hmpcompatNNN`` where ``NNN`` is + a counter starting from 0. + + The use of ``-mon mode=3Dcontrol`` is historical syntax sugar + for the new ``-object monitor-qmp`` option, each use of which + creates an object with the ID ``qmpcompatNNN`` where ``NNN`` is + a counter starting from 0. ERST =20 DEF("debugcon", HAS_ARG, QEMU_OPTION_debugcon, \ @@ -5730,6 +5740,45 @@ SRST they are specified. Note that the 'id' property must be set. These objects are placed in the '/objects' path. =20 + ``-object monitor-hmp,id=3Did,chardev=3Dchardev_id,readline=3Don|off`` + Set up a monitor running the Human Monitor Protocol, + connected to the chardev ``chardev_id``. + + The ``id`` parameter is a unique ID that can be used + to dynamically delete the monitor at runtime. Note + that monitors created using the historical syntax + will be allocated IDs following the pattern ``hmpcompatNN``. + Mixing ``-object`` with the historical monitor syntax is + discouraged. + + The ``readline`` parameter, which defaults to ``on``, + controls whether the monitor provides line editing. + + ``-object monitor-qmp,id=3Did,chardev=3Dchardev_id,pretty=3Don|off,clo= se-action=3Dnone|delete`` + Set up a monitor running the QEMU Monitor Protocol, + connected to the chardev ``chardev_id``. + + The ``id`` parameter is a unique ID that can be used + to dynamically delete the monitor at runtime. Note + that monitors created using the historical syntax + will be allocated IDs following the pattern ``qmpcompatNN``. + Mixing ``-object`` with the historical monitor syntax is + discouraged. + + The ``pretty`` parameter, which defaults to ``off``, + controls whether the monitor responses are pretty + printed as multi-line indented JSON, as opposed to + constrained to a single line without extraneous + whitespace. + + The ``close-action`` parameter, which defaults to ``none``, + controls what happens when the connection to the monitor + is terminated by the user. If set to ``delete``, then the + ``monitor-qmp`` object and its associated character + device are both immediately deleted. This can be useful + if an extra monitor was hotplugged for a specific task + and should be unplugged when completed. + ``-object memory-backend-file,id=3Did,size=3Dsize,mem-path=3Ddir,share= =3Don|off,discard-data=3Don|off,merge=3Don|off,dump=3Don|off,prealloc=3Don|= off,host-nodes=3Dhost-nodes,policy=3Ddefault|preferred|bind|interleave,alig= n=3Dalign,offset=3Doffset,readonly=3Don|off,rom=3Don|off|auto`` Creates a memory file backend object, which can be used to back the guest RAM with huge pages. --=20 2.54.0 From nobody Wed Jun 24 21:40:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1782322922; cv=none; d=zohomail.com; s=zohoarc; b=Qp2fMvb7YVY1prmbxVC2p9X9tVwqL9sO0DYplfo7ShpidMCgg1oQ1ouDJBXYfxOMy4QFj/7XmOAk26//m/1ZJmq/vCBhAuLPlIN2t9sGyh5KiWTgKr3GzscaOJDbpbaf9SAPJsoUYzJ75ACVgMzA2KprZ5OtsKTwFGWBQso6AQk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782322922; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=vyKmhJZ9ZTKwVwy/dtj2qUF9eA1epn+1O+ZfCkokJTU=; b=EYu+RLUozPYVWOGY52O7jyVoUplTpXLqnM62iJhFVijHBLA2RPU3ffKzlv1f1U9WMUmgJhQmoSHLHUioxII7OgpVpSC+xeJ9uujGJYRsuVAyUkkS05rZMBQKQ0x3BQov4RqjDJF7XcHNfbcq9iiRkfzUAbCkI1kLPO6vz++QPa0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 178232292251397.87452590448561; Wed, 24 Jun 2026 10:42:02 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcRah-0004KI-7S; Wed, 24 Jun 2026 13:40:47 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRaV-00044y-D1 for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:40:38 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcRaT-0004uF-Hq for qemu-devel@nongnu.org; Wed, 24 Jun 2026 13:40:35 -0400 Received: from mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-106-M83ep0GpO5OmF0l1qQ2tQw-1; Wed, 24 Jun 2026 13:40:24 -0400 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 9FF811955E91; Wed, 24 Jun 2026 17:40:17 +0000 (UTC) Received: from berrange.com (unknown [10.44.32.102]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 400F2180028B; Wed, 24 Jun 2026 17:40:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1782322832; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=vyKmhJZ9ZTKwVwy/dtj2qUF9eA1epn+1O+ZfCkokJTU=; b=QVCxZVhVScGoeU6CicGZM6nsWHCDQllv0ANYeUkk1w4fw3aK8eyPgHlEOKlHpgIeGje+Ah FPbzJwLautQrAIYl83UwrmtQJsLohEDPSTExTKKjZSazkrObreWdz/TRMvYBjxuKlWXu1C Fc3A5424a44g/FH6r5VQxGUHE3CMqFU= X-MC-Unique: M83ep0GpO5OmF0l1qQ2tQw-1 X-Mimecast-MFC-AGG-ID: M83ep0GpO5OmF0l1qQ2tQw_1782322817 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: qemu-devel@nongnu.org Cc: devel@lists.libvirt.org, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Markus Armbruster , Paolo Bonzini , "Dr. David Alan Gilbert" , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Brauner , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Peter Krempa Subject: [PATCH v5 35/35] docs: mark '-mon' as deprecated in favour of -object Date: Wed, 24 Jun 2026 18:37:51 +0100 Message-ID: <20260624173752.2928717-36-berrange@redhat.com> In-Reply-To: <20260624173752.2928717-1-berrange@redhat.com> References: <20260624173752.2928717-1-berrange@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: 8 X-Spam_score: 0.8 X-Spam_bar: / X-Spam_report: (0.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.445, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_SBL_CSS=3.335, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1782322924022158500 The high level `-qmp` and `-monitor` options can remain as convenience wrappers, but the low level `-mon` is completed obsoleted by the new `-object` support with 'monitor-qmp' and 'monitor-hmp' types. Reviewed-by: Marc-Andr=C3=A9 Lureau Tested-by: Peter Krempa Signed-off-by: Daniel P. Berrang=C3=A9 --- docs/about/deprecated.rst | 10 ++++++++++ docs/devel/writing-monitor-commands.rst | 4 ++-- docs/system/arm/xenpvh.rst | 4 ++-- docs/system/i386/xen.rst | 3 ++- docs/system/i386/xenpvh.rst | 4 ++-- qemu-options.hx | 11 ++++++----- system/vl.c | 2 ++ 7 files changed, 26 insertions(+), 12 deletions(-) diff --git a/docs/about/deprecated.rst b/docs/about/deprecated.rst index 97750f5edc..8370fc5680 100644 --- a/docs/about/deprecated.rst +++ b/docs/about/deprecated.rst @@ -61,6 +61,16 @@ The ``debug-threads`` option of the ``-name`` argument i= s now ignored. Thread naming is unconditionally enabled for all platforms where it is supported. =20 +``-mon`` option (since 11.1) +'''''''''''''''''''''''''''' + +The ``-mon`` option was the generic mechanism for creating monitor objects +if the convenience ``-qmp`` or ``-monitor`` options were not flexible +enough. The monitor objects have been converted to QOM, so ``-mon mode=3Dr= eadline`` +is replaced by ``-object monitor-hmp`` and ``-mon mode=3Dcontrol`` is repl= aced +by ``-object monitor-qmp``. The short convenience options are not deprecat= ed, +only ``-mon``. + QEMU Machine Protocol (QMP) commands ------------------------------------ =20 diff --git a/docs/devel/writing-monitor-commands.rst b/docs/devel/writing-m= onitor-commands.rst index 930da5cd06..7ae7efe327 100644 --- a/docs/devel/writing-monitor-commands.rst +++ b/docs/devel/writing-monitor-commands.rst @@ -52,8 +52,8 @@ shown here. First, QEMU should be started like this:: =20 # qemu-system-TARGET [...] \ - -chardev socket,id=3Dqmp,port=3D4444,host=3Dlocalhost,server=3Don \ - -mon chardev=3Dqmp,mode=3Dcontrol,pretty=3Don + -chardev socket,id=3Dchrqmp0,port=3D4444,host=3Dlocalhost,server=3Don= \ + -object monitor-qmp,chardev=3Dchrqmp0,pretty=3Don,id=3Dqmp0 =20 Then, in a different terminal:: =20 diff --git a/docs/system/arm/xenpvh.rst b/docs/system/arm/xenpvh.rst index 430ac2c02e..511af63e3d 100644 --- a/docs/system/arm/xenpvh.rst +++ b/docs/system/arm/xenpvh.rst @@ -27,9 +27,9 @@ Sample QEMU xenpvh commands for running and connecting wi= th Xen: =20 qemu-system-aarch64 -xen-domid 1 \ -chardev socket,id=3Dlibxl-cmd,path=3Dqmp-libxl-1,server=3Don,wait= =3Doff \ - -mon chardev=3Dlibxl-cmd,mode=3Dcontrol \ + -object monitor-qmp,id=3Dqmp0,chardev=3Dlibxl-cmd \ -chardev socket,id=3Dlibxenstat-cmd,path=3Dqmp-libxenstat-1,server= =3Don,wait=3Doff \ - -mon chardev=3Dlibxenstat-cmd,mode=3Dcontrol \ + -object monitor-qmp,id=3Dqmp1,chardev=3Dlibxenstat-cmd \ -xen-attach -name guest0 -vnc none -display none -nographic \ -machine xenpvh -m 1301 \ -chardev socket,id=3Dchrtpm,path=3Dtmp/vtpm2/swtpm-sock \ diff --git a/docs/system/i386/xen.rst b/docs/system/i386/xen.rst index 46db5f34c1..6ff5cdb1e4 100644 --- a/docs/system/i386/xen.rst +++ b/docs/system/i386/xen.rst @@ -79,7 +79,8 @@ of type ``xen-console`` to connect to it. For the Xen con= sole equivalent of the handy ``-serial mon:stdio`` option, for example: =20 .. parsed-literal:: - -chardev stdio,mux=3Don,id=3Dchar0,signal=3Doff -mon char0 \\ + -chardev stdio,mux=3Don,id=3Dchar0,signal=3Doff \\ + -object monitor-hmp,chardev=3Dchar0,id=3Dhmp0 \\ -device xen-console,chardev=3Dchar0 =20 The Xen network device is ``xen-net-device``, which becomes the default NIC diff --git a/docs/system/i386/xenpvh.rst b/docs/system/i386/xenpvh.rst index 354250f073..904778e3f5 100644 --- a/docs/system/i386/xenpvh.rst +++ b/docs/system/i386/xenpvh.rst @@ -33,9 +33,9 @@ case you need to construct one manually: =20 qemu-system-i386 -xen-domid 3 -no-shutdown \ -chardev socket,id=3Dlibxl-cmd,path=3D/var/run/xen/qmp-libxl-3,serve= r=3Don,wait=3Doff \ - -mon chardev=3Dlibxl-cmd,mode=3Dcontrol \ + -object monitor-qmp,id=3Dqmp0,chardev=3Dlibxl-cmd \ -chardev socket,id=3Dlibxenstat-cmd,path=3D/var/run/xen/qmp-libxenst= at-3,server=3Don,wait=3Doff \ - -mon chardev=3Dlibxenstat-cmd,mode=3Dcontrol \ + -object monitor-qmp,id=3Dqmp1,chardev=3Dlibxenstat-cmd \ -nodefaults \ -no-user-config \ -xen-attach -name g0 \ diff --git a/qemu-options.hx b/qemu-options.hx index a804d5b880..999dca7444 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -4137,7 +4137,7 @@ The general form of a character device option is: :: =20 -chardev stdio,mux=3Don,id=3Dchar0 \ - -mon chardev=3Dchar0,mode=3Dreadline \ + -object monitor-hmp,id=3Dhmp0,chardev=3Dchar0 \ -serial chardev:char0 \ -serial chardev:char0 =20 @@ -4149,7 +4149,7 @@ The general form of a character device option is: :: =20 -chardev stdio,mux=3Don,id=3Dchar0 \ - -mon chardev=3Dchar0,mode=3Dreadline \ + -object monitor-hmp,id=3Dhmp0,chardev=3Dchar0 \ -parallel chardev:char0 \ -chardev tcp,...,mux=3Don,id=3Dchar1 \ -serial chardev:char1 \ @@ -4950,7 +4950,8 @@ SRST -qmp tcp:localhost:4444,server=3Don,wait=3Doff =20 Not all options are configurable via this syntax; for maximum - flexibility use the ``-mon`` option and an accompanying ``-chardev``. + flexibility use ``-object monitor-qmp`` and an accompanying + ``-chardev``. =20 ERST DEF("qmp-pretty", HAS_ARG, QEMU_OPTION_qmp_pretty, \ @@ -4981,12 +4982,12 @@ SRST =20 enables the QMP monitor on localhost port 4444 with pretty-printing. =20 - The use of ``-mon mode=3Dreadline`` is historical syntax sugar + The use of ``-mon mode=3Dreadline`` is deprecated syntax sugar for the new ``-object monitor-hmp`` option, each use of which creates an object with the ID ``hmpcompatNNN`` where ``NNN`` is a counter starting from 0. =20 - The use of ``-mon mode=3Dcontrol`` is historical syntax sugar + The use of ``-mon mode=3Dcontrol`` is deprecated syntax sugar for the new ``-object monitor-qmp`` option, each use of which creates an object with the ID ``qmpcompatNNN`` where ``NNN`` is a counter starting from 0. diff --git a/system/vl.c b/system/vl.c index 79ed2be449..a7b6d37452 100644 --- a/system/vl.c +++ b/system/vl.c @@ -3240,6 +3240,8 @@ void qemu_init(int argc, char **argv) default_monitor =3D 0; break; case QEMU_OPTION_mon: + warn_report_once("'-mon' is deprecated, use '-object' with= " + "'monitor-hmp' or 'monitor-qmp' types ins= tead"); if (!qemu_opts_parse_noisily(qemu_find_opts("mon"), optarg, true)) { exit(1); --=20 2.54.0