[libvirt] [PATCH V2 1/4] libxl: support creating guest with USB hostdev
Joao Martins
joao.m.martins at oracle.com
Fri May 20 10:31:53 UTC 2016
On 05/19/2016 09:14 AM, Chunyan Liu wrote:
> Support creating guest with USB host device in config file.
> Currently libxl only supports xen PV guest, and only supports
> specifying USB host device by 'bus number' and 'device number',
> for example:
> <hostdev mode='subsystem' type='usb' managed='no'>
> <source>
> <address bus='1' device='3'/>
> </source>
> </hostdev>
>
> Signed-off-by: Chunyan Liu <cyliu at suse.com>
There was only a nitpick that I spotted but other than that looks good to me:
Reviewed-by: Joao Martins <joao.m.martins at oracle.com>
> ---
> Changes:
> * add LIBXL_HAVE_PVUSB check
> * address Jim's comments
>
> src/libxl/libxl_conf.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++++
> src/libxl/libxl_conf.h | 5 ++++
> src/libxl/libxl_domain.c | 16 +++++++++--
> src/libxl/libxl_driver.c | 8 +++++-
> 4 files changed, 100 insertions(+), 3 deletions(-)
>
> diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
> index c399f5c..c6c76c4 100644
> --- a/src/libxl/libxl_conf.c
> +++ b/src/libxl/libxl_conf.c
> @@ -1861,6 +1861,75 @@ int libxlDriverConfigLoadFile(libxlDriverConfigPtr cfg,
>
> }
>
> +#ifdef LIBXL_HAVE_PVUSB
> +int
> +libxlMakeUSB(virDomainHostdevDefPtr hostdev, libxl_device_usbdev *usbdev)
> +{
> + virDomainHostdevSubsysUSBPtr usbsrc = &hostdev->source.subsys.u.usb;
> +
> + if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS)
> + return -1;
> + if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB)
> + return -1;
> +
> + if (usbsrc->bus <= 0 || usbsrc->device <= 0) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> + _("libxenlight supports only USB device "
> + "specified by busnum:devnum"));
> + return -1;
> + }
> +
> + usbdev->u.hostdev.hostbus = usbsrc->bus;
> + usbdev->u.hostdev.hostaddr = usbsrc->device;
> +
> + return 0;
> +}
> +
> +static int
> +libxlMakeUSBList(virDomainDefPtr def, libxl_domain_config *d_config)
> +{
> + virDomainHostdevDefPtr *l_hostdevs = def->hostdevs;
> + size_t nhostdevs = def->nhostdevs;
> + size_t nusbdevs = 0;
> + libxl_device_usbdev *x_usbdevs;
> + size_t i, j;
> +
> + if (nhostdevs == 0)
> + return 0;
> +
> + if (VIR_ALLOC_N(x_usbdevs, nhostdevs) < 0)
> + return -1;
> +
> + for (i = 0, j = 0; i < nhostdevs; i++) {
> + if (l_hostdevs[i]->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS)
> + continue;
> + if (l_hostdevs[i]->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB)
> + continue;
> +
> + libxl_device_usbdev_init(&x_usbdevs[j]);
> +
> + if (libxlMakeUSB(l_hostdevs[i], &x_usbdevs[j]) < 0)
> + goto error;
> +
> + nusbdevs++;
> + j++;
> + }
> +
> + VIR_SHRINK_N(x_usbdevs, nhostdevs, nhostdevs - nusbdevs);
> + d_config->usbdevs = x_usbdevs;
> + d_config->num_usbdevs = nusbdevs;
> +
> + return 0;
> +
> + error:
> + for (i = 0; i < nusbdevs; i++)
> + libxl_device_usbdev_dispose(&x_usbdevs[i]);
> +
> + VIR_FREE(x_usbdevs);
> + return -1;
> +}
> +#endif
> +
> int
> libxlMakePCI(virDomainHostdevDefPtr hostdev, libxl_device_pci *pcidev)
> {
> @@ -2092,6 +2161,11 @@ libxlBuildDomainConfig(virPortAllocatorPtr graphicsports,
> if (libxlMakePCIList(def, d_config) < 0)
> return -1;
>
> +#ifdef LIBXL_HAVE_PVUSB
> + if (libxlMakeUSBList(def, d_config) < 0)
> + return -1;
> +#endif
> +
> /*
> * Now that any potential VFBs are defined, update the build info with
> * the data of the primary display. Some day libxl might implicitely do
> diff --git a/src/libxl/libxl_conf.h b/src/libxl/libxl_conf.h
> index c5b9429..df318f4 100644
> --- a/src/libxl/libxl_conf.h
> +++ b/src/libxl/libxl_conf.h
> @@ -196,6 +196,11 @@ libxlMakeVfb(virPortAllocatorPtr graphicsports,
> int
> libxlMakePCI(virDomainHostdevDefPtr hostdev, libxl_device_pci *pcidev);
>
> +#ifdef LIBXL_HAVE_PVUSB
> +int
> +libxlMakeUSB(virDomainHostdevDefPtr hostdev, libxl_device_usbdev *usbdev);
> +#endif
> +
The #ifdef and #endif aren't indented properly. In this case the code style requires
it to be "# ifdef" and "# endif" otherwise make syntax-check will fail.
> virDomainXMLOptionPtr
> libxlCreateXMLConf(void);
>
> diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c
> index 5fa1bd9..3dda34d 100644
> --- a/src/libxl/libxl_domain.c
> +++ b/src/libxl/libxl_domain.c
> @@ -726,9 +726,15 @@ libxlDomainCleanup(libxlDriverPrivatePtr driver,
> int vnc_port;
> char *file;
> virHostdevManagerPtr hostdev_mgr = driver->hostdevMgr;
> + unsigned int hostdev_flags;
> +
> + hostdev_flags = VIR_HOSTDEV_SP_PCI;
> +#ifdef LIBXL_HAVE_PVUSB
> + hostdev_flags |= VIR_HOSTDEV_SP_USB;
> +#endif
Just one suggestion: this chunk (and the ones after) could probably be made simpler
by having hostdev_flags initialized beforehand with VIR_HOSTDEV_SP_PCI instead of
having in separate:
unsigned int hostdev_flags = VIR_HOSTDEV_SP_PCI;
#ifdef LIBXL_HAVE_PVUSB
hostdev_flags |= VIR_HOSTDEV_SP_USB;
#endif
>
> virHostdevReAttachDomainDevices(hostdev_mgr, LIBXL_DRIVER_NAME,
> - vm->def, VIR_HOSTDEV_SP_PCI, NULL);
> + vm->def, hostdev_flags, NULL);
>
> VIR_FREE(priv->lockState);
> if (virDomainLockProcessPause(driver->lockManager, vm, &priv->lockState) < 0)
> @@ -1038,6 +1044,12 @@ libxlDomainStart(libxlDriverPrivatePtr driver,
> virHostdevManagerPtr hostdev_mgr = driver->hostdevMgr;
> libxl_asyncprogress_how aop_console_how;
> libxl_domain_restore_params params;
> + unsigned int hostdev_flags;
> +
> + hostdev_flags = VIR_HOSTDEV_SP_PCI;
> +#ifdef LIBXL_HAVE_PVUSB
> + hostdev_flags |= VIR_HOSTDEV_SP_USB;
> +#endif
>
> libxl_domain_config_init(&d_config);
>
> @@ -1114,7 +1126,7 @@ libxlDomainStart(libxlDriverPrivatePtr driver,
> goto cleanup_dom;
>
> if (virHostdevPrepareDomainDevices(hostdev_mgr, LIBXL_DRIVER_NAME,
> - vm->def, VIR_HOSTDEV_SP_PCI) < 0)
> + vm->def, hostdev_flags) < 0)
> goto cleanup_dom;
>
> /* Unlock virDomainObj while creating the domain */
> diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
> index 2c19ddb..960673f 100644
> --- a/src/libxl/libxl_driver.c
> +++ b/src/libxl/libxl_driver.c
> @@ -352,6 +352,12 @@ libxlReconnectDomain(virDomainObjPtr vm,
> int len;
> uint8_t *data = NULL;
> virHostdevManagerPtr hostdev_mgr = driver->hostdevMgr;
> + unsigned int hostdev_flags;
> +
> + hostdev_flags = VIR_HOSTDEV_SP_PCI;
> +#ifdef LIBXL_HAVE_PVUSB
> + hostdev_flags |= VIR_HOSTDEV_SP_USB;
> +#endif
>
> virObjectLock(vm);
>
> @@ -379,7 +385,7 @@ libxlReconnectDomain(virDomainObjPtr vm,
>
> /* Update hostdev state */
> if (virHostdevUpdateActiveDomainDevices(hostdev_mgr, LIBXL_DRIVER_NAME,
> - vm->def, VIR_HOSTDEV_SP_PCI) < 0)
> + vm->def, hostdev_flags) < 0)
> goto out;
>
> if (virAtomicIntInc(&driver->nactive) == 1 && driver->inhibitCallback)
>
More information about the libvir-list
mailing list