From nobody Sun Oct 5 01:51: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=1758827581; cv=none; d=zohomail.com; s=zohoarc; b=oDrWpx+22SFpPsDm9ENx3u8qbEeYhHOs6jvsRgnhTa4U+Bfyffh75cE+4FUa/ue/tkP38rPCJ8LIM3MQ+gaToLJmyMuOZ3YwgwF2t4vynZkmiODgnryuQjqIdnB4n+UQZ3WzFAji1VrT//odpvtG+xov0vMcnFBeCziNTNBb4FQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1758827581; 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=F2zv3e7ddo+maK5TuVe8PxDFAnKn5cebRRjwi6Dxb+M=; b=V9kLdpeMn9hOAMojINpO6jy+PeMiSkHZqgHO3eFLl6mDCwTk4lmAKyENuYN/A6Z6K4uRyhfkwch6br+fL7hc7Zc6/iKJYh+SsgjL0EoXUDvrzWfCOws/2s7eMz5e1dwfhiuh/DEU7Gq0ybM3SltwBsW4zKEVDSJp33Gp7i49Ks0= 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 1758827581317247.80264527068016; Thu, 25 Sep 2025 12:13:01 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 57E214419C; Thu, 25 Sep 2025 15:13:00 -0400 (EDT) Received: from [172.19.199.14] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id 1DDF744C39; Thu, 25 Sep 2025 14:21:54 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 208C44488B; Thu, 25 Sep 2025 14:20:44 -0400 (EDT) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.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 789B543F7C for ; Thu, 25 Sep 2025 14:08:12 -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-247-CskZLAn4OsG-RYfO9EETNg-1; Thu, 25 Sep 2025 14:08:09 -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 1673118002C4 for ; Thu, 25 Sep 2025 18:08:09 +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 4442C300021A for ; Thu, 25 Sep 2025 18:08:08 +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=1758823692; 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=F2zv3e7ddo+maK5TuVe8PxDFAnKn5cebRRjwi6Dxb+M=; b=RTSkzzlYA7uDbtuZ+N8z+U4JWT+m2JZYu0PSZgMT1EZZaIvvHCmCsqW93K74Wfz+GKJ/jP faWcWVP4MsT27CLgDfzw9HUSEasyOWXHmi9RjAlq8sVNMBkyPkorwm/hKcTLdDZVlgbRgB 9Ft0nR/c2oBAerxKLqu3JZpiLPsUuDA= X-MC-Unique: CskZLAn4OsG-RYfO9EETNg-1 X-Mimecast-MFC-AGG-ID: CskZLAn4OsG-RYfO9EETNg_1758823689 To: devel@lists.libvirt.org Subject: [PATCH v2 30/38] qemu: Clean up qemuDomainDefaultUSBControllerModel() Date: Thu, 25 Sep 2025 20:07:16 +0200 Message-ID: <20250925180724.500758-31-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: WYxcpYmff12KIXskQ7tbQHix2pedF_NdoCqG3NtiA78_1758823689 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: HSU4FTFZEVE6HOFTBTPAWBMVVCY2T6CD X-Message-ID-Hash: HSU4FTFZEVE6HOFTBTPAWBMVVCY2T6CD 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: 1758827582737116600 Content-Type: text/plain; charset="utf-8"; x-default="true" Switch from the current approach, in which an initial and likely poor default is picked and then a better one later overwrites it, to the more common and easy to reason about pattern where the value is returned directly as soon as possible. To make things easier to understand and more maintainable, the various architectures for which we have explicit handling are each taken care of separately, with no falling through to the default behavior. Signed-off-by: Andrea Bolognani Reviewed-by: Peter Krempa --- src/qemu/qemu_domain.c | 108 +++++++++++++++++++++++------------------ 1 file changed, 62 insertions(+), 46 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index f60156895a..74c393c2df 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -4320,60 +4320,76 @@ qemuDomainDefaultUSBControllerModel(const virDomain= Def *def, virQEMUCaps *qemuCaps, unsigned int parseFlags) { - virDomainControllerModelUSB model =3D VIR_DOMAIN_CONTROLLER_MODEL_USB_= DEFAULT; + bool abiUpdate =3D !!(parseFlags & VIR_DOMAIN_DEF_PARSE_ABI_UPDATE); =20 - /* Pick a suitable default model for the USB controller if none - * has been selected by the user and we have the qemuCaps for - * figuring out which controllers are supported. - * - * We rely on device availability instead of setting the model - * unconditionally because, for some machine types, there's a - * chance we will get away with using the legacy USB controller - * when the relevant device is not available. - * - * See qemuBuildControllersCommandLine() */ + if (ARCH_IS_LOONGARCH(def->os.arch)) { + /* Prefer qemu-xhci (USB3) */ + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_QEMU_XHCI)) + return VIR_DOMAIN_CONTROLLER_MODEL_USB_QEMU_XHCI; =20 - /* Default USB controller is piix3-uhci if available. Fall back to - * 'pci-ohci' otherwise which is the default for non-x86 machines - * which honour -usb */ - if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_PIIX3_USB_UHCI)) - model =3D VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX3_UHCI; - else if (!ARCH_IS_X86(def->os.arch) && - virQEMUCapsGet(qemuCaps, QEMU_CAPS_PCI_OHCI)) - model =3D VIR_DOMAIN_CONTROLLER_MODEL_USB_PCI_OHCI; + /* Allow piix3-uhci and pci-ohci (USB1) as fallback */ + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_PIIX3_USB_UHCI)) + return VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX3_UHCI; + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_PCI_OHCI)) + return VIR_DOMAIN_CONTROLLER_MODEL_USB_PCI_OHCI; + + return VIR_DOMAIN_CONTROLLER_MODEL_USB_DEFAULT; + } + + if (def->os.arch =3D=3D VIR_ARCH_AARCH64) { + /* Prefer qemu-xhci or nec-xhci (USB3) */ + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_QEMU_XHCI)) + return VIR_DOMAIN_CONTROLLER_MODEL_USB_QEMU_XHCI; + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_NEC_USB_XHCI)) + return VIR_DOMAIN_CONTROLLER_MODEL_USB_NEC_XHCI; + + /* Allow piix3-uhci and pci-ohci (USB1) as fallback */ + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_PIIX3_USB_UHCI)) + return VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX3_UHCI; + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_PCI_OHCI)) + return VIR_DOMAIN_CONTROLLER_MODEL_USB_PCI_OHCI; + + return VIR_DOMAIN_CONTROLLER_MODEL_USB_DEFAULT; + } =20 if (ARCH_IS_S390(def->os.arch)) { /* No default model on s390x, one has to be provided * explicitly by the user */ - model =3D VIR_DOMAIN_CONTROLLER_MODEL_USB_NONE; - } else if (ARCH_IS_PPC64(def->os.arch)) { - /* To not break migration we need to set default USB controller - * for ppc64 to pci-ohci if we cannot change ABI of the VM. - * The nec-usb-xhci or qemu-xhci controller is used as default - * only for newly defined domains or devices. */ - if ((parseFlags & VIR_DOMAIN_DEF_PARSE_ABI_UPDATE) && - virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_QEMU_XHCI)) { - model =3D VIR_DOMAIN_CONTROLLER_MODEL_USB_QEMU_XHCI; - } else if ((parseFlags & VIR_DOMAIN_DEF_PARSE_ABI_UPDATE) && - virQEMUCapsGet(qemuCaps, QEMU_CAPS_NEC_USB_XHCI)) { - model =3D VIR_DOMAIN_CONTROLLER_MODEL_USB_NEC_XHCI; - } else if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_PCI_OHCI)) { - model =3D VIR_DOMAIN_CONTROLLER_MODEL_USB_PCI_OHCI; - } else { - /* Explicitly fallback to legacy USB controller for PPC64. */ - model =3D VIR_DOMAIN_CONTROLLER_MODEL_USB_DEFAULT; - } - } else if (def->os.arch =3D=3D VIR_ARCH_AARCH64) { - 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 (ARCH_IS_LOONGARCH(def->os.arch)) { - if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_QEMU_XHCI)) - model =3D VIR_DOMAIN_CONTROLLER_MODEL_USB_QEMU_XHCI; + return VIR_DOMAIN_CONTROLLER_MODEL_USB_NONE; } =20 - return model; + if (ARCH_IS_PPC64(def->os.arch)) { + /* Use qemu-xhci or nec-xhci (USB3) for newly-defined guests */ + if (abiUpdate && virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_QEMU_XH= CI)) + return VIR_DOMAIN_CONTROLLER_MODEL_USB_QEMU_XHCI; + if (abiUpdate && virQEMUCapsGet(qemuCaps, QEMU_CAPS_NEC_USB_XHCI)) + return VIR_DOMAIN_CONTROLLER_MODEL_USB_NEC_XHCI; + + /* To preserve backwards compatibility, existing guests need to + * use pci-ohci (USB1) instead */ + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_PCI_OHCI)) + return VIR_DOMAIN_CONTROLLER_MODEL_USB_PCI_OHCI; + + return VIR_DOMAIN_CONTROLLER_MODEL_USB_DEFAULT; + } + + if (ARCH_IS_X86(def->os.arch)) { + /* Use piix3-uhci (USB1) for backwards compatibility */ + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_PIIX3_USB_UHCI)) + return VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX3_UHCI; + + return VIR_DOMAIN_CONTROLLER_MODEL_USB_DEFAULT; + } + + /* Most common architectures and machine types have been already + * handled above; for the remaining cases, use piix3-uhci or + * pci-ohci (USB1) as the most reasonable fallback */ + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_PIIX3_USB_UHCI)) + return VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX3_UHCI; + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_PCI_OHCI)) + return VIR_DOMAIN_CONTROLLER_MODEL_USB_PCI_OHCI; + + return VIR_DOMAIN_CONTROLLER_MODEL_USB_DEFAULT; } =20 =20 --=20 2.51.0