From patchwork Sat Feb 8 07:51:07 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Akihiko Odaki X-Patchwork-Id: 13966300 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 41AEFC0219E for ; Sat, 8 Feb 2025 07:51:58 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tgfcf-0005xv-JC; Sat, 08 Feb 2025 02:51:29 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tgfce-0005vT-4S for qemu-devel@nongnu.org; Sat, 08 Feb 2025 02:51:28 -0500 Received: from mail-pj1-x102b.google.com ([2607:f8b0:4864:20::102b]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1tgfcc-0007VL-3W for qemu-devel@nongnu.org; Sat, 08 Feb 2025 02:51:27 -0500 Received: by mail-pj1-x102b.google.com with SMTP id 98e67ed59e1d1-2fa21145217so3595364a91.3 for ; Fri, 07 Feb 2025 23:51:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=daynix-com.20230601.gappssmtp.com; s=20230601; t=1739001084; x=1739605884; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=KZyqVN9RpjPMwnzyGHN4dKQm8h3LMbjbUFr2jjDnuTQ=; b=1R+kr0bVn3SJZtXYk3fYGYd841eQImoo4dinsgtj/x8H3OW3r/JwrWqlGaK/mwyEb/ rlIs0VLzN+dOGziERAFkY/ri13tH/3EBjl26sEB3ZkfX3sotYpj+oFpwB9ptbL1h5X1e zEa5a4j1/eUgzAiYXDAE1M9NVrR0yoHtD66hr0tAKyvNlsWAZzWng90my7AE0no90DSJ a6qIZoVRsetoGhK7HlHvrUCiVK8zFsFHX8D0slXbEW5tu8zTLQ78hZcPve7t4SeQ/U/a uOyyBGLAvhJijFkU7O1ePfQ45b9qxljygNEFpiTq0szKbNMC9rJybLA19Q3Id9KDHmsQ zrSA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739001084; x=1739605884; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=KZyqVN9RpjPMwnzyGHN4dKQm8h3LMbjbUFr2jjDnuTQ=; b=gf4TlOAXupfC9Jobc6BuxeRctouOxWSUNeY4eg5YEyXe6ChWI6tXOWGkbCgDtfsksn Sv1zX6ZjyfooDWVeDenXxx+sBhdsRB2aqnIBwMfAveG0K7lyxA2iOpY7+PzS0lvO2nau iqLGIpUkKQhZ0gSAOXd9d5YbQu34p+cOGRinwJ+m8aAonpljzWYaC/9Vn+eQzC8/EwOj WCeIpHDyTS4wc5bm7ilEGujcg7LkgAbFEwIucmkMx4+zAXAZsRMrN3L+fplJwuRXjFbS K2F/STmeNchcyE9Ke3v1nrePPWjjcaodH1EAftTTgHoans4INVXCXWNkK18jlY6b0htH 9usQ== X-Gm-Message-State: AOJu0YzigwKTmOhZyNnHd0BGOGW7pxQDRt332iDK7v1i8rhgR6Zdquph Hu9oOxFIiWmhbe3btGcJri1Mkg4kfwzENngRtX4GK2qrIqzNGcCahFx3Wx/iP3s= X-Gm-Gg: ASbGncvjZFS4dxu8QqRgoh6J7xEtgG7vCjXCramUyhLf8ejF3ugm10KDvJzPRguYXTZ 5ZVMZ0iaru3T29QSVvKCVuE7ZntP1kiJrRhgwTbPUu1SV4VE1wgZ3Dvbi+eJ3tXMyG0Tn8kBtge kBIay1GbkrENorHOHuhoSy3XccR0HATBj2ffSNH6iwRugSIVgERkqyxAqJpTJRJQcbA63iqQ7c8 dOYrRSBzkkiBRZD2LbP0j4u5taSsI5kPse/4uO1nqRNAhLvSqY2m1RahrloNql78U+4+HHpIdgW JMTCrn1UJHVNbb21wog= X-Google-Smtp-Source: AGHT+IHPrU85QsIRqJLCtguhWbqF3bbTUKbJ5D/sFO+5WJzVuQMTsodkADu3jFdgFFtRVU72+OYw0A== X-Received: by 2002:a05:6a00:3d51:b0:729:35b:542e with SMTP id d2e1a72fcca58-7305d51c6a5mr8372289b3a.16.1739001084579; Fri, 07 Feb 2025 23:51:24 -0800 (PST) Received: from localhost ([157.82.205.237]) by smtp.gmail.com with UTF8SMTPSA id d2e1a72fcca58-7307cf77a3asm68331b3a.68.2025.02.07.23.51.19 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 07 Feb 2025 23:51:24 -0800 (PST) From: Akihiko Odaki Date: Sat, 08 Feb 2025 16:51:07 +0900 Subject: [PATCH v5 1/4] qapi: Do not consume a value if failed MIME-Version: 1.0 Message-Id: <20250208-virtio-v5-1-4376cb218c0f@daynix.com> References: <20250208-virtio-v5-0-4376cb218c0f@daynix.com> In-Reply-To: <20250208-virtio-v5-0-4376cb218c0f@daynix.com> To: Jason Wang , Dmitry Fleytman , Sriram Yagnaraman , "Michael S. Tsirkin" , Luigi Rizzo , Giuseppe Lettieri , Vincenzo Maffione , Andrew Melnychenko , Yuri Benditovich , Paolo Bonzini , =?utf-8?q?Daniel_P=2E_Berrang=C3=A9?= , Eduardo Habkost , Markus Armbruster , Michael Roth , Marcel Apfelbaum , =?utf-8?q?Philippe_Mathieu-?= =?utf-8?q?Daud=C3=A9?= , Yanan Wang , Zhao Liu , Lei Yang , BALATON Zoltan Cc: qemu-devel@nongnu.org, Akihiko Odaki X-Mailer: b4 0.14.2 Received-SPF: pass client-ip=2607:f8b0:4864:20::102b; envelope-from=akihiko.odaki@daynix.com; helo=mail-pj1-x102b.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=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: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Do not consume a value if interpreting one failed so that we can reinterpret the value with a different type. Signed-off-by: Akihiko Odaki --- qapi/qobject-input-visitor.c | 103 +++++++++++++++++++++++++++++-------------- 1 file changed, 69 insertions(+), 34 deletions(-) diff --git a/qapi/qobject-input-visitor.c b/qapi/qobject-input-visitor.c index f110a804b2ae0f3f75122775ddbc5ec7cc5de230..799c1c9bd6bde0676d6b028b485de13cb4884395 100644 --- a/qapi/qobject-input-visitor.c +++ b/qapi/qobject-input-visitor.c @@ -116,9 +116,8 @@ static const char *full_name(QObjectInputVisitor *qiv, const char *name) return full_name_nth(qiv, name, 0); } -static QObject *qobject_input_try_get_object(QObjectInputVisitor *qiv, - const char *name, - bool consume) +static QObject *qobject_input_try_get_object(const QObjectInputVisitor *qiv, + const char *name) { StackObject *tos; QObject *qobj; @@ -138,34 +137,19 @@ static QObject *qobject_input_try_get_object(QObjectInputVisitor *qiv, if (qobject_type(qobj) == QTYPE_QDICT) { assert(name); ret = qdict_get(qobject_to(QDict, qobj), name); - if (tos->h && consume && ret) { - bool removed = g_hash_table_remove(tos->h, name); - assert(removed); - } } else { assert(qobject_type(qobj) == QTYPE_QLIST); assert(!name); - if (tos->entry) { - ret = qlist_entry_obj(tos->entry); - if (consume) { - tos->entry = qlist_next(tos->entry); - } - } else { - ret = NULL; - } - if (consume) { - tos->index++; - } + ret = tos->entry ? qlist_entry_obj(tos->entry) : NULL; } return ret; } static QObject *qobject_input_get_object(QObjectInputVisitor *qiv, - const char *name, - bool consume, Error **errp) + const char *name, Error **errp) { - QObject *obj = qobject_input_try_get_object(qiv, name, consume); + QObject *obj = qobject_input_try_get_object(qiv, name); if (!obj) { error_setg(errp, QERR_MISSING_PARAMETER, full_name(qiv, name)); @@ -173,6 +157,38 @@ static QObject *qobject_input_get_object(QObjectInputVisitor *qiv, return obj; } +static void qobject_input_consume_object(QObjectInputVisitor *qiv, + const char *name) +{ + StackObject *tos; + QObject *qobj; + + if (QSLIST_EMPTY(&qiv->stack)) { + /* Starting at root, name is ignored. */ + return; + } + + /* We are in a container; find the next element. */ + tos = QSLIST_FIRST(&qiv->stack); + qobj = tos->obj; + assert(qobj); + + if (qobject_type(qobj) == QTYPE_QDICT) { + assert(name); + if (tos->h) { + bool removed = g_hash_table_remove(tos->h, name); + assert(removed); + } + } else { + assert(qobject_type(qobj) == QTYPE_QLIST); + assert(!name); + if (tos->entry) { + tos->entry = qlist_next(tos->entry); + } + tos->index++; + } +} + static const char *qobject_input_get_keyval(QObjectInputVisitor *qiv, const char *name, Error **errp) @@ -180,7 +196,7 @@ static const char *qobject_input_get_keyval(QObjectInputVisitor *qiv, QObject *qobj; QString *qstr; - qobj = qobject_input_get_object(qiv, name, true, errp); + qobj = qobject_input_get_object(qiv, name, errp); if (!qobj) { return NULL; } @@ -233,6 +249,7 @@ static const QListEntry *qobject_input_push(QObjectInputVisitor *qiv, tos->index = -1; } + qobject_input_consume_object(qiv, name); QSLIST_INSERT_HEAD(&qiv->stack, tos, node); return tos->entry; } @@ -279,7 +296,7 @@ static bool qobject_input_start_struct(Visitor *v, const char *name, void **obj, size_t size, Error **errp) { QObjectInputVisitor *qiv = to_qiv(v); - QObject *qobj = qobject_input_get_object(qiv, name, true, errp); + QObject *qobj = qobject_input_get_object(qiv, name, errp); if (obj) { *obj = NULL; @@ -316,7 +333,7 @@ static bool qobject_input_start_list(Visitor *v, const char *name, Error **errp) { QObjectInputVisitor *qiv = to_qiv(v); - QObject *qobj = qobject_input_get_object(qiv, name, true, errp); + QObject *qobj = qobject_input_get_object(qiv, name, errp); const QListEntry *entry; if (list) { @@ -382,7 +399,7 @@ static bool qobject_input_start_alternate(Visitor *v, const char *name, Error **errp) { QObjectInputVisitor *qiv = to_qiv(v); - QObject *qobj = qobject_input_get_object(qiv, name, false, errp); + QObject *qobj = qobject_input_get_object(qiv, name, errp); if (!qobj) { *obj = NULL; @@ -397,7 +414,7 @@ static bool qobject_input_type_int64(Visitor *v, const char *name, int64_t *obj, Error **errp) { QObjectInputVisitor *qiv = to_qiv(v); - QObject *qobj = qobject_input_get_object(qiv, name, true, errp); + QObject *qobj = qobject_input_get_object(qiv, name, errp); QNum *qnum; if (!qobj) { @@ -409,6 +426,7 @@ static bool qobject_input_type_int64(Visitor *v, const char *name, int64_t *obj, full_name(qiv, name)); return false; } + qobject_input_consume_object(qiv, name); return true; } @@ -428,6 +446,7 @@ static bool qobject_input_type_int64_keyval(Visitor *v, const char *name, full_name(qiv, name), "integer"); return false; } + qobject_input_consume_object(qiv, name); return true; } @@ -435,7 +454,7 @@ static bool qobject_input_type_uint64(Visitor *v, const char *name, uint64_t *obj, Error **errp) { QObjectInputVisitor *qiv = to_qiv(v); - QObject *qobj = qobject_input_get_object(qiv, name, true, errp); + QObject *qobj = qobject_input_get_object(qiv, name, errp); QNum *qnum; int64_t val; @@ -448,12 +467,14 @@ static bool qobject_input_type_uint64(Visitor *v, const char *name, } if (qnum_get_try_uint(qnum, obj)) { + qobject_input_consume_object(qiv, name); return true; } /* Need to accept negative values for backward compatibility */ if (qnum_get_try_int(qnum, &val)) { *obj = val; + qobject_input_consume_object(qiv, name); return true; } @@ -479,6 +500,7 @@ static bool qobject_input_type_uint64_keyval(Visitor *v, const char *name, full_name(qiv, name), "integer"); return false; } + qobject_input_consume_object(qiv, name); return true; } @@ -486,7 +508,7 @@ static bool qobject_input_type_bool(Visitor *v, const char *name, bool *obj, Error **errp) { QObjectInputVisitor *qiv = to_qiv(v); - QObject *qobj = qobject_input_get_object(qiv, name, true, errp); + QObject *qobj = qobject_input_get_object(qiv, name, errp); QBool *qbool; if (!qobj) { @@ -500,6 +522,7 @@ static bool qobject_input_type_bool(Visitor *v, const char *name, bool *obj, } *obj = qbool_get_bool(qbool); + qobject_input_consume_object(qiv, name); return true; } @@ -518,6 +541,7 @@ static bool qobject_input_type_bool_keyval(Visitor *v, const char *name, full_name(qiv, name), "'on' or 'off'"); return false; } + qobject_input_consume_object(qiv, name); return true; } @@ -525,7 +549,7 @@ static bool qobject_input_type_str(Visitor *v, const char *name, char **obj, Error **errp) { QObjectInputVisitor *qiv = to_qiv(v); - QObject *qobj = qobject_input_get_object(qiv, name, true, errp); + QObject *qobj = qobject_input_get_object(qiv, name, errp); QString *qstr; *obj = NULL; @@ -540,6 +564,7 @@ static bool qobject_input_type_str(Visitor *v, const char *name, char **obj, } *obj = g_strdup(qstring_get_str(qstr)); + qobject_input_consume_object(qiv, name); return true; } @@ -549,15 +574,20 @@ static bool qobject_input_type_str_keyval(Visitor *v, const char *name, QObjectInputVisitor *qiv = to_qiv(v); const char *str = qobject_input_get_keyval(qiv, name, errp); + if (!str) { + return false; + } + *obj = g_strdup(str); - return !!str; + qobject_input_consume_object(qiv, name); + return true; } static bool qobject_input_type_number(Visitor *v, const char *name, double *obj, Error **errp) { QObjectInputVisitor *qiv = to_qiv(v); - QObject *qobj = qobject_input_get_object(qiv, name, true, errp); + QObject *qobj = qobject_input_get_object(qiv, name, errp); QNum *qnum; if (!qobj) { @@ -571,6 +601,7 @@ static bool qobject_input_type_number(Visitor *v, const char *name, double *obj, } *obj = qnum_get_double(qnum); + qobject_input_consume_object(qiv, name); return true; } @@ -593,6 +624,7 @@ static bool qobject_input_type_number_keyval(Visitor *v, const char *name, } *obj = val; + qobject_input_consume_object(qiv, name); return true; } @@ -600,7 +632,7 @@ static bool qobject_input_type_any(Visitor *v, const char *name, QObject **obj, Error **errp) { QObjectInputVisitor *qiv = to_qiv(v); - QObject *qobj = qobject_input_get_object(qiv, name, true, errp); + QObject *qobj = qobject_input_get_object(qiv, name, errp); *obj = NULL; if (!qobj) { @@ -608,6 +640,7 @@ static bool qobject_input_type_any(Visitor *v, const char *name, QObject **obj, } *obj = qobject_ref(qobj); + qobject_input_consume_object(qiv, name); return true; } @@ -615,7 +648,7 @@ static bool qobject_input_type_null(Visitor *v, const char *name, QNull **obj, Error **errp) { QObjectInputVisitor *qiv = to_qiv(v); - QObject *qobj = qobject_input_get_object(qiv, name, true, errp); + QObject *qobj = qobject_input_get_object(qiv, name, errp); *obj = NULL; if (!qobj) { @@ -628,6 +661,7 @@ static bool qobject_input_type_null(Visitor *v, const char *name, return false; } *obj = qnull(); + qobject_input_consume_object(qiv, name); return true; } @@ -647,13 +681,14 @@ static bool qobject_input_type_size_keyval(Visitor *v, const char *name, full_name(qiv, name), "size"); return false; } + qobject_input_consume_object(qiv, name); return true; } static void qobject_input_optional(Visitor *v, const char *name, bool *present) { QObjectInputVisitor *qiv = to_qiv(v); - QObject *qobj = qobject_input_try_get_object(qiv, name, false); + QObject *qobj = qobject_input_try_get_object(qiv, name); if (!qobj) { *present = false; From patchwork Sat Feb 8 07:51:08 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Akihiko Odaki X-Patchwork-Id: 13966302 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 7560BC02198 for ; Sat, 8 Feb 2025 07:52:24 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tgfcm-0005zH-HZ; Sat, 08 Feb 2025 02:51:36 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tgfcl-0005yt-3H for qemu-devel@nongnu.org; Sat, 08 Feb 2025 02:51:35 -0500 Received: from mail-pl1-x631.google.com ([2607:f8b0:4864:20::631]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1tgfcj-0007Vu-FE for qemu-devel@nongnu.org; Sat, 08 Feb 2025 02:51:34 -0500 Received: by mail-pl1-x631.google.com with SMTP id d9443c01a7336-21c2f1b610dso70012605ad.0 for ; Fri, 07 Feb 2025 23:51:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=daynix-com.20230601.gappssmtp.com; s=20230601; t=1739001092; x=1739605892; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=xJPqyACVWuy+f95M2UxICBXYp3QYbJ6h2gyeOOlBE4s=; b=OfpFnJoeD5GsgGstYowUTLncEqupk25y3AEg+5oQ2KBdxdz8lyNl7YdSGe7EBS5TTk P0d7170HftmJR2ObooBkPL5BtjJo5jp2X1+iqX8CALyOxFzEFMGsquROgPOwfwB195L6 yajHWjKIJ5ApIqnSEZ5fFvJq5Pzak612kVK0To4k6PtxMOV1WqXhMohT/rd5z+8/ayxv k0riY5LjMu/dKAhcoyw4zhmm9k6i8CyGPwLrgRx7E9e8duAE74ZdSWKphtfkDfrPz/ma Ux6blGzUIv3k4hHogY5rGOqY99T5jUaaIMkwx7pO3QkhG9v4dmhlWNP5v98EKUQXrR+n gM2Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739001092; x=1739605892; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=xJPqyACVWuy+f95M2UxICBXYp3QYbJ6h2gyeOOlBE4s=; b=TGbM9BCdJ0ewk2sBz8mm2WiwC011QC7ZnBLeDiZoPVLoW+hKn3sG5j/KQGL3ZGr3Hu eS3DWLOVFo8XEy1iGqXgrdth3gCRMUImZ/4M3KsO0Hfo57NutwwJbK2NLYExftRQXoFB fiM2k4FDWPGdlfc0HxItRRhSwxW1RJ/OclfmOzwXmcYnagWvoqlhsSEKKsrecaFhfYCG G3Qn1ZEdNHrvHAnFN6gx6YZjtthdMNRUFGz/vIk8WebKs3fS4GTwHhDrrUI9B68ZaL/n gKhJsZdbFJltutkQgod55CrWeLrXiaUPqQuXTkz1Op4EWJ83hQnK3ABhE+em3nEL1LfX sG5Q== X-Gm-Message-State: AOJu0YwFhKoOD7iSXdY+exn4UlGqheY16I4+eIYpoGS4qWbSLFe+gOcw 9WcvuRHhZs0aVP0FwdPBJ67PJkmvurp991cd7A75tVAvjWv9mqUKW64fZKNYYb4= X-Gm-Gg: ASbGncvTObqLfsEmpB7Gj93tv6UB2qCHaIAGb9gQmOJG/ji5DYzVfjV5Ya7u69CMuu9 VMQCvTDTVDBQh4qrQqLSfsmCrj9vvdumn3V/McazL3aXlPzvsITRYTtkLlCKgVqCbWCQNVutdjK lOHV3IaMzhPuYHPdePUXq1yjIayoqEG/BdlDZtRZgaI5ajjCrD4IHUBREXsEkKu9Ok7N5vUfTnk T3114UeZYJsdMOxP+f+cL/BQq3Olt67sv9emcPP5hsRoez64VeH5dClNd0laBkNv8T7/IHSr09Y o+06FceGO63g76i4Rd8= X-Google-Smtp-Source: AGHT+IHlCnrLQEnc4bz1UYyArmKAbb0ibEPs/DkUUG+6WboIMattskGZZmvy/vF8M4qY43vnNeQENg== X-Received: by 2002:a05:6a21:458a:b0:1e1:3970:d75a with SMTP id adf61e73a8af0-1ee03a21d7fmr11713144637.9.1739001091923; Fri, 07 Feb 2025 23:51:31 -0800 (PST) Received: from localhost ([157.82.205.237]) by smtp.gmail.com with UTF8SMTPSA id d2e1a72fcca58-73048a9d063sm4156905b3a.34.2025.02.07.23.51.26 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 07 Feb 2025 23:51:31 -0800 (PST) From: Akihiko Odaki Date: Sat, 08 Feb 2025 16:51:08 +0900 Subject: [PATCH v5 2/4] qapi: Accept bool for OnOffAuto and OnOffSplit MIME-Version: 1.0 Message-Id: <20250208-virtio-v5-2-4376cb218c0f@daynix.com> References: <20250208-virtio-v5-0-4376cb218c0f@daynix.com> In-Reply-To: <20250208-virtio-v5-0-4376cb218c0f@daynix.com> To: Jason Wang , Dmitry Fleytman , Sriram Yagnaraman , "Michael S. Tsirkin" , Luigi Rizzo , Giuseppe Lettieri , Vincenzo Maffione , Andrew Melnychenko , Yuri Benditovich , Paolo Bonzini , =?utf-8?q?Daniel_P=2E_Berrang=C3=A9?= , Eduardo Habkost , Markus Armbruster , Michael Roth , Marcel Apfelbaum , =?utf-8?q?Philippe_Mathieu-?= =?utf-8?q?Daud=C3=A9?= , Yanan Wang , Zhao Liu , Lei Yang , BALATON Zoltan Cc: qemu-devel@nongnu.org, Akihiko Odaki X-Mailer: b4 0.14.2 Received-SPF: pass client-ip=2607:f8b0:4864:20::631; envelope-from=akihiko.odaki@daynix.com; helo=mail-pl1-x631.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=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: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org bool has representations of "on" and "off" different from OnOffAuto/OnOffSplit: - The command line syntax accepts on/yes/true/y and off/no/false/n for bool but only on and off for OnOffAuto. - JSON uses true/false for bool but "on" and "off" for OnOffAuto/OnOffSplit. This inconsistency causes some problems: - Users need to take the underlying type into consideration to determine what literal to specify, increasing cognitive loads for human users and complexity for programs invoking QEMU. - Converting an existing bool property to OnOffAuto/OnOffSplit will break compatibility. Fix these problems by accepting bool literals for OnOffAuto/OnOffSplit. This change is specific to OnOffAuto/OnOffSplit; types added in the future may be defined as an alternate of bool and enum to avoid the mentioned problems in the first place. Signed-off-by: Akihiko Odaki --- hw/core/qdev-properties.c | 17 ++++++++++++++++- scripts/qapi/visit.py | 24 ++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c index 434a76f5036edd2091a9c79525b8e102582637be..073902431213c5be47197cb0d993d60cc2562501 100644 --- a/hw/core/qdev-properties.c +++ b/hw/core/qdev-properties.c @@ -2,6 +2,7 @@ #include "hw/qdev-properties.h" #include "qapi/error.h" #include "qapi/qapi-types-misc.h" +#include "qapi/qapi-visit-common.h" #include "qapi/qmp/qlist.h" #include "qemu/ctype.h" #include "qemu/error-report.h" @@ -493,12 +494,26 @@ const PropertyInfo qdev_prop_string = { /* --- on/off/auto --- */ +static void set_on_off_auto(Object *obj, Visitor *v, const char *name, + void *opaque, Error **errp) +{ + Property *prop = opaque; + int *ptr = object_field_prop_ptr(obj, prop); + OnOffAuto value; + + if (!visit_type_OnOffAuto(v, name, &value, errp)) { + return; + } + + *ptr = value; +} + const PropertyInfo qdev_prop_on_off_auto = { .name = "OnOffAuto", .description = "on/off/auto", .enum_table = &OnOffAuto_lookup, .get = qdev_propinfo_get_enum, - .set = qdev_propinfo_set_enum, + .set = set_on_off_auto, .set_default_value = qdev_propinfo_set_default_value_enum, }; diff --git a/scripts/qapi/visit.py b/scripts/qapi/visit.py index 12f92e429f6bafc091f74af88c1b837d08c7f733..221373b165aa95bceb4eb50a557edf0e5b4c01f7 100644 --- a/scripts/qapi/visit.py +++ b/scripts/qapi/visit.py @@ -209,6 +209,29 @@ def gen_visit_list(name: str, element_type: QAPISchemaType) -> str: def gen_visit_enum(name: str) -> str: + if name in ('OnOffAuto', 'OnOffSplit'): + return mcgen(''' + +bool visit_type_%(c_name)s(Visitor *v, const char *name, + %(c_name)s *obj, Error **errp) +{ + bool b; + int i; + + if (v->type == VISITOR_INPUT && visit_type_bool(v, name, &b, NULL)) { + *obj = b ? %(on)s : %(off)s; + return true; + } + + b = visit_type_enum(v, name, &i, &%(c_name)s_lookup, errp); + *obj = i; + + return b; +} +''', + c_name=c_name(name), + on=c_enum_const(name, 'on'), off=c_enum_const(name, 'off')) + return mcgen(''' bool visit_type_%(c_name)s(Visitor *v, const char *name, @@ -359,6 +382,7 @@ def _begin_user_module(self, name: str) -> None: self._genc.preamble_add(mcgen(''' #include "qemu/osdep.h" #include "qapi/error.h" +#include "qapi/visitor-impl.h" #include "%(visit)s.h" ''', visit=visit)) From patchwork Sat Feb 8 07:51:09 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Akihiko Odaki X-Patchwork-Id: 13966299 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id CAE78C02198 for ; Sat, 8 Feb 2025 07:51:56 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tgfcu-00061C-38; Sat, 08 Feb 2025 02:51:44 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tgfcs-00060m-3v for qemu-devel@nongnu.org; Sat, 08 Feb 2025 02:51:42 -0500 Received: from mail-pj1-x1030.google.com ([2607:f8b0:4864:20::1030]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1tgfcq-0007aF-Fa for qemu-devel@nongnu.org; Sat, 08 Feb 2025 02:51:41 -0500 Received: by mail-pj1-x1030.google.com with SMTP id 98e67ed59e1d1-2fa0892f9bdso4052461a91.2 for ; Fri, 07 Feb 2025 23:51:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=daynix-com.20230601.gappssmtp.com; s=20230601; t=1739001099; x=1739605899; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=dj8ygh4vHQ3IWs88c977D3eMuGw5gxEkT1B9kT9ojBI=; b=gtZ3n+CiYGMIN4KZbLuRh3r7UG0WD5zkxoj1vp9r9cy6XanAcGJ89OeJR255VA7rZ4 9tSBPtga4auAa7KiqORpPVdPNOf2HDVdBVDESL8ohsy/euG2sxg8QrmgM88St9WkuOx2 J69DveGZ6SuR7b/cpRnqgjN+yOM+a3u5TrGAZpDeYcAUNNJGI4vE0vwNOplyjdELKzUq G5+JtiAxHVUn/KxrpNeQxqJz5w6hkJoch2N/KZRe9KQPifIlyHM9oBtK4Y9P4c19KqTX jrkTmmEptpHxfJKhgnSkJCsTUnIP95GSdLLNR30anMLuT5f4MrOsxKNmo0v1qdYiq13B 57vw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739001099; x=1739605899; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=dj8ygh4vHQ3IWs88c977D3eMuGw5gxEkT1B9kT9ojBI=; b=EdT56EzHdNRqrL354q1vujOerh8KLc166XC72JvoYJIQs9LXYvWQH8vmyl6088YQf1 Sc7g4A4vmIT+UdocjwfH/EqC665RYoTLxYoFn20AyGF2ewQor9bgFAt+EdDh4+wHl4Vd IYnwdSenTpA/b9i7BNfTVYN5oo2H+d3xLutwOjO390oueL78gSRof3KBRHfut7QT/6bI wR4P1VrGCaQBllX2P35rMuqauc4mvr63o/ta+cut/ZcJ97Iz3xWE7DYshhgkHf2jXta6 wDmEgivtMuS+xmB1Dy1tq7bwf4mR0FU+membp1Rdq1GQirIZ0h72cz14hh0WQvjwug8p Vwyg== X-Gm-Message-State: AOJu0YzpsYfYAweBU1AACBHLtAtSL9RKcr2R5s+jocrEauZPRUQG+Gvq CB+JPHGgX/vhzmU//V4WJa5ba4A0m5gdB6FotgEmd5tkp/3BWnYBxWmOFbZZP34= X-Gm-Gg: ASbGncu5gz46J/9fraRQrVRT5VALYeAxiGgPTcpHznlsRroCLzeQmCd9CmqJSzvk8nh 0z0qdmodlliHAiTVcAQzr/sZNN2OpGoNsVkXRWPnmSQljIgcN5eWb9ZI9xgjm92Va21EOuWnToe CJHH4pTF2MgDXO9RQp9UT2zP7Ldgm8KuIVxTWQV3hN0Hv2xZqDPRm6ayUhxZzbIQ7vsTJpyntpG 6DPUVzZcdowpxnkK7aDD6DL4vYfaaPI4sZ6wyRfpOGZ7Ee79Xvisc/mgP7Q1J//I8tQHUlFEaVd g4rJFAUyudK+Y52GFzc= X-Google-Smtp-Source: AGHT+IE7Ra8iD8s/TG01A3EUYSnmLXr3jSrTlD8vtUslNB34/1ASIXeBwDVb8Nr6wYW4ztks1InN/w== X-Received: by 2002:a05:6a00:9286:b0:725:322a:9438 with SMTP id d2e1a72fcca58-7305d4135bemr9005357b3a.1.1739001099211; Fri, 07 Feb 2025 23:51:39 -0800 (PST) Received: from localhost ([157.82.205.237]) by smtp.gmail.com with UTF8SMTPSA id d2e1a72fcca58-7307bfc03efsm188745b3a.160.2025.02.07.23.51.33 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 07 Feb 2025 23:51:38 -0800 (PST) From: Akihiko Odaki Date: Sat, 08 Feb 2025 16:51:09 +0900 Subject: [PATCH v5 3/4] qdev-properties: Add DEFINE_PROP_ON_OFF_AUTO_BIT64() MIME-Version: 1.0 Message-Id: <20250208-virtio-v5-3-4376cb218c0f@daynix.com> References: <20250208-virtio-v5-0-4376cb218c0f@daynix.com> In-Reply-To: <20250208-virtio-v5-0-4376cb218c0f@daynix.com> To: Jason Wang , Dmitry Fleytman , Sriram Yagnaraman , "Michael S. Tsirkin" , Luigi Rizzo , Giuseppe Lettieri , Vincenzo Maffione , Andrew Melnychenko , Yuri Benditovich , Paolo Bonzini , =?utf-8?q?Daniel_P=2E_Berrang=C3=A9?= , Eduardo Habkost , Markus Armbruster , Michael Roth , Marcel Apfelbaum , =?utf-8?q?Philippe_Mathieu-?= =?utf-8?q?Daud=C3=A9?= , Yanan Wang , Zhao Liu , Lei Yang , BALATON Zoltan Cc: qemu-devel@nongnu.org, Akihiko Odaki X-Mailer: b4 0.14.2 Received-SPF: pass client-ip=2607:f8b0:4864:20::1030; envelope-from=akihiko.odaki@daynix.com; helo=mail-pj1-x1030.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=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: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org DEFINE_PROP_ON_OFF_AUTO_BIT64() corresponds to DEFINE_PROP_ON_OFF_AUTO() as DEFINE_PROP_BIT64() corresponds to DEFINE_PROP_BOOL(). The difference is that DEFINE_PROP_ON_OFF_AUTO_BIT64() exposes OnOffAuto instead of bool. Signed-off-by: Akihiko Odaki --- include/hw/qdev-properties.h | 18 ++++++++++++ hw/core/qdev-properties.c | 66 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 83 insertions(+), 1 deletion(-) diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h index bf27375a3ccdb238ef3327dd85d3d0a1431cbfbf..0d161325e8dc92d0e0e5aa9a1e2dd734f7a55cae 100644 --- a/include/hw/qdev-properties.h +++ b/include/hw/qdev-properties.h @@ -43,11 +43,22 @@ struct PropertyInfo { ObjectPropertyRelease *release; }; +/** + * struct OnOffAutoBit64 - OnOffAuto storage with 64 elements. + * @on_bits: Bitmap of elements with "on". + * @auto_bits: Bitmap of elements with "auto". + */ +typedef struct OnOffAutoBit64 { + uint64_t on_bits; + uint64_t auto_bits; +} OnOffAutoBit64; + /*** qdev-properties.c ***/ extern const PropertyInfo qdev_prop_bit; extern const PropertyInfo qdev_prop_bit64; +extern const PropertyInfo qdev_prop_on_off_auto_bit64; extern const PropertyInfo qdev_prop_bool; extern const PropertyInfo qdev_prop_enum; extern const PropertyInfo qdev_prop_uint8; @@ -100,6 +111,13 @@ extern const PropertyInfo qdev_prop_link; .set_default = true, \ .defval.u = (bool)_defval) +#define DEFINE_PROP_ON_OFF_AUTO_BIT64(_name, _state, _field, _bit, _defval) \ + DEFINE_PROP(_name, _state, _field, qdev_prop_on_off_auto_bit64, \ + OnOffAutoBit64, \ + .bitnr = (_bit), \ + .set_default = true, \ + .defval.i = (OnOffAuto)_defval) + #define DEFINE_PROP_BOOL(_name, _state, _field, _defval) \ DEFINE_PROP(_name, _state, _field, qdev_prop_bool, bool, \ .set_default = true, \ diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c index 073902431213c5be47197cb0d993d60cc2562501..cfab7b97091ad704b7f43d6ba6fcd8937ca5dfe3 100644 --- a/hw/core/qdev-properties.c +++ b/hw/core/qdev-properties.c @@ -188,7 +188,8 @@ const PropertyInfo qdev_prop_bit = { static uint64_t qdev_get_prop_mask64(const Property *prop) { - assert(prop->info == &qdev_prop_bit64); + assert(prop->info == &qdev_prop_bit64 || + prop->info == &qdev_prop_on_off_auto_bit64); return 0x1ull << prop->bitnr; } @@ -233,6 +234,69 @@ const PropertyInfo qdev_prop_bit64 = { .set_default_value = set_default_value_bool, }; +static void prop_get_on_off_auto_bit64(Object *obj, Visitor *v, + const char *name, void *opaque, + Error **errp) +{ + Property *prop = opaque; + OnOffAutoBit64 *p = object_field_prop_ptr(obj, prop); + OnOffAuto value; + uint64_t mask = qdev_get_prop_mask64(prop); + + if (p->auto_bits & mask) { + value = ON_OFF_AUTO_AUTO; + } else if (p->on_bits & mask) { + value = ON_OFF_AUTO_ON; + } else { + value = ON_OFF_AUTO_OFF; + } + + visit_type_OnOffAuto(v, name, &value, errp); +} + +static void prop_set_on_off_auto_bit64(Object *obj, Visitor *v, + const char *name, void *opaque, + Error **errp) +{ + Property *prop = opaque; + OnOffAutoBit64 *p = object_field_prop_ptr(obj, prop); + OnOffAuto value; + uint64_t mask = qdev_get_prop_mask64(prop); + + if (!visit_type_OnOffAuto(v, name, &value, errp)) { + return; + } + + switch (value) { + case ON_OFF_AUTO_AUTO: + p->on_bits &= ~mask; + p->auto_bits |= mask; + break; + + case ON_OFF_AUTO_ON: + p->on_bits |= mask; + p->auto_bits &= ~mask; + break; + + case ON_OFF_AUTO_OFF: + p->on_bits &= ~mask; + p->auto_bits &= ~mask; + break; + + case ON_OFF_AUTO__MAX: + g_assert_not_reached(); + } +} + +const PropertyInfo qdev_prop_on_off_auto_bit64 = { + .name = "OnOffAuto", + .description = "on/off/auto", + .enum_table = &OnOffAuto_lookup, + .get = prop_get_on_off_auto_bit64, + .set = prop_set_on_off_auto_bit64, + .set_default_value = qdev_propinfo_set_default_value_enum, +}; + /* --- bool --- */ static void get_bool(Object *obj, Visitor *v, const char *name, void *opaque, From patchwork Sat Feb 8 07:51:10 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Akihiko Odaki X-Patchwork-Id: 13966301 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 39001C02198 for ; Sat, 8 Feb 2025 07:52:13 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tgfd1-00064m-Gu; Sat, 08 Feb 2025 02:51:51 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tgfd0-00063B-B9 for qemu-devel@nongnu.org; Sat, 08 Feb 2025 02:51:50 -0500 Received: from mail-pl1-x631.google.com ([2607:f8b0:4864:20::631]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1tgfcy-0007uv-Hs for qemu-devel@nongnu.org; Sat, 08 Feb 2025 02:51:50 -0500 Received: by mail-pl1-x631.google.com with SMTP id d9443c01a7336-21f55fbb72bso24317075ad.2 for ; Fri, 07 Feb 2025 23:51:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=daynix-com.20230601.gappssmtp.com; s=20230601; t=1739001107; x=1739605907; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=YXil5SQirdez18zIelkFLKwbjlIjiAsP2lun4WfVXEo=; b=T7nNQvJdOHPMXiaBZP+x64QqOidtQPQbpxo1CtbjDRTb+GJjPMVwICOCVxGQju8fYI hx0jmoz6um/i0hhPi8VXw/ynFIlJHkxHd3jz2yU/26sl9UirYGdM0+mTgolDcc/afji/ 9DSEr5aPmYGvYYxtlfnTH0kKPICwgtYXRybgi2yTdRdP6eWyD3vQq9uM+IXY0hGIDNWn vTWLoRK2/iLR1tLn1s8TnvOYKd0Bd2wuSvxf9FeI7I60WNjiQu2zbov130z0gbeOSfke 7sWTFdh4AHfjWK3ENBnzZKak4GRktM6miGfrzpT4bAj6Z95NDq3uTMrpBEhHnQJHqNds WX4g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739001107; x=1739605907; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=YXil5SQirdez18zIelkFLKwbjlIjiAsP2lun4WfVXEo=; b=YK5qyVqmvp5PMArfx/Nwev97YfnlCa95vOf1EXBEeAAWgcW7IjyjUB1u5XcvLCuEbc Q6Y4RD03tiddjDIF1XBxII/MzvBOTAD/sFhwLIUPJGgaCdrXSaaDbkT4XmkbwrLSMnPH hU8cdcwI1VR0sHoY77kWhkdTf0hxp6omRvOn32IhMk/ZtX6LNyYbCQLb3SpiD21yE81f n7z8ptaWeGY2Wm5BVs2mkno7axvPKQ6TR0xsLvxPjyu6bNvn7NZ9sqD0z23jWReY2I21 5H5I/+tWtN7LCpNWTnv92tawHzhM1WLHRFRULwAHfTUVENe8qsgh8IWzMCv/mMNnjAGu K0VQ== X-Gm-Message-State: AOJu0YwiaiQFZFcgjwGKX+eyzcHf8L3eeklkjl8jlp+N75U/qaSDx712 C0YSi3qZ+WoO8uXmNapDrRvmYfnyALjwujXAEX6puVnI5knmKor1FT0bUqtVz5E= X-Gm-Gg: ASbGncvXBvlj00l+XsM1qU/ACHxfDKSTVonltMVeckM4TUHu8xHUeaHuNrs/c/ZdKIU f3kXt3CoitEKAMm4SYpneYhKaoHEYq00Gkkye/HAmNrEpSuvBUpErDhYxKLj/2Sq67YbnaJlLsk mDV47r9Cgwrw2iKRe/4ADPr6z63ANups5Zb4VELGmeLJxQrZsJUrWGiC0sccdYyUl/qKVM4yE6G NNpyaboLOIqSQwSGMqAevcCvplb493YKd8cEMcGr9xEQmtqibzexShBuo38Q/dZyHvJvrLxtMml 4eHeGPKFW+fxNhIiClk= X-Google-Smtp-Source: AGHT+IG6aO+F2kUAB7v/qlYFWjtJxEBvCfWlRl0qN4dIAVV7ahzVPyVC+yNPyY0V7yFFZkblIm5NpQ== X-Received: by 2002:a17:903:90e:b0:21f:3e2d:7d42 with SMTP id d9443c01a7336-21f4e6d2658mr92822125ad.23.1739001107245; Fri, 07 Feb 2025 23:51:47 -0800 (PST) Received: from localhost ([157.82.205.237]) by smtp.gmail.com with UTF8SMTPSA id d9443c01a7336-21f3687c7b6sm41882355ad.196.2025.02.07.23.51.41 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 07 Feb 2025 23:51:46 -0800 (PST) From: Akihiko Odaki Date: Sat, 08 Feb 2025 16:51:10 +0900 Subject: [PATCH v5 4/4] virtio: Convert feature properties to OnOffAuto MIME-Version: 1.0 Message-Id: <20250208-virtio-v5-4-4376cb218c0f@daynix.com> References: <20250208-virtio-v5-0-4376cb218c0f@daynix.com> In-Reply-To: <20250208-virtio-v5-0-4376cb218c0f@daynix.com> To: Jason Wang , Dmitry Fleytman , Sriram Yagnaraman , "Michael S. Tsirkin" , Luigi Rizzo , Giuseppe Lettieri , Vincenzo Maffione , Andrew Melnychenko , Yuri Benditovich , Paolo Bonzini , =?utf-8?q?Daniel_P=2E_Berrang=C3=A9?= , Eduardo Habkost , Markus Armbruster , Michael Roth , Marcel Apfelbaum , =?utf-8?q?Philippe_Mathieu-?= =?utf-8?q?Daud=C3=A9?= , Yanan Wang , Zhao Liu , Lei Yang , BALATON Zoltan Cc: qemu-devel@nongnu.org, Akihiko Odaki X-Mailer: b4 0.14.2 Received-SPF: pass client-ip=2607:f8b0:4864:20::631; envelope-from=akihiko.odaki@daynix.com; helo=mail-pl1-x631.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=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: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Some features are not always available with vhost. Legacy features are not available with vp_vdpa in particular. virtio devices used to disable them when not available even if the corresponding properties were explicitly set to "on". QEMU already has OnOffAuto type, which includes the "auto" value to let it automatically decide the effective value. Convert feature properties to OnOffAuto and set them "auto" by default to utilize it. This allows QEMU to report an error if they are set "on" and the corresponding features are not available. Signed-off-by: Akihiko Odaki --- include/hw/virtio/virtio.h | 38 +++++++++++++++++++++----------------- hw/core/machine.c | 1 + hw/virtio/virtio-bus.c | 14 ++++++++++++-- hw/virtio/virtio.c | 4 +++- 4 files changed, 37 insertions(+), 20 deletions(-) diff --git a/include/hw/virtio/virtio.h b/include/hw/virtio/virtio.h index 638691028050d2599592d8c7e95c75ac3913fbdd..b854c2cb1d04da0a35165289c28f87e8cb869df6 100644 --- a/include/hw/virtio/virtio.h +++ b/include/hw/virtio/virtio.h @@ -113,7 +113,8 @@ struct VirtIODevice uint16_t queue_sel; /** * These fields represent a set of VirtIO features at various - * levels of the stack. @host_features indicates the complete + * levels of the stack. @requested_features indicates the feature + * set the user requested. @host_features indicates the complete * feature set the VirtIO device can offer to the driver. * @guest_features indicates which features the VirtIO driver has * selected by writing to the feature register. Finally @@ -121,6 +122,7 @@ struct VirtIODevice * backend (e.g. vhost) and could potentially be a subset of the * total feature set offered by QEMU. */ + OnOffAutoBit64 requested_features; uint64_t host_features; uint64_t guest_features; uint64_t backend_features; @@ -149,6 +151,7 @@ struct VirtIODevice bool started; bool start_on_kick; /* when virtio 1.0 feature has not been negotiated */ bool disable_legacy_check; + bool force_features_auto; bool vhost_started; VMChangeStateEntry *vmstate; char *bus_name; @@ -376,22 +379,23 @@ typedef struct VirtIOSCSIConf VirtIOSCSIConf; typedef struct VirtIORNGConf VirtIORNGConf; #define DEFINE_VIRTIO_COMMON_FEATURES(_state, _field) \ - DEFINE_PROP_BIT64("indirect_desc", _state, _field, \ - VIRTIO_RING_F_INDIRECT_DESC, true), \ - DEFINE_PROP_BIT64("event_idx", _state, _field, \ - VIRTIO_RING_F_EVENT_IDX, true), \ - DEFINE_PROP_BIT64("notify_on_empty", _state, _field, \ - VIRTIO_F_NOTIFY_ON_EMPTY, true), \ - DEFINE_PROP_BIT64("any_layout", _state, _field, \ - VIRTIO_F_ANY_LAYOUT, true), \ - DEFINE_PROP_BIT64("iommu_platform", _state, _field, \ - VIRTIO_F_IOMMU_PLATFORM, false), \ - DEFINE_PROP_BIT64("packed", _state, _field, \ - VIRTIO_F_RING_PACKED, false), \ - DEFINE_PROP_BIT64("queue_reset", _state, _field, \ - VIRTIO_F_RING_RESET, true), \ - DEFINE_PROP_BIT64("in_order", _state, _field, \ - VIRTIO_F_IN_ORDER, false) + DEFINE_PROP_ON_OFF_AUTO_BIT64("indirect_desc", _state, _field, \ + VIRTIO_RING_F_INDIRECT_DESC, \ + ON_OFF_AUTO_AUTO), \ + DEFINE_PROP_ON_OFF_AUTO_BIT64("event_idx", _state, _field, \ + VIRTIO_RING_F_EVENT_IDX, ON_OFF_AUTO_AUTO), \ + DEFINE_PROP_ON_OFF_AUTO_BIT64("notify_on_empty", _state, _field, \ + VIRTIO_F_NOTIFY_ON_EMPTY, ON_OFF_AUTO_AUTO), \ + DEFINE_PROP_ON_OFF_AUTO_BIT64("any_layout", _state, _field, \ + VIRTIO_F_ANY_LAYOUT, ON_OFF_AUTO_AUTO), \ + DEFINE_PROP_ON_OFF_AUTO_BIT64("iommu_platform", _state, _field, \ + VIRTIO_F_IOMMU_PLATFORM, ON_OFF_AUTO_OFF), \ + DEFINE_PROP_ON_OFF_AUTO_BIT64("packed", _state, _field, \ + VIRTIO_F_RING_PACKED, ON_OFF_AUTO_OFF), \ + DEFINE_PROP_ON_OFF_AUTO_BIT64("queue_reset", _state, _field, \ + VIRTIO_F_RING_RESET, ON_OFF_AUTO_AUTO), \ + DEFINE_PROP_ON_OFF_AUTO_BIT64("in_order", _state, _field, \ + VIRTIO_F_IN_ORDER, ON_OFF_AUTO_OFF) hwaddr virtio_queue_get_desc_addr(VirtIODevice *vdev, int n); bool virtio_queue_enabled_legacy(VirtIODevice *vdev, int n); diff --git a/hw/core/machine.c b/hw/core/machine.c index c23b39949649054ac59d2a9b497f34e1b7bd8d6c..0de04baa61735ff02f797f778c626ef690625ce3 100644 --- a/hw/core/machine.c +++ b/hw/core/machine.c @@ -38,6 +38,7 @@ GlobalProperty hw_compat_9_2[] = { {"arm-cpu", "backcompat-pauth-default-use-qarma5", "true"}, + { TYPE_VIRTIO_DEVICE, "x-force-features-auto", "on" }, }; const size_t hw_compat_9_2_len = G_N_ELEMENTS(hw_compat_9_2); diff --git a/hw/virtio/virtio-bus.c b/hw/virtio/virtio-bus.c index 896feb37a1caa805543e971c150d3673675b9a6b..75d433b252d5337d91616a2847b3dc12e811c2da 100644 --- a/hw/virtio/virtio-bus.c +++ b/hw/virtio/virtio-bus.c @@ -50,6 +50,7 @@ void virtio_bus_device_plugged(VirtIODevice *vdev, Error **errp) bool has_iommu = virtio_host_has_feature(vdev, VIRTIO_F_IOMMU_PLATFORM); bool vdev_has_iommu; Error *local_err = NULL; + uint64_t features; DPRINTF("%s: plug device.\n", qbus->name); @@ -63,13 +64,22 @@ void virtio_bus_device_plugged(VirtIODevice *vdev, Error **errp) /* Get the features of the plugged device. */ assert(vdc->get_features != NULL); - vdev->host_features = vdc->get_features(vdev, vdev->host_features, - &local_err); + features = vdev->host_features | vdev->requested_features.auto_bits | + vdev->requested_features.on_bits; + features = vdc->get_features(vdev, features, &local_err); if (local_err) { error_propagate(errp, local_err); return; } + if (!vdev->force_features_auto && + (features & vdev->requested_features.on_bits) != vdev->requested_features.on_bits) { + error_setg(errp, "A requested feature is not supported by the device"); + return; + } + + vdev->host_features = features; + if (klass->device_plugged != NULL) { klass->device_plugged(qbus->parent, &local_err); } diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c index 85110bce37443bb46c4159761af112d0dba466b4..83f803fc703da6257608e21476305c8e9c6a8b07 100644 --- a/hw/virtio/virtio.c +++ b/hw/virtio/virtio.c @@ -4013,11 +4013,13 @@ static void virtio_device_instance_finalize(Object *obj) } static const Property virtio_properties[] = { - DEFINE_VIRTIO_COMMON_FEATURES(VirtIODevice, host_features), + DEFINE_VIRTIO_COMMON_FEATURES(VirtIODevice, requested_features), DEFINE_PROP_BOOL("use-started", VirtIODevice, use_started, true), DEFINE_PROP_BOOL("use-disabled-flag", VirtIODevice, use_disabled_flag, true), DEFINE_PROP_BOOL("x-disable-legacy-check", VirtIODevice, disable_legacy_check, false), + DEFINE_PROP_BOOL("x-force-features-auto", VirtIODevice, + force_features_auto, false), }; static int virtio_device_start_ioeventfd_impl(VirtIODevice *vdev)