From nobody Fri Apr 17 10:46:03 2026 Delivered-To: importer@patchew.org Received-SPF: none (zohomail.com: 8.43.85.245 is neither permitted nor denied by domain of lists.libvirt.org) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; spf=none (zohomail.com: 8.43.85.245 is neither permitted nor denied by domain of lists.libvirt.org) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1707932845122270.7628171807751; Wed, 14 Feb 2024 09:47:25 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 996) id 03D7A1B57; Wed, 14 Feb 2024 12:47:23 -0500 (EST) Received: from lists.libvirt.org.85.43.8.in-addr.arpa (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 5E2AC1C22; Wed, 14 Feb 2024 12:14:46 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 996) id 7B7471A76; Wed, 14 Feb 2024 12:12:08 -0500 (EST) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.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 610A01A3F for ; Wed, 14 Feb 2024 12:11:39 -0500 (EST) Received: from mimecast-mx02.redhat.com (mx-ext.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-395-Qlr9vCB1POqegLguqSe1NA-1; Wed, 14 Feb 2024 12:11:37 -0500 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) (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 mimecast-mx02.redhat.com (Postfix) with ESMTPS id 509242812FEC for ; Wed, 14 Feb 2024 17:11:37 +0000 (UTC) Received: from harajuku.usersys.redhat.com (unknown [10.45.226.93]) by smtp.corp.redhat.com (Postfix) with ESMTPS id DAFAE1121337 for ; Wed, 14 Feb 2024 17:11:36 +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=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE, T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.4 X-MC-Unique: Qlr9vCB1POqegLguqSe1NA-1 From: Andrea Bolognani To: devel@lists.libvirt.org Subject: [PATCH v2 15/17] qemu: Extend qemuDomainDefaultUSBControllerModel() Date: Wed, 14 Feb 2024 18:11:22 +0100 Message-ID: <20240214171124.508000-16-abologna@redhat.com> In-Reply-To: <20240214171124.508000-1-abologna@redhat.com> References: <20240214171124.508000-1-abologna@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.3 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Message-ID-Hash: JWM4QYFIVUZGRHIWEF75OUTZBIUDFVSG X-Message-ID-Hash: JWM4QYFIVUZGRHIWEF75OUTZBIUDFVSG 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: Content-Type: text/plain; charset="utf-8"; x-default="true" Content-Transfer-Encoding: quoted-printable X-ZM-MESSAGEID: 1707932847134100001 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 model for a USB controller, specifically for q35 guests. Integrate it into the newly-created function. Since we want slightly different behaviors depending on whether the USB controller that we're working on is the one that we try to automatically add for certain new guests (addDefaultUSB), we need to introduce a new parameter to the function. Signed-off-by: Andrea Bolognani --- src/qemu/qemu_domain.c | 50 ++++++++++++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 17 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index a970bf5c18..6801a883f4 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -4159,6 +4159,7 @@ qemuDomainDefaultSCSIControllerModel(virDomainControl= lerModelSCSI *model, =20 static int qemuDomainDefaultUSBControllerModel(virDomainControllerModelUSB *model, + bool autoAdded, const virDomainDef *def, virQEMUCaps *qemuCaps, unsigned int parseFlags) @@ -4195,16 +4196,34 @@ qemuDomainDefaultUSBControllerModel(virDomainContro= llerModelUSB *model, *model =3D VIR_DOMAIN_CONTROLLER_MODEL_USB_NEC_XHCI; } =20 + if (ARCH_IS_X86(def->os.arch)) { + if (qemuDomainIsQ35(def) && autoAdded) { + /* 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_DEFAULT; + } + } + return 0; } =20 static int qemuDomainDefAddDefaultDevices(virQEMUDriver *driver, virDomainDef *def, - virQEMUCaps *qemuCaps) + virQEMUCaps *qemuCaps, + unsigned int parseFlags) { 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; @@ -4235,19 +4254,6 @@ qemuDomainDefAddDefaultDevices(virQEMUDriver *driver, addPCIeRoot =3D true; addImplicitSATA =3D true; addITCOWatchdog =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)) @@ -4340,6 +4346,16 @@ qemuDomainDefAddDefaultDevices(virQEMUDriver *driver, break; } =20 + if (addDefaultUSB) { + /* If no reasonable model can be figured out, we should + * simply not add the default USB controller */ + if (qemuDomainDefaultUSBControllerModel(&usbModel, true, def, qemu= Caps, parseFlags) < 0 || + usbModel =3D=3D VIR_DOMAIN_CONTROLLER_MODEL_USB_DEFAULT) { + addDefaultUSB =3D false; + } + } + + if (addDefaultUSB && virDomainControllerFind(def, VIR_DOMAIN_CONTROLLER_TYPE_USB, 0) < = 0 && virDomainDefAddUSBController(def, 0, usbModel) < 0) @@ -5083,7 +5099,7 @@ qemuDomainDefPostParse(virDomainDef *def, if (qemuDomainDefBootPostParse(def, driver, parseFlags) < 0) return -1; =20 - if (qemuDomainDefAddDefaultDevices(driver, def, qemuCaps) < 0) + if (qemuDomainDefAddDefaultDevices(driver, def, qemuCaps, parseFlags) = < 0) return -1; =20 if (qemuDomainDefSetDefaultCPU(def, driver->hostarch, qemuCaps) < 0) @@ -5695,7 +5711,7 @@ qemuDomainControllerDefPostParse(virDomainControllerD= ef *cont, case VIR_DOMAIN_CONTROLLER_TYPE_USB: if (qemuCaps && cont->model =3D=3D VIR_DOMAIN_CONTROLLER_MODEL_USB_DEFAULT && - qemuDomainDefaultUSBControllerModel(&cont->model, def, qemuCap= s, parseFlags) < 0) { + qemuDomainDefaultUSBControllerModel(&cont->model, false, def, = qemuCaps, parseFlags) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Unable to determine model for USB controller= idx=3D%1$d"), cont->idx); --=20 2.43.0 _______________________________________________ Devel mailing list -- devel@lists.libvirt.org To unsubscribe send an email to devel-leave@lists.libvirt.org