From nobody Fri Dec 12 15:14:54 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1761827617; cv=none; d=zohomail.com; s=zohoarc; b=BtfZntpFamnQPi+RMboRoHWLbbWnoo/x2LjZB3PC/flBuSXYWpdzbSKuZdrhaNBhrmfkKeHqEEGza0kUFrpVQTnKGpDMLxZuMekDPFloklSkwvSiCsp+2qDBO2WEUoGenKevtATxNdstPwfgGm1+U+oA1QrU07ecgROfNPTOO/4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1761827617; h=Content-Type:Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id:Cc; bh=mhyaPDXs8PvQNjxdWWXL3e9tl2ZoC8MpzDWyUc4mNHk=; b=XoHtiZCiDd/u0IOmjYNK7TYF+BqpYo+u5csaJDW9n33/JKZ+aJYJzdG++gJf3QHB0+oHnNQ2OJ5iApC472YiCnsGLGjfmggm/s4VOIGLBp18m6OkrfuZvjt286NYEkzGznGs4nCOmWRYqOdEHQel/sTtBjl2+jYZKT/qyYTkYag= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1761827617390464.4963266935199; Thu, 30 Oct 2025 05:33:37 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id BF58841ABB; Thu, 30 Oct 2025 08:33:36 -0400 (EDT) Received: from [172.19.199.29] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id 3784643ED1; Thu, 30 Oct 2025 08:28:04 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 8D54241C75; Thu, 30 Oct 2025 08:27:41 -0400 (EDT) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 467E641B28 for ; Thu, 30 Oct 2025 08:27:29 -0400 (EDT) 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-518-0bGR7_q7P6qwXf8D5AyreQ-1; Thu, 30 Oct 2025 08:27:27 -0400 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (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 DFB4219560A5 for ; Thu, 30 Oct 2025 12:27:26 +0000 (UTC) Received: from orkuz (unknown [10.43.3.115]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 6C5CE1954128 for ; Thu, 30 Oct 2025 12:27:26 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-5.0 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_PASS autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1761827248; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=mhyaPDXs8PvQNjxdWWXL3e9tl2ZoC8MpzDWyUc4mNHk=; b=K5cHMzUyQQHZzVTVO0Q1lhhA+Gdj5eAWAUQ/GBTAgak+F0UoqY/nCRYOmkjhLeT1tWGZr8 NKu/6YJCvOWdqN2RL8OYucKXbAH5mS9OKiNAL4PCRHiyVkgnbgzePF3tIMbtwJIHcxbn1p 6KZesj+/pfFp5CYidbNGOQ69nhlo8DY= X-MC-Unique: 0bGR7_q7P6qwXf8D5AyreQ-1 X-Mimecast-MFC-AGG-ID: 0bGR7_q7P6qwXf8D5AyreQ_1761827247 To: devel@lists.libvirt.org Subject: [PATCH 5/6] qemu_monitor: Filter CPU features reported by QEMU Date: Thu, 30 Oct 2025 13:27:13 +0100 Message-ID: In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: o2y3ckCRzfcJ1fmdz2zSQf6rrYhJm158t13RLICbWU4_1761827247 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: 7ZBGZHFXVTZH233VBGG67AAHS22ZSTXR X-Message-ID-Hash: 7ZBGZHFXVTZH233VBGG67AAHS22ZSTXR X-MailFrom: jdenemar@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Jiri Denemark via Devel Reply-To: Jiri Denemark X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1761827619624154100 Content-Type: text/plain; charset="utf-8" From: Jiri Denemark Some features may be on our ignore list because they do nothing even though QEMU still supports them and reports their state. But as the features do nothing, the state reported by QEMU may not correspond to what the guest sees. To avoid possible confusion we may just pretend QEMU did not report any of the features on our ignore list. Signed-off-by: Jiri Denemark Reviewed-by: J=C3=A1n Tomko --- src/qemu/qemu_monitor.c | 6 ++++-- src/qemu/qemu_monitor.h | 1 + src/qemu/qemu_monitor_json.c | 16 ++++++++++++---- src/qemu/qemu_monitor_json.h | 1 + src/qemu/qemu_process.c | 1 + tests/qemumonitorjsontest.c | 1 + 6 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index f9b320f765..3dbaaf9c59 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -3686,7 +3686,8 @@ qemuMonitorSetDomainLog(qemuMonitor *mon, * a single qom-list-get QMP command * @cpuQOMPath: QOM path of a CPU to probe * @translate: callback for translating CPU feature names from QEMU to lib= virt - * @opaque: data for @translate callback + * @filter: callback for filtering ignored features, a pointer to @arch is + * passed as opaque pointer to the callback * @enabled: returns the CPU data for all enabled features * @disabled: returns the CPU data for features which we asked for * (either explicitly or via a named CPU model) but QEMU disabled them @@ -3701,6 +3702,7 @@ qemuMonitorGetGuestCPU(qemuMonitor *mon, bool qomListGet, const char *cpuQOMPath, qemuMonitorCPUFeatureTranslationCallback translate, + virCPUDefFeatureFilter filter, virCPUData **enabled, virCPUData **disabled) { @@ -3715,7 +3717,7 @@ qemuMonitorGetGuestCPU(qemuMonitor *mon, *disabled =3D NULL; =20 return qemuMonitorJSONGetGuestCPU(mon, arch, qomListGet, cpuQOMPath, - translate, enabled, disabled); + translate, filter, enabled, disabled= ); } =20 =20 diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index f611ebfa24..d950d548b4 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -1495,6 +1495,7 @@ qemuMonitorGetGuestCPU(qemuMonitor *mon, bool qomListGet, const char *cpuQOMPath, qemuMonitorCPUFeatureTranslationCallback translate, + virCPUDefFeatureFilter filter, virCPUData **enabled, virCPUData **disabled); =20 diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index c121c05ffd..9b9a005771 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -6795,7 +6795,8 @@ qemuMonitorJSONGetCPUProperties(qemuMonitor *mon, static int qemuMonitorJSONCPUDataAddFeatures(virCPUData *data, GStrv props, - qemuMonitorCPUFeatureTranslationCallback= translate) + qemuMonitorCPUFeatureTranslationCallback= translate, + virCPUDefFeatureFilter filter) { char **p; =20 @@ -6805,6 +6806,9 @@ qemuMonitorJSONCPUDataAddFeatures(virCPUData *data, if (translate) name =3D translate(data->arch, name); =20 + if (filter && !filter(name, VIR_CPU_FEATURE_REQUIRE, &data->arch)) + continue; + if (virCPUDataAddFeature(data, name) < 0) return -1; } @@ -6821,7 +6825,8 @@ qemuMonitorJSONCPUDataAddFeatures(virCPUData *data, * a single qom-list-get QMP command * @cpuQOMPath: QOM path of a CPU to probe * @translate: callback for translating CPU feature names from QEMU to lib= virt - * @opaque: data for @translate callback + * @filter: callback for filtering ignored features, a pointer to @arch is + * passed as opaque pointer to the callback * @enabled: returns the CPU data for all enabled features * @disabled: returns the CPU data for features which we asked for * (either explicitly or via a named CPU model) but QEMU disabled them @@ -6836,6 +6841,7 @@ qemuMonitorJSONGetGuestCPU(qemuMonitor *mon, bool qomListGet, const char *cpuQOMPath, qemuMonitorCPUFeatureTranslationCallback transl= ate, + virCPUDefFeatureFilter filter, virCPUData **enabled, virCPUData **disabled) { @@ -6852,8 +6858,10 @@ qemuMonitorJSONGetGuestCPU(qemuMonitor *mon, &propsEnabled, &propsDisabled) < 0) return -1; =20 - if (qemuMonitorJSONCPUDataAddFeatures(cpuEnabled, propsEnabled, transl= ate) < 0 || - qemuMonitorJSONCPUDataAddFeatures(cpuDisabled, propsDisabled, tran= slate) < 0) + if (qemuMonitorJSONCPUDataAddFeatures(cpuEnabled, propsEnabled, + translate, filter) < 0 || + qemuMonitorJSONCPUDataAddFeatures(cpuDisabled, propsDisabled, + translate, filter) < 0) return -1; =20 *enabled =3D g_steal_pointer(&cpuEnabled); diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h index 8b06b7599e..f20830532d 100644 --- a/src/qemu/qemu_monitor_json.h +++ b/src/qemu/qemu_monitor_json.h @@ -558,6 +558,7 @@ qemuMonitorJSONGetGuestCPU(qemuMonitor *mon, bool qomListGet, const char *cpuQOMPath, qemuMonitorCPUFeatureTranslationCallback transl= ate, + virCPUDefFeatureFilter filter, virCPUData **enabled, virCPUData **disabled); =20 diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index d93ea4058d..45fc32a663 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -4595,6 +4595,7 @@ qemuProcessFetchGuestCPU(virDomainObj *vm, virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_Q= OM_LIST_GET), cpuQOMPath, virQEMUCapsCPUFeatureFromQEMU, + virQEMUCapsCPUFilterFeatures, &dataEnabled, &dataDisabled); =20 qemuDomainObjExitMonitor(vm); diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c index 6129dde449..bfe81739a7 100644 --- a/tests/qemumonitorjsontest.c +++ b/tests/qemumonitorjsontest.c @@ -2809,6 +2809,7 @@ testQemuMonitorJSONGetGuestCPU(const void *opaque) data->qomListGet, "/machine/unattached/device[0]", virQEMUCapsCPUFeatureFromQEMU, + virQEMUCapsCPUFilterFeatures, &dataEnabled, &dataDisabled) < 0) return -1; =20 --=20 2.51.0