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(a)redhat.com>
---
src/conf/domain_conf.c | 33 ++++++++++++++++++++++-----------
1 file changed, 22 insertions(+), 11 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,17 +13405,27 @@ void virDomainControllerInsertPreAlloced(virDomainDefPtr def,
* that position
*/
for (idx = (def->ncontrollers - 1); idx >= 0; 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) {
- insertAt = idx;
- } else if (def->controllers[idx]->type == controller->type &&
- insertAt == -1) {
- /* Last controller with match bus is before the
- * new controller, then put new controller just after
- */
- insertAt = idx + 1;
+ 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
+ * */
+ insertAt = idx;
+ } 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;
+ }
}
}
--
2.6.2