Attempting to start a domain with USB hostdevs but no USB controllers
fails with the rather cryptic error
libxl: error: libxl_qmp.c:287:qmp_handle_error_response: received an
error message from QMP server: Bus 'xenusb-0.0' not found
This can be fixed by creating default USB controllers. When no USB
controllers are defined, create the number of 8 port controllers
necessary to accommodate the number of defined USB devices.
Note that USB controllers are already created as needed in the
domainAttachDevice code path. E.g. a USB controller will be created,
if necessary, when attaching a USB device with
'virsh attach-device dom usbdev.xml'.
Signed-off-by: Jim Fehlig <jfehlig@suse.com>
---
V1 here
https://www.redhat.com/archives/libvir-list/2017-April/msg00965.html
While further testing of V1 found a libvirtd segfault due to
incorrectly using virDomainControllerInsertPreAlloced instead of
virDomainControllerInsert.
src/libxl/libxl_conf.c | 82 +++++++++++++++++++++++++++++++++++++++++++-------
1 file changed, 71 insertions(+), 11 deletions(-)
diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
index 56bc09719..cdf6ec9f3 100644
--- a/src/libxl/libxl_conf.c
+++ b/src/libxl/libxl_conf.c
@@ -1822,34 +1822,94 @@ libxlMakeUSBController(virDomainControllerDefPtr controller,
}
static int
+libxlMakeDefaultUSBControllers(virDomainDefPtr def,
+ libxl_domain_config *d_config)
+{
+ virDomainControllerDefPtr l_controller = NULL;
+ libxl_device_usbctrl *x_controllers = NULL;
+ size_t nusbdevs = 0;
+ size_t ncontrollers;
+ size_t i;
+
+ for (i = 0; i < def->nhostdevs; i++) {
+ if (def->hostdevs[i]->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
+ def->hostdevs[i]->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB)
+ nusbdevs++;
+ }
+
+ /* No controllers needed if there are no USB devs */
+ if (nusbdevs == 0)
+ return 0;
+
+ /* Create USB controllers with 8 ports */
+ ncontrollers = VIR_DIV_UP(nusbdevs, 8);
+ if (VIR_ALLOC_N(x_controllers, ncontrollers) < 0)
+ return -1;
+
+ for (i = 0; i < ncontrollers; i++) {
+ if (!(l_controller = virDomainControllerDefNew(VIR_DOMAIN_CONTROLLER_TYPE_USB)))
+ goto error;
+
+ l_controller->model = VIR_DOMAIN_CONTROLLER_MODEL_USB_QUSB2;
+ l_controller->idx = i;
+ l_controller->opts.usbopts.ports = 8;
+
+ libxl_device_usbctrl_init(&x_controllers[i]);
+
+ if (libxlMakeUSBController(l_controller, &x_controllers[i]) < 0)
+ goto error;
+
+ if (virDomainControllerInsert(def, l_controller) < 0)
+ goto error;
+
+ l_controller = NULL;
+ }
+
+ d_config->usbctrls = x_controllers;
+ d_config->num_usbctrls = ncontrollers;
+ return 0;
+
+ error:
+ virDomainControllerDefFree(l_controller);
+ for (i = 0; i < ncontrollers; i++)
+ libxl_device_usbctrl_dispose(&x_controllers[i]);
+ VIR_FREE(x_controllers);
+ return -1;
+}
+
+static int
libxlMakeUSBControllerList(virDomainDefPtr def, libxl_domain_config *d_config)
{
virDomainControllerDefPtr *l_controllers = def->controllers;
size_t ncontrollers = def->ncontrollers;
size_t nusbctrls = 0;
libxl_device_usbctrl *x_usbctrls;
- size_t i;
-
- if (ncontrollers == 0)
- return 0;
-
- if (VIR_ALLOC_N(x_usbctrls, ncontrollers) < 0)
- return -1;
+ size_t i, j;
for (i = 0; i < ncontrollers; i++) {
+ if (l_controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_USB)
+ nusbctrls++;
+ }
+
+ if (nusbctrls == 0)
+ return libxlMakeDefaultUSBControllers(def, d_config);
+
+ if (VIR_ALLOC_N(x_usbctrls, nusbctrls) < 0)
+ return -1;
+
+ for (i = 0, j = 0; i < ncontrollers && j < nusbctrls; i++) {
if (l_controllers[i]->type != VIR_DOMAIN_CONTROLLER_TYPE_USB)
continue;
- libxl_device_usbctrl_init(&x_usbctrls[nusbctrls]);
+ libxl_device_usbctrl_init(&x_usbctrls[j]);
if (libxlMakeUSBController(l_controllers[i],
- &x_usbctrls[nusbctrls]) < 0)
+ &x_usbctrls[j]) < 0)
goto error;
- nusbctrls++;
+ j++;
}
- VIR_SHRINK_N(x_usbctrls, ncontrollers, ncontrollers - nusbctrls);
d_config->usbctrls = x_usbctrls;
d_config->num_usbctrls = nusbctrls;
--
2.11.0
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Anyone have a few spare minutes to review this patch? TIA! Regards, Jim Jim Fehlig wrote: > Attempting to start a domain with USB hostdevs but no USB controllers > fails with the rather cryptic error > > libxl: error: libxl_qmp.c:287:qmp_handle_error_response: received an > error message from QMP server: Bus 'xenusb-0.0' not found > > This can be fixed by creating default USB controllers. When no USB > controllers are defined, create the number of 8 port controllers > necessary to accommodate the number of defined USB devices. > > Note that USB controllers are already created as needed in the > domainAttachDevice code path. E.g. a USB controller will be created, > if necessary, when attaching a USB device with > 'virsh attach-device dom usbdev.xml'. > > Signed-off-by: Jim Fehlig <jfehlig@suse.com> > --- > > V1 here > > https://www.redhat.com/archives/libvir-list/2017-April/msg00965.html > > While further testing of V1 found a libvirtd segfault due to > incorrectly using virDomainControllerInsertPreAlloced instead of > virDomainControllerInsert. > > src/libxl/libxl_conf.c | 82 +++++++++++++++++++++++++++++++++++++++++++------- > 1 file changed, 71 insertions(+), 11 deletions(-) > > diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c > index 56bc09719..cdf6ec9f3 100644 > --- a/src/libxl/libxl_conf.c > +++ b/src/libxl/libxl_conf.c > @@ -1822,34 +1822,94 @@ libxlMakeUSBController(virDomainControllerDefPtr controller, > } > > static int > +libxlMakeDefaultUSBControllers(virDomainDefPtr def, > + libxl_domain_config *d_config) > +{ > + virDomainControllerDefPtr l_controller = NULL; > + libxl_device_usbctrl *x_controllers = NULL; > + size_t nusbdevs = 0; > + size_t ncontrollers; > + size_t i; > + > + for (i = 0; i < def->nhostdevs; i++) { > + if (def->hostdevs[i]->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS && > + def->hostdevs[i]->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB) > + nusbdevs++; > + } > + > + /* No controllers needed if there are no USB devs */ > + if (nusbdevs == 0) > + return 0; > + > + /* Create USB controllers with 8 ports */ > + ncontrollers = VIR_DIV_UP(nusbdevs, 8); > + if (VIR_ALLOC_N(x_controllers, ncontrollers) < 0) > + return -1; > + > + for (i = 0; i < ncontrollers; i++) { > + if (!(l_controller = virDomainControllerDefNew(VIR_DOMAIN_CONTROLLER_TYPE_USB))) > + goto error; > + > + l_controller->model = VIR_DOMAIN_CONTROLLER_MODEL_USB_QUSB2; > + l_controller->idx = i; > + l_controller->opts.usbopts.ports = 8; > + > + libxl_device_usbctrl_init(&x_controllers[i]); > + > + if (libxlMakeUSBController(l_controller, &x_controllers[i]) < 0) > + goto error; > + > + if (virDomainControllerInsert(def, l_controller) < 0) > + goto error; > + > + l_controller = NULL; > + } > + > + d_config->usbctrls = x_controllers; > + d_config->num_usbctrls = ncontrollers; > + return 0; > + > + error: > + virDomainControllerDefFree(l_controller); > + for (i = 0; i < ncontrollers; i++) > + libxl_device_usbctrl_dispose(&x_controllers[i]); > + VIR_FREE(x_controllers); > + return -1; > +} > + > +static int > libxlMakeUSBControllerList(virDomainDefPtr def, libxl_domain_config *d_config) > { > virDomainControllerDefPtr *l_controllers = def->controllers; > size_t ncontrollers = def->ncontrollers; > size_t nusbctrls = 0; > libxl_device_usbctrl *x_usbctrls; > - size_t i; > - > - if (ncontrollers == 0) > - return 0; > - > - if (VIR_ALLOC_N(x_usbctrls, ncontrollers) < 0) > - return -1; > + size_t i, j; > > for (i = 0; i < ncontrollers; i++) { > + if (l_controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_USB) > + nusbctrls++; > + } > + > + if (nusbctrls == 0) > + return libxlMakeDefaultUSBControllers(def, d_config); > + > + if (VIR_ALLOC_N(x_usbctrls, nusbctrls) < 0) > + return -1; > + > + for (i = 0, j = 0; i < ncontrollers && j < nusbctrls; i++) { > if (l_controllers[i]->type != VIR_DOMAIN_CONTROLLER_TYPE_USB) > continue; > > - libxl_device_usbctrl_init(&x_usbctrls[nusbctrls]); > + libxl_device_usbctrl_init(&x_usbctrls[j]); > > if (libxlMakeUSBController(l_controllers[i], > - &x_usbctrls[nusbctrls]) < 0) > + &x_usbctrls[j]) < 0) > goto error; > > - nusbctrls++; > + j++; > } > > - VIR_SHRINK_N(x_usbctrls, ncontrollers, ncontrollers - nusbctrls); > d_config->usbctrls = x_usbctrls; > d_config->num_usbctrls = nusbctrls; > -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
On Fri, 2017-05-05 at 15:48 -0600, Jim Fehlig wrote: > Attempting to start a domain with USB hostdevs but no USB controllers > fails with the rather cryptic error > > libxl: error: libxl_qmp.c:287:qmp_handle_error_response: received an > error message from QMP server: Bus 'xenusb-0.0' not found > > This can be fixed by creating default USB controllers. When no USB > controllers are defined, create the number of 8 port controllers > necessary to accommodate the number of defined USB devices. > > Note that USB controllers are already created as needed in the > domainAttachDevice code path. E.g. a USB controller will be created, > if necessary, when attaching a USB device with > 'virsh attach-device dom usbdev.xml'. > > Signed-off-by: Jim Fehlig <jfehlig@suse.com> > --- > > V1 here > > https://www.redhat.com/archives/libvir-list/2017-April/msg00965.html > > While further testing of V1 found a libvirtd segfault due to > incorrectly using virDomainControllerInsertPreAlloced instead of > virDomainControllerInsert. > > src/libxl/libxl_conf.c | 82 +++++++++++++++++++++++++++++++++++++++++++------- > 1 file changed, 71 insertions(+), 11 deletions(-) > > diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c > index 56bc09719..cdf6ec9f3 100644 > --- a/src/libxl/libxl_conf.c > +++ b/src/libxl/libxl_conf.c > @@ -1822,34 +1822,94 @@ libxlMakeUSBController(virDomainControllerDefPtr controller, > } > > static int > +libxlMakeDefaultUSBControllers(virDomainDefPtr def, > + libxl_domain_config *d_config) > +{ > + virDomainControllerDefPtr l_controller = NULL; > + libxl_device_usbctrl *x_controllers = NULL; > + size_t nusbdevs = 0; > + size_t ncontrollers; > + size_t i; > + > + for (i = 0; i < def->nhostdevs; i++) { > + if (def->hostdevs[i]->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS && > + def->hostdevs[i]->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB) > + nusbdevs++; > + } > + > + /* No controllers needed if there are no USB devs */ > + if (nusbdevs == 0) > + return 0; > + > + /* Create USB controllers with 8 ports */ > + ncontrollers = VIR_DIV_UP(nusbdevs, 8); > + if (VIR_ALLOC_N(x_controllers, ncontrollers) < 0) > + return -1; > + > + for (i = 0; i < ncontrollers; i++) { > + if (!(l_controller = virDomainControllerDefNew(VIR_DOMAIN_CONTROLLER_TYPE_USB))) > + goto error; > + > + l_controller->model = VIR_DOMAIN_CONTROLLER_MODEL_USB_QUSB2; > + l_controller->idx = i; > + l_controller->opts.usbopts.ports = 8; > + > + libxl_device_usbctrl_init(&x_controllers[i]); > + > + if (libxlMakeUSBController(l_controller, &x_controllers[i]) < 0) > + goto error; > + > + if (virDomainControllerInsert(def, l_controller) < 0) > + goto error; > + > + l_controller = NULL; > + } > + > + d_config->usbctrls = x_controllers; > + d_config->num_usbctrls = ncontrollers; > + return 0; > + > + error: > + virDomainControllerDefFree(l_controller); > + for (i = 0; i < ncontrollers; i++) > + libxl_device_usbctrl_dispose(&x_controllers[i]); > + VIR_FREE(x_controllers); > + return -1; > +} > + > +static int > libxlMakeUSBControllerList(virDomainDefPtr def, libxl_domain_config *d_config) > { > virDomainControllerDefPtr *l_controllers = def->controllers; > size_t ncontrollers = def->ncontrollers; > size_t nusbctrls = 0; > libxl_device_usbctrl *x_usbctrls; > - size_t i; > - > - if (ncontrollers == 0) > - return 0; > - > - if (VIR_ALLOC_N(x_usbctrls, ncontrollers) < 0) > - return -1; > + size_t i, j; > > for (i = 0; i < ncontrollers; i++) { > + if (l_controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_USB) > + nusbctrls++; > + } > + > + if (nusbctrls == 0) > + return libxlMakeDefaultUSBControllers(def, d_config); > + > + if (VIR_ALLOC_N(x_usbctrls, nusbctrls) < 0) > + return -1; > + > + for (i = 0, j = 0; i < ncontrollers && j < nusbctrls; i++) { > if (l_controllers[i]->type != VIR_DOMAIN_CONTROLLER_TYPE_USB) > continue; > > - libxl_device_usbctrl_init(&x_usbctrls[nusbctrls]); > + libxl_device_usbctrl_init(&x_usbctrls[j]); > > if (libxlMakeUSBController(l_controllers[i], > - &x_usbctrls[nusbctrls]) < 0) > + &x_usbctrls[j]) < 0) > goto error; > > - nusbctrls++; > + j++; > } > > - VIR_SHRINK_N(x_usbctrls, ncontrollers, ncontrollers - nusbctrls); > d_config->usbctrls = x_usbctrls; > d_config->num_usbctrls = nusbctrls; > ACK -- Cedric -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
On 05/23/2017 01:11 AM, Cedric Bosdonnat wrote: > On Fri, 2017-05-05 at 15:48 -0600, Jim Fehlig wrote: >> Attempting to start a domain with USB hostdevs but no USB controllers >> fails with the rather cryptic error >> >> libxl: error: libxl_qmp.c:287:qmp_handle_error_response: received an >> error message from QMP server: Bus 'xenusb-0.0' not found >> >> This can be fixed by creating default USB controllers. When no USB >> controllers are defined, create the number of 8 port controllers >> necessary to accommodate the number of defined USB devices. >> >> Note that USB controllers are already created as needed in the >> domainAttachDevice code path. E.g. a USB controller will be created, >> if necessary, when attaching a USB device with >> 'virsh attach-device dom usbdev.xml'. >> >> Signed-off-by: Jim Fehlig <jfehlig@suse.com> >> --- >> >> V1 here >> >> https://www.redhat.com/archives/libvir-list/2017-April/msg00965.html >> >> While further testing of V1 found a libvirtd segfault due to >> incorrectly using virDomainControllerInsertPreAlloced instead of >> virDomainControllerInsert. >> >> src/libxl/libxl_conf.c | 82 +++++++++++++++++++++++++++++++++++++++++++------- >> 1 file changed, 71 insertions(+), 11 deletions(-) >> >> diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c >> index 56bc09719..cdf6ec9f3 100644 >> --- a/src/libxl/libxl_conf.c >> +++ b/src/libxl/libxl_conf.c >> @@ -1822,34 +1822,94 @@ libxlMakeUSBController(virDomainControllerDefPtr controller, >> } >> >> static int >> +libxlMakeDefaultUSBControllers(virDomainDefPtr def, >> + libxl_domain_config *d_config) >> +{ >> + virDomainControllerDefPtr l_controller = NULL; >> + libxl_device_usbctrl *x_controllers = NULL; >> + size_t nusbdevs = 0; >> + size_t ncontrollers; >> + size_t i; >> + >> + for (i = 0; i < def->nhostdevs; i++) { >> + if (def->hostdevs[i]->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS && >> + def->hostdevs[i]->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB) >> + nusbdevs++; >> + } >> + >> + /* No controllers needed if there are no USB devs */ >> + if (nusbdevs == 0) >> + return 0; >> + >> + /* Create USB controllers with 8 ports */ >> + ncontrollers = VIR_DIV_UP(nusbdevs, 8); >> + if (VIR_ALLOC_N(x_controllers, ncontrollers) < 0) >> + return -1; >> + >> + for (i = 0; i < ncontrollers; i++) { >> + if (!(l_controller = virDomainControllerDefNew(VIR_DOMAIN_CONTROLLER_TYPE_USB))) >> + goto error; >> + >> + l_controller->model = VIR_DOMAIN_CONTROLLER_MODEL_USB_QUSB2; >> + l_controller->idx = i; >> + l_controller->opts.usbopts.ports = 8; >> + >> + libxl_device_usbctrl_init(&x_controllers[i]); >> + >> + if (libxlMakeUSBController(l_controller, &x_controllers[i]) < 0) >> + goto error; >> + >> + if (virDomainControllerInsert(def, l_controller) < 0) >> + goto error; >> + >> + l_controller = NULL; >> + } >> + >> + d_config->usbctrls = x_controllers; >> + d_config->num_usbctrls = ncontrollers; >> + return 0; >> + >> + error: >> + virDomainControllerDefFree(l_controller); >> + for (i = 0; i < ncontrollers; i++) >> + libxl_device_usbctrl_dispose(&x_controllers[i]); >> + VIR_FREE(x_controllers); >> + return -1; >> +} >> + >> +static int >> libxlMakeUSBControllerList(virDomainDefPtr def, libxl_domain_config *d_config) >> { >> virDomainControllerDefPtr *l_controllers = def->controllers; >> size_t ncontrollers = def->ncontrollers; >> size_t nusbctrls = 0; >> libxl_device_usbctrl *x_usbctrls; >> - size_t i; >> - >> - if (ncontrollers == 0) >> - return 0; >> - >> - if (VIR_ALLOC_N(x_usbctrls, ncontrollers) < 0) >> - return -1; >> + size_t i, j; >> >> for (i = 0; i < ncontrollers; i++) { >> + if (l_controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_USB) >> + nusbctrls++; >> + } >> + >> + if (nusbctrls == 0) >> + return libxlMakeDefaultUSBControllers(def, d_config); >> + >> + if (VIR_ALLOC_N(x_usbctrls, nusbctrls) < 0) >> + return -1; >> + >> + for (i = 0, j = 0; i < ncontrollers && j < nusbctrls; i++) { >> if (l_controllers[i]->type != VIR_DOMAIN_CONTROLLER_TYPE_USB) >> continue; >> >> - libxl_device_usbctrl_init(&x_usbctrls[nusbctrls]); >> + libxl_device_usbctrl_init(&x_usbctrls[j]); >> >> if (libxlMakeUSBController(l_controllers[i], >> - &x_usbctrls[nusbctrls]) < 0) >> + &x_usbctrls[j]) < 0) >> goto error; >> >> - nusbctrls++; >> + j++; >> } >> >> - VIR_SHRINK_N(x_usbctrls, ncontrollers, ncontrollers - nusbctrls); >> d_config->usbctrls = x_usbctrls; >> d_config->num_usbctrls = nusbctrls; >> > > ACK Cool, thanks for taking a look! Pushed now. Regards, Jim -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
© 2016 - 2024 Red Hat, Inc.