From nobody Sun Oct 5 01:49:59 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=1758826222; cv=none; d=zohomail.com; s=zohoarc; b=oFdK+MLNywfYtePXRV4jkGrXpjFdYRxxhOEnh3TDhgvAMaVgKTaTpIrD7Vh1sh0425mR6nWrfnaOQp3eO8BVYlXQCmp1sNNDViqQup+el1ro+++xTvimHCs6VS52NTtv4ifgzCQ9FKbK7WMyuATrVP9K/cDnJ7pabieei44Updo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1758826222; 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=7D+QAsnLlI1YLNdHYOnilt9Dn6CrB9FAQuoACmu5SnM=; b=li0eTPxuP5c1Ni9PlGAzadyfFEjICnu9WXjTU4xDoD3IHZCWqTd91CVORG95fff9du1iDGMEnuWLySl/dbVnslbzRKtqyHvLdhaAeU0Pg9or3rh55I20Zh1Vv7IehIR3AeGhMOV95P9Wtci2s2NMWHjIIHkGozeJW2x9oUd+CQQ= 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 1758826222976160.22115896693697; Thu, 25 Sep 2025 11:50:22 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 009C343F85; Thu, 25 Sep 2025 14:50:21 -0400 (EDT) Received: from [172.19.199.14] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id 1D6B9445EC; Thu, 25 Sep 2025 14:16:02 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id B846144087; Thu, 25 Sep 2025 14:12:44 -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 5349341B8D for ; Thu, 25 Sep 2025 14:07:53 -0400 (EDT) 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-316-d0iDtxoeORCqS_vBZ-h7hQ-1; Thu, 25 Sep 2025 14:07:51 -0400 Received: from mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.4]) (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 87F3F180047F for ; Thu, 25 Sep 2025 18:07:50 +0000 (UTC) Received: from harajuku.usersys.redhat.com.homenet.telecomitalia.it (unknown [10.45.225.196]) by mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id B46E4300021A for ; Thu, 25 Sep 2025 18:07:49 +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=-3.1 required=5.0 tests=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=1758823673; 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=7D+QAsnLlI1YLNdHYOnilt9Dn6CrB9FAQuoACmu5SnM=; b=dLGl0k18z+i/oeAEzd2it6jbEor3u03E6aKflbhmh3mo2q6QWJshGfV/7ZlrdNmwaqit7N mBQfOxwwhouQ/PNWuePWBvT+Q4CT0aJSX2lVvt7B3TzgJ+7P2SJWEFvnzHsiRPyS/Zvih6 Kr4ZMHDZ6XVrp0PIrtqazZnzFHszuyU= X-MC-Unique: d0iDtxoeORCqS_vBZ-h7hQ-1 X-Mimecast-MFC-AGG-ID: d0iDtxoeORCqS_vBZ-h7hQ_1758823670 To: devel@lists.libvirt.org Subject: [PATCH v2 16/38] qemu: Prevent use of PCI devices when PCI is not supported Date: Thu, 25 Sep 2025 20:07:02 +0200 Message-ID: <20250925180724.500758-17-abologna@redhat.com> In-Reply-To: <20250925180724.500758-1-abologna@redhat.com> References: <20250925180724.500758-1-abologna@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.4 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: IPzIT1zrWhnkJzzR7plB6mDyZ-9x5gybt4HGibMfM_U_1758823670 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: JFXD3JO7NJ4UO7G3FY5A7I7VKZUYTMMR X-Message-ID-Hash: JFXD3JO7NJ4UO7G3FY5A7I7VKZUYTMMR X-MailFrom: abologna@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: Andrea Bolognani via Devel Reply-To: Andrea Bolognani X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1758826223633116600 Content-Type: text/plain; charset="utf-8"; x-default="true" At the moment, we check whether the machine type supports PCI before attempting to allocate PCI addresses, and if it does not, we simply skip the step entirely. This means that an attempt to use a PCI device with a machine type that has no PCI support won't be rejected by libvirt, and only once the QEMU process is started the problem will be made apparent. Validate things ahead of time instead, rejecting any such configurations. Note that we only do this for new domains, because otherwise existing domains that are configured incorrectly would disappear and we generally try really hard to avoid that. A few tests start failing after this change, demonstrating that things are now working as desired. Signed-off-by: Andrea Bolognani Reviewed-by: Michal Privoznik Reviewed-by: Peter Krempa --- src/qemu/qemu_domain_address.c | 18 ++++++++--- ...default-fallback-nousb.aarch64-latest.args | 32 ------------------- ...-default-fallback-nousb.aarch64-latest.xml | 22 ------------- .../usb-controller-default-fallback-nousb.xml | 1 - ...efault-nousb.aarch64-latest.abi-update.err | 1 + ...ntroller-default-nousb.aarch64-latest.args | 32 ------------------- ...ontroller-default-nousb.aarch64-latest.err | 1 + ...fault-unavailable-nousb.aarch64-latest.err | 1 - ...fault-unavailable-nousb.aarch64-latest.xml | 22 ------------- ...b-controller-default-unavailable-nousb.xml | 1 - tests/qemuxmlconftest.c | 14 ++------ 11 files changed, 17 insertions(+), 128 deletions(-) delete mode 100644 tests/qemuxmlconfdata/usb-controller-default-fallback-n= ousb.aarch64-latest.args delete mode 100644 tests/qemuxmlconfdata/usb-controller-default-fallback-n= ousb.aarch64-latest.xml delete mode 120000 tests/qemuxmlconfdata/usb-controller-default-fallback-n= ousb.xml create mode 100644 tests/qemuxmlconfdata/usb-controller-default-nousb.aarc= h64-latest.abi-update.err delete mode 100644 tests/qemuxmlconfdata/usb-controller-default-nousb.aarc= h64-latest.args create mode 100644 tests/qemuxmlconfdata/usb-controller-default-nousb.aarc= h64-latest.err delete mode 100644 tests/qemuxmlconfdata/usb-controller-default-unavailabl= e-nousb.aarch64-latest.err delete mode 100644 tests/qemuxmlconfdata/usb-controller-default-unavailabl= e-nousb.aarch64-latest.xml delete mode 120000 tests/qemuxmlconfdata/usb-controller-default-unavailabl= e-nousb.xml diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c index ebf6a38fde..774541ca06 100644 --- a/src/qemu/qemu_domain_address.c +++ b/src/qemu/qemu_domain_address.c @@ -2672,7 +2672,8 @@ static int qemuDomainAssignPCIAddresses(virDomainDef *def, virQEMUCaps *qemuCaps, virQEMUDriver *driver, - virDomainObj *obj) + virDomainObj *obj, + bool newDomain) { int ret =3D -1; virDomainPCIAddressSet *addrs =3D NULL; @@ -2840,10 +2841,17 @@ qemuDomainAssignPCIAddresses(virDomainDef *def, g_clear_pointer(&addrs, virDomainPCIAddressSetFree); } =20 - if (!(addrs =3D qemuDomainPCIAddressSetCreate(def, qemuCaps, nbuses, f= alse))) - goto cleanup; + /* We're done collecting available information, now we're going + * to allocate PCI addresses for real. We normally skip this part + * for machine type that don't support PCI, but we run it for new + * domains to catch situation in which the user is incorrectly + * asking for PCI devices to be used. If that's the case, an + * error will naturally be raised when attempting to allocate a + * PCI address since no PCI buses exist */ + if (qemuDomainSupportsPCI(def) || newDomain) { + if (!(addrs =3D qemuDomainPCIAddressSetCreate(def, qemuCaps, nbuse= s, false))) + goto cleanup; =20 - if (qemuDomainSupportsPCI(def)) { if (qemuDomainValidateDevicePCISlotsChipsets(def, addrs) < 0) goto cleanup; =20 @@ -3287,7 +3295,7 @@ qemuDomainAssignAddresses(virDomainDef *def, =20 qemuDomainAssignVirtioMMIOAddresses(def, qemuCaps); =20 - if (qemuDomainAssignPCIAddresses(def, qemuCaps, driver, obj) < 0) + if (qemuDomainAssignPCIAddresses(def, qemuCaps, driver, obj, newDomain= ) < 0) return -1; =20 if (qemuDomainAssignUSBAddresses(def, obj, newDomain) < 0) diff --git a/tests/qemuxmlconfdata/usb-controller-default-fallback-nousb.aa= rch64-latest.args b/tests/qemuxmlconfdata/usb-controller-default-fallback-n= ousb.aarch64-latest.args deleted file mode 100644 index 0fb2909dd2..0000000000 --- a/tests/qemuxmlconfdata/usb-controller-default-fallback-nousb.aarch64-l= atest.args +++ /dev/null @@ -1,32 +0,0 @@ -LC_ALL=3DC \ -PATH=3D/bin \ -HOME=3D/var/lib/libvirt/qemu/domain--1-aarch64test \ -USER=3Dtest \ -LOGNAME=3Dtest \ -XDG_DATA_HOME=3D/var/lib/libvirt/qemu/domain--1-aarch64test/.local/share \ -XDG_CACHE_HOME=3D/var/lib/libvirt/qemu/domain--1-aarch64test/.cache \ -XDG_CONFIG_HOME=3D/var/lib/libvirt/qemu/domain--1-aarch64test/.config \ -/usr/bin/qemu-system-aarch64 \ --name guest=3Daarch64test,debug-threads=3Don \ --S \ --object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/va= r/lib/libvirt/qemu/domain--1-aarch64test/master-key.aes"}' \ --machine collie,usb=3Doff,dump-guest-core=3Doff,memory-backend=3Dstrongarm= .sdram \ --accel kvm \ --cpu host \ --m size=3D1048576k \ --object '{"qom-type":"memory-backend-ram","id":"strongarm.sdram","size":10= 73741824}' \ --overcommit mem-lock=3Doff \ --smp 1,sockets=3D1,cores=3D1,threads=3D1 \ --uuid 6ba410c5-1e5c-4d57-bee7-2228e7ffa32f \ --display none \ --no-user-config \ --nodefaults \ --chardev socket,id=3Dcharmonitor,fd=3D1729,server=3Don,wait=3Doff \ --mon chardev=3Dcharmonitor,id=3Dmonitor,mode=3Dcontrol \ --rtc base=3Dutc \ --no-shutdown \ --boot strict=3Don \ --device '{"driver":"qemu-xhci","id":"usb"}' \ --audiodev '{"id":"audio1","driver":"none"}' \ --sandbox on,obsolete=3Ddeny,elevateprivileges=3Ddeny,spawn=3Ddeny,resource= control=3Ddeny \ --msg timestamp=3Don diff --git a/tests/qemuxmlconfdata/usb-controller-default-fallback-nousb.aa= rch64-latest.xml b/tests/qemuxmlconfdata/usb-controller-default-fallback-no= usb.aarch64-latest.xml deleted file mode 100644 index fa258c5671..0000000000 --- a/tests/qemuxmlconfdata/usb-controller-default-fallback-nousb.aarch64-l= atest.xml +++ /dev/null @@ -1,22 +0,0 @@ - - aarch64test - 6ba410c5-1e5c-4d57-bee7-2228e7ffa32f - 1048576 - 1048576 - 1 - - hvm - - - - - destroy - restart - destroy - - /usr/bin/qemu-system-aarch64 - - - diff --git a/tests/qemuxmlconfdata/usb-controller-default-fallback-nousb.xm= l b/tests/qemuxmlconfdata/usb-controller-default-fallback-nousb.xml deleted file mode 120000 index 9cba7c3a06..0000000000 --- a/tests/qemuxmlconfdata/usb-controller-default-fallback-nousb.xml +++ /dev/null @@ -1 +0,0 @@ -usb-controller-default-nousb.xml \ No newline at end of file diff --git a/tests/qemuxmlconfdata/usb-controller-default-nousb.aarch64-lat= est.abi-update.err b/tests/qemuxmlconfdata/usb-controller-default-nousb.aar= ch64-latest.abi-update.err new file mode 100644 index 0000000000..a0ca4fba5d --- /dev/null +++ b/tests/qemuxmlconfdata/usb-controller-default-nousb.aarch64-latest.abi= -update.err @@ -0,0 +1 @@ +XML error: No PCI buses available diff --git a/tests/qemuxmlconfdata/usb-controller-default-nousb.aarch64-lat= est.args b/tests/qemuxmlconfdata/usb-controller-default-nousb.aarch64-lates= t.args deleted file mode 100644 index 0fb2909dd2..0000000000 --- a/tests/qemuxmlconfdata/usb-controller-default-nousb.aarch64-latest.args +++ /dev/null @@ -1,32 +0,0 @@ -LC_ALL=3DC \ -PATH=3D/bin \ -HOME=3D/var/lib/libvirt/qemu/domain--1-aarch64test \ -USER=3Dtest \ -LOGNAME=3Dtest \ -XDG_DATA_HOME=3D/var/lib/libvirt/qemu/domain--1-aarch64test/.local/share \ -XDG_CACHE_HOME=3D/var/lib/libvirt/qemu/domain--1-aarch64test/.cache \ -XDG_CONFIG_HOME=3D/var/lib/libvirt/qemu/domain--1-aarch64test/.config \ -/usr/bin/qemu-system-aarch64 \ --name guest=3Daarch64test,debug-threads=3Don \ --S \ --object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/va= r/lib/libvirt/qemu/domain--1-aarch64test/master-key.aes"}' \ --machine collie,usb=3Doff,dump-guest-core=3Doff,memory-backend=3Dstrongarm= .sdram \ --accel kvm \ --cpu host \ --m size=3D1048576k \ --object '{"qom-type":"memory-backend-ram","id":"strongarm.sdram","size":10= 73741824}' \ --overcommit mem-lock=3Doff \ --smp 1,sockets=3D1,cores=3D1,threads=3D1 \ --uuid 6ba410c5-1e5c-4d57-bee7-2228e7ffa32f \ --display none \ --no-user-config \ --nodefaults \ --chardev socket,id=3Dcharmonitor,fd=3D1729,server=3Don,wait=3Doff \ --mon chardev=3Dcharmonitor,id=3Dmonitor,mode=3Dcontrol \ --rtc base=3Dutc \ --no-shutdown \ --boot strict=3Don \ --device '{"driver":"qemu-xhci","id":"usb"}' \ --audiodev '{"id":"audio1","driver":"none"}' \ --sandbox on,obsolete=3Ddeny,elevateprivileges=3Ddeny,spawn=3Ddeny,resource= control=3Ddeny \ --msg timestamp=3Don diff --git a/tests/qemuxmlconfdata/usb-controller-default-nousb.aarch64-lat= est.err b/tests/qemuxmlconfdata/usb-controller-default-nousb.aarch64-latest= .err new file mode 100644 index 0000000000..a0ca4fba5d --- /dev/null +++ b/tests/qemuxmlconfdata/usb-controller-default-nousb.aarch64-latest.err @@ -0,0 +1 @@ +XML error: No PCI buses available diff --git a/tests/qemuxmlconfdata/usb-controller-default-unavailable-nousb= .aarch64-latest.err b/tests/qemuxmlconfdata/usb-controller-default-unavaila= ble-nousb.aarch64-latest.err deleted file mode 100644 index cac4e8e760..0000000000 --- a/tests/qemuxmlconfdata/usb-controller-default-unavailable-nousb.aarch6= 4-latest.err +++ /dev/null @@ -1 +0,0 @@ -internal error: Unable to determine model for USB controller idx=3D0 diff --git a/tests/qemuxmlconfdata/usb-controller-default-unavailable-nousb= .aarch64-latest.xml b/tests/qemuxmlconfdata/usb-controller-default-unavaila= ble-nousb.aarch64-latest.xml deleted file mode 100644 index ac5f270a3a..0000000000 --- a/tests/qemuxmlconfdata/usb-controller-default-unavailable-nousb.aarch6= 4-latest.xml +++ /dev/null @@ -1,22 +0,0 @@ - - aarch64test - 6ba410c5-1e5c-4d57-bee7-2228e7ffa32f - 1048576 - 1048576 - 1 - - hvm - - - - - destroy - restart - destroy - - /usr/bin/qemu-system-aarch64 - - - diff --git a/tests/qemuxmlconfdata/usb-controller-default-unavailable-nousb= .xml b/tests/qemuxmlconfdata/usb-controller-default-unavailable-nousb.xml deleted file mode 120000 index 9cba7c3a06..0000000000 --- a/tests/qemuxmlconfdata/usb-controller-default-unavailable-nousb.xml +++ /dev/null @@ -1 +0,0 @@ -usb-controller-default-nousb.xml \ No newline at end of file diff --git a/tests/qemuxmlconftest.c b/tests/qemuxmlconftest.c index b266fbc1db..22cd8e5b56 100644 --- a/tests/qemuxmlconftest.c +++ b/tests/qemuxmlconftest.c @@ -2212,18 +2212,8 @@ mymain(void) ARG_END); =20 /* The '-nousb' test case tests machine without a built-in USB control= ler */ - DO_TEST_CAPS_ARCH_LATEST("usb-controller-default-nousb", "aarch64"); - DO_TEST_FULL("usb-controller-default-fallback-nousb", ".aarch64-latest= ", - ARG_CAPS_ARCH, "aarch64", - ARG_CAPS_VER, "latest", - ARG_QEMU_CAPS_DEL, QEMU_CAPS_PIIX3_USB_UHCI, QEMU_CAPS_LA= ST, - ARG_END); - DO_TEST_FULL("usb-controller-default-unavailable-nousb", ".aarch64-lat= est", - ARG_CAPS_ARCH, "aarch64", - ARG_CAPS_VER, "latest", - ARG_FLAGS, FLAG_EXPECT_FAILURE, - ARG_QEMU_CAPS_DEL, QEMU_CAPS_DEVICE_QEMU_XHCI, QEMU_CAPS_= NEC_USB_XHCI, QEMU_CAPS_PIIX3_USB_UHCI, QEMU_CAPS_PCI_OHCI, QEMU_CAPS_LAST, - ARG_END); + DO_TEST_CAPS_ARCH_LATEST_FAILURE("usb-controller-default-nousb", "aarc= h64"); + DO_TEST_CAPS_ARCH_LATEST_ABI_UPDATE_PARSE_ERROR("usb-controller-defaul= t-nousb", "aarch64"); =20 DO_TEST_FULL("usb-controller-default-fallback-g3beige", ".ppc64-latest= ", ARG_CAPS_ARCH, "ppc64", --=20 2.51.0