From nobody Sun Oct 5 01:49:56 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=1758827514; cv=none; d=zohomail.com; s=zohoarc; b=Zbp8AIlnP0Xl45CcZ+xT/On0IP1ntuB89TYTPbClYrtyPxZJ0cklGUPp+ST1oWcOHf7hD+Yyi9gmdnuysYG8cCv0zrVtvZZ9a7/vKwf7qNOROv8DytJuWoTAg3Qa+eSI2nGW7z41kWHO3lCK59pF1vYbenqfE05pNeNClIBUUlE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1758827514; 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=VgkwfsXWEI2Zl56Aj7kFOkjxzlQxEpKBc43ip0neFls=; b=Gc2XwLItXlDM9WJx8jLqwT+aH7VHkJApYfn0eMhqLnXn5VqOWwgoykplPoKkkqGIwpgZ3xKUyA237wZm7Za4NMGbH/NZl/tbTotK16TK6SGLa0eBlZSErnognA4YNzDeeJ/x8z9NZPfBY9An7j9AqoidyeUkiR2LrSI4oFj0bCk= 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 1758827514357434.30485754270205; Thu, 25 Sep 2025 12:11:54 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 762B63FD05; Thu, 25 Sep 2025 15:11:52 -0400 (EDT) Received: from [172.19.199.14] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id A0FB444BFB; Thu, 25 Sep 2025 14:21:45 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id EEEE74462C; Thu, 25 Sep 2025 14:20:28 -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 463074408B for ; Thu, 25 Sep 2025 14:08:10 -0400 (EDT) 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-todJhBI9OrmKjVQjA9pXbQ-1; Thu, 25 Sep 2025 14:08:08 -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-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id BB6FA18002AA for ; Thu, 25 Sep 2025 18:08:07 +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 E961230002D1 for ; Thu, 25 Sep 2025 18:08:06 +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=1758823690; 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=VgkwfsXWEI2Zl56Aj7kFOkjxzlQxEpKBc43ip0neFls=; b=eMSkmaDcuRLoPlKQD5p09K9qmRoOql2zFOceKTaeavb/OaBvZSTsOpR6b4v2sPoBFACzBm p8NBgVgiOWbJxN4wegQwiOVU+shKQ1VtEzQit4uOgWOUaWIy8pGf1qzlcFeDdpsK/Ye7jJ YcSy+GmoMKmxEW+NaTkvczKpGXqOt94= X-MC-Unique: todJhBI9OrmKjVQjA9pXbQ-1 X-Mimecast-MFC-AGG-ID: todJhBI9OrmKjVQjA9pXbQ_1758823687 To: devel@lists.libvirt.org Subject: [PATCH v2 29/38] qemu: Add qemuDomainDefaultUSBControllerModelAutoAdded() Date: Thu, 25 Sep 2025 20:07:15 +0200 Message-ID: <20250925180724.500758-30-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: pFLv4-7Y_yIVbHEA9RAxq6-NyTJAjwuhjXDxYalCdzU_1758823687 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: URSZTRUMQUOC2P43PJUXCGSFMPITGCCR X-Message-ID-Hash: URSZTRUMQUOC2P43PJUXCGSFMPITGCCR 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: 1758827515914116600 Content-Type: text/plain; charset="utf-8"; x-default="true" In addition to the code in qemuDomainControllerDefPostParse(), which we have just factored into its own function, we also have some code in qemuDomainDefAddDefaultDevices() that deals with choosing the USB controller model for a couple of specific machine types. Once again, extract the logic to a dedicated helper. The behavior is unchanged. Signed-off-by: Andrea Bolognani Reviewed-by: Michal Privoznik Reviewed-by: Peter Krempa --- src/qemu/qemu_domain.c | 58 +++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_domain.h | 2 ++ src/qemu/qemu_postparse.c | 27 +++++++----------- 3 files changed, 70 insertions(+), 17 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index e4816c78e0..f60156895a 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -4377,6 +4377,64 @@ qemuDomainDefaultUSBControllerModel(const virDomainD= ef *def, } =20 =20 +/** + * qemuDomainDefaultUSBControllerModelAutoAdded: + * @def: domain definition + * @qemuCaps: QEMU capabilities, or NULL + * + * Choose a reasonable model to use for a USB controller that is + * being automatically added to a domain. + * + * The choice is based on a number of factors, including the guest's + * architecture and machine type. @qemuCaps might be NULL, in which + * case the function must not make any decision based on device + * availability; it will be re-run later with a non-NULL qemuCaps. + * + * The return value can be a specific controller model, or + * VIR_DOMAIN_CONTROLLER_MODEL_USB_DEFAULT; the latter indicates that + * no suitable model could be identified. How to behave in that + * scenario is entirely up to the caller. + * + * Additionally, VIR_DOMAIN_CONTROLLER_MODEL_USB_NONE can be returned + * to indicate that the caller should not auto-add the USB controller + * after all. + * + * Returns: the model + */ +virDomainControllerModelUSB +qemuDomainDefaultUSBControllerModelAutoAdded(const virDomainDef *def, + virQEMUCaps *qemuCaps) +{ + virDomainControllerModelUSB model =3D VIR_DOMAIN_CONTROLLER_MODEL_USB_= DEFAULT; + + if (ARCH_IS_X86(def->os.arch)) { + if (qemuDomainIsQ35(def)) { + /* Prefer adding a USB3 controller if supported, fall back + * to USB2 if there is no USB3 available, and if that's + * unavailable don't add anything. + */ + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_QEMU_XHCI)) + model =3D VIR_DOMAIN_CONTROLLER_MODEL_USB_QEMU_XHCI; + else if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_NEC_USB_XHCI)) + model =3D VIR_DOMAIN_CONTROLLER_MODEL_USB_NEC_XHCI; + else if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_ICH9_USB_EHCI1)) + model =3D VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_EHCI1; + else + model =3D VIR_DOMAIN_CONTROLLER_MODEL_USB_NONE; + } + } + + if (ARCH_IS_ARM(def->os.arch)) { + if (STREQ(def->os.machine, "versatilepb") || + STRPREFIX(def->os.machine, "realview-eb")) + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_PCI_OHCI)) + model =3D VIR_DOMAIN_CONTROLLER_MODEL_USB_PCI_OHCI; + } + + return model; +} + + /** * qemuDomainDefNumaCPUsRectify: * @numa: pointer to numa definition diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index bdcfcc6e86..5ccd3b2dbb 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -845,6 +845,8 @@ virDomainControllerModelSCSI qemuDomainDefaultSCSIContr= ollerModel(const virDomai virDomainControllerModelUSB qemuDomainDefaultUSBControllerModel(const virD= omainDef *def, virQEMUCap= s *qemuCaps, unsigned i= nt parseFlags); +virDomainControllerModelUSB qemuDomainDefaultUSBControllerModelAutoAdded(c= onst virDomainDef *def, + v= irQEMUCaps *qemuCaps); =20 int qemuDomainDefAddDefaultAudioBackend(virQEMUDriver *driver, virDomainDef *def); diff --git a/src/qemu/qemu_postparse.c b/src/qemu/qemu_postparse.c index 895dfa2625..e5a0913111 100644 --- a/src/qemu/qemu_postparse.c +++ b/src/qemu/qemu_postparse.c @@ -1189,7 +1189,7 @@ qemuDomainDefAddDefaultDevices(virQEMUDriver *driver, virQEMUCaps *qemuCaps) { bool addDefaultUSB =3D false; - int usbModel =3D -1; /* "default for machinetype" */ + virDomainControllerModelUSB usbModel =3D VIR_DOMAIN_CONTROLLER_MODEL_U= SB_DEFAULT; int pciRoot; /* index within def->controllers */ bool addImplicitSATA =3D false; bool addPCIRoot =3D false; @@ -1224,20 +1224,6 @@ qemuDomainDefAddDefaultDevices(virQEMUDriver *driver, if (virDomainDefGetVcpusMax(def) > QEMU_MAX_VCPUS_WITHOUT_EIM)= { addIOMMU =3D true; } - - /* Prefer adding a USB3 controller if supported, fall back - * to USB2 if there is no USB3 available, and if that's - * unavailable don't add anything. - */ - if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_QEMU_XHCI)) - usbModel =3D VIR_DOMAIN_CONTROLLER_MODEL_USB_QEMU_XHCI; - else if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_NEC_USB_XHCI)) - usbModel =3D VIR_DOMAIN_CONTROLLER_MODEL_USB_NEC_XHCI; - else if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_ICH9_USB_EHCI1)) - usbModel =3D VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_EHCI1; - else - addDefaultUSB =3D false; - break; } if (qemuDomainIsI440FX(def)) addPCIRoot =3D true; @@ -1253,8 +1239,6 @@ qemuDomainDefAddDefaultDevices(virQEMUDriver *driver, STRPREFIX(def->os.machine, "realview-eb")) { addPCIRoot =3D true; addDefaultUSB =3D true; - if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_PCI_OHCI)) - usbModel =3D VIR_DOMAIN_CONTROLLER_MODEL_USB_PCI_OHCI; } =20 if (qemuDomainIsARMVirt(def)) @@ -1363,6 +1347,15 @@ qemuDomainDefAddDefaultDevices(virQEMUDriver *driver, return -1; } =20 + if (addDefaultUSB && usbModel =3D=3D VIR_DOMAIN_CONTROLLER_MODEL_USB_D= EFAULT) { + usbModel =3D qemuDomainDefaultUSBControllerModelAutoAdded(def, qem= uCaps); + + /* If no reasonable model can be figured out, we should + * simply not add the default USB controller */ + if (usbModel =3D=3D VIR_DOMAIN_CONTROLLER_MODEL_USB_NONE) + addDefaultUSB =3D false; + } + if (addDefaultUSB && virDomainControllerFind(def, VIR_DOMAIN_CONTROLLE= R_TYPE_USB, 0) < 0) virDomainDefAddUSBController(def, 0, usbModel); =20 --=20 2.51.0