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 - 2026 Red Hat, Inc.