Re: [libvirt] [PATCH V2] libxl: add default controllers for USB devices
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 --- 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
Re: [libvirt] [PATCH V2] libxl: add default controllers for USB devices
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 > --- > > 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
Re: [libvirt] [PATCH V2] libxl: add default controllers for USB devices
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 > --- > > 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
[libvirt] [PATCH V2] libxl: add default controllers for USB devices
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 --- 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