USB controllers can share the same 'index' which indicates, that there is some sort of master-companion relationship. Reorder the controllers in XML in to place the master controller before its companions. This is required by QEMU to not fail with error message: error: internal error: process exited while connecting to monitor: 2015-10-26T16:25:17.630265Z qemu-system-x86_64: -device ich9-usb-uhci1,masterbus=usb.0,firstport=0,bus=pci.0,multifunction=on,addr=0x6: USB bus 'usb.0' not found Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1166452 Signed-off-by: Pavel Hrdina <phrdina@xxxxxxxxxx> --- src/conf/domain_conf.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 0c559d2..3f22de2 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -13397,6 +13397,7 @@ void virDomainControllerInsertPreAlloced(virDomainDefPtr def, int idx; /* Tenatively plan to insert controller at the end. */ int insertAt = -1; + virDomainControllerDefPtr current = NULL; /* Then work backwards looking for controllers of * the same type. If we find a controller with a @@ -13404,19 +13405,29 @@ void virDomainControllerInsertPreAlloced(virDomainDefPtr def, * that position */ for (idx = (def->ncontrollers - 1); idx >= 0; idx--) { + current = def->controllers[idx]; + if (current->type == controller->type) { + if (current->idx > controller->idx) { /* If bus matches and current controller is after - * new controller, then new controller should go here */ - if (def->controllers[idx]->type == controller->type && - def->controllers[idx]->idx > controller->idx) { + * new controller, then new controller should go here + * */ insertAt = idx; - } else if (def->controllers[idx]->type == controller->type && - insertAt == -1) { + } else if (controller->info.mastertype == VIR_DOMAIN_CONTROLLER_MASTER_NONE && + current->info.mastertype != VIR_DOMAIN_CONTROLLER_MASTER_NONE && + current->idx == controller->idx) { + /* If bus matches and index matches and new controller is + * master and current isn't a master, then new controller + * should go here to be placed before its companion + */ + insertAt = idx; + } else if (insertAt == -1) { /* Last controller with match bus is before the * new controller, then put new controller just after */ insertAt = idx + 1; } } + } /* VIR_INSERT_ELEMENT_INPLACE will never return an error here. */ ignore_value(VIR_INSERT_ELEMENT_INPLACE(def->controllers, insertAt, -- 2.6.2 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list