From nobody Mon Feb 9 15:09:53 2026 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 Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 15048043635601013.3055395347017; Thu, 7 Sep 2017 10:12:43 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 1753381DF2; Thu, 7 Sep 2017 17:12:42 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id C637261340; Thu, 7 Sep 2017 17:12:41 +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 8F2FD1806109; Thu, 7 Sep 2017 17:12:41 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v87H0Lvc015781 for ; Thu, 7 Sep 2017 13:00:21 -0400 Received: by smtp.corp.redhat.com (Postfix) id 54A8418AC8; Thu, 7 Sep 2017 17:00:21 +0000 (UTC) Received: from inaba.usersys.redhat.com (unknown [10.43.2.219]) by smtp.corp.redhat.com (Postfix) with ESMTPS id CF22C61345 for ; Thu, 7 Sep 2017 17:00:20 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 1753381DF2 Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=libvir-list-bounces@redhat.com From: Andrea Bolognani To: libvir-list@redhat.com Date: Thu, 7 Sep 2017 19:00:12 +0200 Message-Id: <20170907170013.13474-2-abologna@redhat.com> In-Reply-To: <20170907170013.13474-1-abologna@redhat.com> References: <20170907170013.13474-1-abologna@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v2 1/2] conf: Add USB companion controllers with virDomainControllerInsert() 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.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Thu, 07 Sep 2017 17:12:42 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" virDomainDefAddController() is very convenient, but it is only passed a limited number of information about the controller. When adding USB controllers, knowing whether the controller is a master or a companion is important because it can influence the order devices show up on the QEMU command line, and ultimately whether the guest can be started at all. To make sure USB controllers will always be sorted correctly, allocate the virDomainControllerDef structure explicitly, fill in the relevant information manually and call virDomainControllerInsert() directly. Clean up both virDomainDefAddUSBController() itself and virDomainDefAddController() while at it. The behavior is not altered, as evidenced by the lack of updates to the test suite. Signed-off-by: Andrea Bolognani --- src/conf/domain_conf.c | 61 +++++++++++++++++++++++++++++++++-------------= ---- 1 file changed, 41 insertions(+), 20 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 2fc1fc340..b1b9d161c 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -16837,7 +16837,7 @@ virDomainDefAddController(virDomainDefPtr def, int = type, int idx, int model) virDomainControllerDefPtr cont; =20 if (!(cont =3D virDomainControllerDefNew(type))) - return NULL; + goto error; =20 if (idx < 0) idx =3D virDomainControllerFindUnusedIndex(def, type); @@ -16845,12 +16845,14 @@ virDomainDefAddController(virDomainDefPtr def, in= t type, int idx, int model) cont->idx =3D idx; cont->model =3D model; =20 - if (VIR_APPEND_ELEMENT_COPY(def->controllers, def->ncontrollers, cont)= < 0) { - VIR_FREE(cont); - return NULL; - } + if (VIR_APPEND_ELEMENT_COPY(def->controllers, def->ncontrollers, cont)= < 0) + goto error; =20 return cont; + + error: + virDomainControllerDefFree(cont); + return NULL; } =20 =20 @@ -16870,15 +16872,14 @@ virDomainDefAddController(virDomainDefPtr def, in= t type, int idx, int model) int virDomainDefAddUSBController(virDomainDefPtr def, int idx, int model) { - virDomainControllerDefPtr cont; /* this is a *copy* of the DefPtr */ + virDomainControllerDefPtr cont; =20 - cont =3D virDomainDefAddController(def, VIR_DOMAIN_CONTROLLER_TYPE_USB, - idx, model); - if (!cont) - return -1; + if (!(cont =3D virDomainDefAddController(def, VIR_DOMAIN_CONTROLLER_TY= PE_USB, + idx, model))) + goto error; =20 if (model !=3D VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_EHCI1) - return 0; + goto done; =20 /* When the initial controller is ich9-usb-ehci, also add the * companion controllers @@ -16886,25 +16887,45 @@ virDomainDefAddUSBController(virDomainDefPtr def,= int idx, int model) =20 idx =3D cont->idx; /* in case original request was "-1" */ =20 - if (!(cont =3D virDomainDefAddController(def, VIR_DOMAIN_CONTROLLER_TY= PE_USB, - idx, VIR_DOMAIN_CONTROLLER_MODE= L_USB_ICH9_UHCI1))) - return -1; + if (!(cont =3D virDomainControllerDefNew(VIR_DOMAIN_CONTROLLER_TYPE_US= B))) + goto error; + + cont->idx =3D idx; + cont->model =3D VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_UHCI1; cont->info.mastertype =3D VIR_DOMAIN_CONTROLLER_MASTER_USB; cont->info.master.usb.startport =3D 0; =20 - if (!(cont =3D virDomainDefAddController(def, VIR_DOMAIN_CONTROLLER_TY= PE_USB, - idx, VIR_DOMAIN_CONTROLLER_MODE= L_USB_ICH9_UHCI2))) - return -1; + if (virDomainControllerInsert(def, cont) < 0) + goto error; + + if (!(cont =3D virDomainControllerDefNew(VIR_DOMAIN_CONTROLLER_TYPE_US= B))) + goto error; + + cont->idx =3D idx; + cont->model =3D VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_UHCI2; cont->info.mastertype =3D VIR_DOMAIN_CONTROLLER_MASTER_USB; cont->info.master.usb.startport =3D 2; =20 - if (!(cont =3D virDomainDefAddController(def, VIR_DOMAIN_CONTROLLER_TY= PE_USB, - idx, VIR_DOMAIN_CONTROLLER_MODE= L_USB_ICH9_UHCI3))) - return -1; + if (virDomainControllerInsert(def, cont) < 0) + goto error; + + if (!(cont =3D virDomainControllerDefNew(VIR_DOMAIN_CONTROLLER_TYPE_US= B))) + goto error; + + cont->idx =3D idx; + cont->model =3D VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_UHCI3; cont->info.mastertype =3D VIR_DOMAIN_CONTROLLER_MASTER_USB; cont->info.master.usb.startport =3D 4; =20 + if (virDomainControllerInsert(def, cont) < 0) + goto error; + + done: return 0; + + error: + virDomainControllerDefFree(cont); + return -1; } =20 =20 --=20 2.13.5 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list