From nobody Sun Apr 28 09:20:18 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1521214872046447.54652708108847; Fri, 16 Mar 2018 08:41:12 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 906F93EA6B7; Fri, 16 Mar 2018 15:41:10 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id D9AFF821E4; Fri, 16 Mar 2018 15:40:54 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 30CB04CA9A; Fri, 16 Mar 2018 15:40:54 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w2GFcH2x001013 for ; Fri, 16 Mar 2018 11:38:17 -0400 Received: by smtp.corp.redhat.com (Postfix) id 3E85E215CDAF; Fri, 16 Mar 2018 15:38:17 +0000 (UTC) Received: from moe.brq.redhat.com (unknown [10.43.2.192]) by smtp.corp.redhat.com (Postfix) with ESMTP id B8B9E2166BDA; Fri, 16 Mar 2018 15:38:16 +0000 (UTC) From: Michal Privoznik To: libvir-list@redhat.com Date: Fri, 16 Mar 2018 16:38:14 +0100 Message-Id: X-Scanned-By: MIMEDefang 2.78 on 10.11.54.6 X-loop: libvir-list@redhat.com Cc: pkrempa@redhat.com Subject: [libvirt] [PATCH] qemu: Build usb controller command line more wisely X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Fri, 16 Mar 2018 15:41:11 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" https://bugzilla.redhat.com/show_bug.cgi?id=3D1552127 When building command line for USB controllers we have to do more than just put controller's alias onto the command line. QEMU has concept of these joined USB controllers. For instance ehci and uhci controllers need to create the same USB bus. To achieve that the slave controller needs to refer the master controller. This worked until we've introduced user aliases because both master and slave had the same alias. With user aliases slave can have different alias than master. Therefore, when generating command line for slave we need to look up the master's alias. Signed-off-by: Michal Privoznik --- src/qemu/qemu_command.c | 44 ++++++++++++++-- tests/qemuxml2argvdata/user-aliases-usb.args | 38 ++++++++++++++ tests/qemuxml2argvdata/user-aliases-usb.xml | 78 ++++++++++++++++++++++++= ++++ tests/qemuxml2argvtest.c | 3 ++ 4 files changed, 158 insertions(+), 5 deletions(-) create mode 100644 tests/qemuxml2argvdata/user-aliases-usb.args create mode 100644 tests/qemuxml2argvdata/user-aliases-usb.xml diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index fa0aa5d5c3..a8afbd14fa 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -2545,8 +2545,34 @@ qemuControllerModelUSBToCaps(int model) } =20 =20 +static const char * +qemuBuildUSBControllerFindMasterAlias(const virDomainDef *domainDef, + const virDomainControllerDef *def) +{ + size_t i; + + for (i =3D 0; i < domainDef->ncontrollers; i++) { + const virDomainControllerDef *tmp =3D domainDef->controllers[i]; + + if (tmp->type !=3D VIR_DOMAIN_CONTROLLER_TYPE_USB) + continue; + + if (tmp->idx !=3D def->idx) + continue; + + if (tmp->info.mastertype =3D=3D VIR_DOMAIN_CONTROLLER_MASTER_USB) + continue; + + return tmp->info.alias; + } + + return NULL; +} + + static int -qemuBuildUSBControllerDevStr(virDomainControllerDefPtr def, +qemuBuildUSBControllerDevStr(const virDomainDef *domainDef, + virDomainControllerDefPtr def, virQEMUCapsPtr qemuCaps, virBuffer *buf) { @@ -2586,11 +2612,19 @@ qemuBuildUSBControllerDevStr(virDomainControllerDef= Ptr def, def->opts.usbopts.ports, def->opts.usbopts.ports= ); } =20 - if (def->info.mastertype =3D=3D VIR_DOMAIN_CONTROLLER_MASTER_USB) + if (def->info.mastertype =3D=3D VIR_DOMAIN_CONTROLLER_MASTER_USB) { + const char *masterbus; + + if (!(masterbus =3D qemuBuildUSBControllerFindMasterAlias(domainDe= f, def))) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("masterbus not found")); + return -1; + } virBufferAsprintf(buf, ",masterbus=3D%s.0,firstport=3D%d", - def->info.alias, def->info.master.usb.startport); - else + masterbus, def->info.master.usb.startport); + } else { virBufferAsprintf(buf, ",id=3D%s", def->info.alias); + } =20 return 0; } @@ -2722,7 +2756,7 @@ qemuBuildControllerDevStr(const virDomainDef *domainD= ef, break; =20 case VIR_DOMAIN_CONTROLLER_TYPE_USB: - if (qemuBuildUSBControllerDevStr(def, qemuCaps, &buf) =3D=3D -1) + if (qemuBuildUSBControllerDevStr(domainDef, def, qemuCaps, &buf) = =3D=3D -1) goto error; =20 if (nusbcontroller) diff --git a/tests/qemuxml2argvdata/user-aliases-usb.args b/tests/qemuxml2a= rgvdata/user-aliases-usb.args new file mode 100644 index 0000000000..3dfaadc33b --- /dev/null +++ b/tests/qemuxml2argvdata/user-aliases-usb.args @@ -0,0 +1,38 @@ +LC_ALL=3DC \ +PATH=3D/bin \ +HOME=3D/home/test \ +USER=3Dtest \ +LOGNAME=3Dtest \ +QEMU_AUDIO_DRV=3Dnone \ +/usr/bin/qemu-system-x86_64 \ +-name gentoo \ +-S \ +-M pc-i440fx-1.4 \ +-m 4096 \ +-smp 4,sockets=3D4,cores=3D1,threads=3D1 \ +-uuid a75aca4b-a02f-2bcb-4a91-c93cd848c34b \ +-nographic \ +-nodefaults \ +-chardev socket,id=3Dcharmonitor,path=3D/tmp/lib/domain--1-gentoo/monitor.= sock,\ +server,nowait \ +-mon chardev=3Dcharmonitor,id=3Dmonitor,mode=3Dreadline \ +-global PIIX4_PM.disable_s3=3D0 \ +-global PIIX4_PM.disable_s4=3D0 \ +-boot cd \ +-device ich9-usb-ehci1,id=3Dua-myUSB1,bus=3Dpci.0,addr=3D0x4.0x7 \ +-device ich9-usb-uhci1,masterbus=3Dua-myUSB1.0,firstport=3D0,bus=3Dpci.0,\ +multifunction=3Don,addr=3D0x4 \ +-device ich9-usb-uhci2,masterbus=3Dua-myUSB1.0,firstport=3D2,bus=3Dpci.0,\ +addr=3D0x4.0x1 \ +-device ich9-usb-uhci3,masterbus=3Dua-myUSB1.0,firstport=3D4,bus=3Dpci.0,\ +addr=3D0x4.0x2 \ +-device ich9-usb-ehci1,id=3Dua-myUSB5,bus=3Dpci.0,addr=3D0x5.0x7 \ +-device ich9-usb-uhci1,masterbus=3Dua-myUSB5.0,firstport=3D0,bus=3Dpci.0,\ +multifunction=3Don,addr=3D0x5 \ +-device ich9-usb-uhci2,masterbus=3Dua-myUSB5.0,firstport=3D2,bus=3Dpci.0,\ +addr=3D0x5.0x1 \ +-device ich9-usb-uhci3,masterbus=3Dua-myUSB5.0,firstport=3D4,bus=3Dpci.0,\ +addr=3D0x5.0x2 \ +-device usb-host,hostbus=3D14,hostaddr=3D6,id=3Dhostdev0,bus=3Dua-myUSB1.0= ,port=3D3 \ +-device usb-host,hostbus=3D15,hostaddr=3D6,id=3Dhostdev1,bus=3Dua-myUSB5.0= ,port=3D3 \ +-device virtio-balloon-pci,id=3Dballoon0,bus=3Dpci.0,addr=3D0x3 diff --git a/tests/qemuxml2argvdata/user-aliases-usb.xml b/tests/qemuxml2ar= gvdata/user-aliases-usb.xml new file mode 100644 index 0000000000..668a9c384b --- /dev/null +++ b/tests/qemuxml2argvdata/user-aliases-usb.xml @@ -0,0 +1,78 @@ + + gentoo + a75aca4b-a02f-2bcb-4a91-c93cd848c34b + 4194304 + 4194304 + 4 + + hvm + + + + + + + + + + destroy + restart + restart + + + + + + /usr/bin/qemu-system-x86_64 + + +
+ + + + +
+ + + + +
+ + + + +
+ + + +
+ + + + +
+ + + + +
+ + + + +
+ + + +
+ +
+ + + +
+ +
+ + + diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 731db9ed52..f6a90c2814 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -2997,6 +2997,9 @@ mymain(void) QEMU_CAPS_DEVICE_ISA_SERIAL, QEMU_CAPS_HDA_DUPLEX); DO_TEST("user-aliases2", QEMU_CAPS_DEVICE_IOH3420, QEMU_CAPS_ICH9_AHCI= ); + DO_TEST("user-aliases-usb", QEMU_CAPS_KVM, + QEMU_CAPS_PIIX_DISABLE_S3, QEMU_CAPS_PIIX_DISABLE_S4, + QEMU_CAPS_ICH9_USB_EHCI1, QEMU_CAPS_PCI_MULTIFUNCTION); =20 /* Test disks with format probing enabled for legacy reasons. * New tests should not go in this section. */ --=20 2.16.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list