[libvirt] [PATCH V2 2/7] libxl: support USB controllers in creation time
Cedric Bosdonnat
cbosdonnat at suse.com
Tue Aug 2 12:09:09 UTC 2016
On Wed, 2016-06-15 at 14:00 +0800, Chunyan Liu wrote:
> To support USB Controller in xen guest domains, just add
> USB controller in domain config xml as following:
> <controller type='usb' model='qusb2' ports='4'/>
>
> Signed-off-by: Chunyan Liu <cyliu at suse.com>
> ---
> Changes:
> drop pvusb1 and pvusb2 models
>
> src/libxl/libxl_conf.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++
> src/libxl/libxl_conf.h | 4 +++
> 2 files changed, 88 insertions(+)
>
> diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
> index 5989819..a7d91d3 100644
> --- a/src/libxl/libxl_conf.c
> +++ b/src/libxl/libxl_conf.c
> @@ -1516,6 +1516,87 @@ int libxlDriverConfigLoadFile(libxlDriverConfigPtr cfg,
>
> #ifdef LIBXL_HAVE_PVUSB
> int
> +libxlMakeUSBController(virDomainControllerDefPtr controller,
> + libxl_device_usbctrl *usbctrl)
> +{
> + usbctrl->devid = controller->idx;
> +
> + if (controller->type != VIR_DOMAIN_CONTROLLER_TYPE_USB)
> + return -1;
> +
> + if (controller->model == -1) {
> + usbctrl->version = 2;
> + usbctrl->type = LIBXL_USBCTRL_TYPE_QUSB;
> + } else {
> + switch (controller->model) {
> + case VIR_DOMAIN_CONTROLLER_MODEL_USB_QUSB1:
> + usbctrl->version = 1;
> + usbctrl->type = LIBXL_USBCTRL_TYPE_QUSB;
> + break;
> +
> + case VIR_DOMAIN_CONTROLLER_MODEL_USB_QUSB2:
> + usbctrl->version = 2;
> + usbctrl->type = LIBXL_USBCTRL_TYPE_QUSB;
> + break;
> +
> + default:
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> + _("unsupported usb model"));
> + return -1;
> + }
> + }
> +
> + if (controller->opts.usbopts.ports == -1)
> + usbctrl->ports = 8;
> + else
> + usbctrl->ports = controller->opts.usbopts.ports;
> +
> + return 0;
> +}
> +
> +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;
> +
> + for (i = 0; i < ncontrollers; i++) {
> + if (l_controllers[i]->type != VIR_DOMAIN_CONTROLLER_TYPE_USB)
> + continue;
> +
> + libxl_device_usbctrl_init(&x_usbctrls[nusbctrls]);
> +
> + if (libxlMakeUSBController(l_controllers[i],
> + &x_usbctrls[nusbctrls]) < 0)
> + goto error;
> +
> + nusbctrls++;
> + }
> +
> + VIR_SHRINK_N(x_usbctrls, ncontrollers, ncontrollers - nusbctrls);
> + d_config->usbctrls = x_usbctrls;
> + d_config->num_usbctrls = nusbctrls;
> +
> + return 0;
> +
> + error:
> + for (i = 0; i < nusbctrls; i++)
> + libxl_device_usbctrl_dispose(&x_usbctrls[i]);
> +
> + VIR_FREE(x_usbctrls);
> + return -1;
> +}
> +
> +int
> libxlMakeUSB(virDomainHostdevDefPtr hostdev, libxl_device_usbdev *usbdev)
> {
> virDomainHostdevSubsysUSBPtr usbsrc = &hostdev->source.subsys.u.usb;
> @@ -1787,6 +1868,9 @@ libxlBuildDomainConfig(virPortAllocatorPtr graphicsports,
> return -1;
>
> #ifdef LIBXL_HAVE_PVUSB
> + if (libxlMakeUSBControllerList(def, d_config) < 0)
> + return -1;
> +
> if (libxlMakeUSBList(def, d_config) < 0)
> return -1;
> #endif
> diff --git a/src/libxl/libxl_conf.h b/src/libxl/libxl_conf.h
> index 8cb2b14..ed5a3de 100644
> --- a/src/libxl/libxl_conf.h
> +++ b/src/libxl/libxl_conf.h
> @@ -186,6 +186,10 @@ libxlMakePCI(virDomainHostdevDefPtr hostdev, libxl_device_pci *pcidev);
>
> # ifdef LIBXL_HAVE_PVUSB
> int
> +libxlMakeUSBController(virDomainControllerDefPtr controller,
> + libxl_device_usbctrl *usbctrl);
> +
> +int
> libxlMakeUSB(virDomainHostdevDefPtr hostdev, libxl_device_usbdev *usbdev);
> # endif
>
ACK and pushed
--
Cedric
More information about the libvir-list
mailing list