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 | 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