From nobody Mon Sep 8 17:08:17 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=1755622326; cv=none; d=zohomail.com; s=zohoarc; b=J8x7gwXkDPFAIQmlGaWgGx2Q+jQbVB6CcAO4CPgIJM3AOefT9PAGmY3EWg+Z2fngHm74S26fWz9xRNChXHyVtBLzh6a10XwnqrETFOm0w9sr7UPAh5HjgWBR+KsXC4007Tjn5TPsIgR7fqIxIHaN0+lSz6+9tlIlJyzC3Qzhhqw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1755622326; h=Content-Type:Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post: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=9zm+5p35ObAsfqspTRXAYhFLj38FIB5buZXan4JWd8g=; b=IVxyejKL1JR15DzLs9fbPXn45NKqniotmJ/mwPaMnJKINx027sTGaqoLEtJ6SXt3w3q/UvYQcgdkoeqF8RXnR5izZU2pyj78Xech7B0BEhPp4+iyEBqJuFBhH6VnP2/9OHSG+WnDlyPOnUwGrufyZ2rkihsErc/G2AqZ1r8qGrk= 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 1755622326940359.38821775633915; Tue, 19 Aug 2025 09:52:06 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 5AC221186; Tue, 19 Aug 2025 12:52:06 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 0E860DC6; Tue, 19 Aug 2025 12:24:38 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 2E884C9B; Tue, 19 Aug 2025 12:24:32 -0400 (EDT) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 67B6F10F3 for ; Tue, 19 Aug 2025 12:23:16 -0400 (EDT) Received: from mx-prod-mc-04.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-416-MMwe1pZ6PM2EduDaawYTpQ-1; Tue, 19 Aug 2025 12:23:14 -0400 Received: from mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.93]) (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-04.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 03B6E1955BD9 for ; Tue, 19 Aug 2025 16:23:14 +0000 (UTC) Received: from harajuku.usersys.redhat.com (unknown [10.45.224.253]) by mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 2A94B180044F for ; Tue, 19 Aug 2025 16:23:12 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H5, RCVD_IN_MSPIKE_WL,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_HELO_PASS autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1755620596; 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=oXISmxQ+2kuqS/e0jTdWzNtmlJDwBgsW0laHC1uq+f0=; b=gjoAIcPPbAR3yCgV7a5uSE/phdgWbu2YP2JmpHJhuHPuBTM+VRq3bjPmJA4R3374cN9DM5 4Gy5CbE3tY1DLDY7Nx15XoF5xoY9C5d92sndH4N5Pg2yOhjbRNr6nXERI4X9MYh4d6czQc rk9f+QHuqYsoMmMS2uW3auD2iIcqV94= X-MC-Unique: MMwe1pZ6PM2EduDaawYTpQ-1 X-Mimecast-MFC-AGG-ID: MMwe1pZ6PM2EduDaawYTpQ_1755620594 To: devel@lists.libvirt.org Subject: [PATCH 25/31] qemu: Add qemuDomainDefaultUSBControllerModelAutoAdded() Date: Tue, 19 Aug 2025 18:22:29 +0200 Message-ID: <20250819162235.468215-26-abologna@redhat.com> In-Reply-To: <20250819162235.468215-1-abologna@redhat.com> References: <20250819162235.468215-1-abologna@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.93 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: kvdxqtP2o5Vf7iFNlBHkEUeDHPEuSiFOOGLKH9HyX-c_1755620594 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: YXBFACVMGAR7YM6JYC3TWHKO6TLI27EQ X-Message-ID-Hash: YXBFACVMGAR7YM6JYC3TWHKO6TLI27EQ X-MailFrom: abologna@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: 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: 1755622329691124100 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 --- src/qemu/qemu_domain.c | 57 +++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_domain.h | 2 ++ src/qemu/qemu_postparse.c | 27 +++++++------------ 3 files changed, 69 insertions(+), 17 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index f03624eda8..639506d22a 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -4376,6 +4376,63 @@ 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, if provided, might be + * taken into consideration too. + * + * 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 46ba12cd4a..3befd4a775 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; @@ -1223,20 +1223,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; @@ -1252,8 +1238,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)) @@ -1374,6 +1358,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.50.1