[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 2/5] libxl: add new pvusb backend "qusb" provided by qemu
>>> On 3/23/2016 at 08:24 PM, in message <1458735847-9448-3-git-send-email-jgross@xxxxxxxx>, Juergen Gross <jgross@xxxxxxxx> wrote: > Add a new pvusb backend type "qusb" which is provided by qemu. It can > be selected either by specifying the type directly in the configuration > or it is selected automatically by libxl in case there is no "usbback" > driver loaded. > > Signed-off-by: Juergen Gross <jgross@xxxxxxxx> > --- > docs/man/xl.cfg.pod.5 | 11 +++- > tools/libxl/libxl_device.c | 3 +- > tools/libxl/libxl_dm.c | 8 +++ > tools/libxl/libxl_internal.h | 1 + > tools/libxl/libxl_pvusb.c | 102 > +++++++++++++++++++++++++++-------- > tools/libxl/libxl_types.idl | 1 + > tools/libxl/libxl_types_internal.idl | 1 + > 7 files changed, 101 insertions(+), 26 deletions(-) > > diff --git a/docs/man/xl.cfg.pod.5 b/docs/man/xl.cfg.pod.5 > index ec739cc..a4cc1b3 100644 > --- a/docs/man/xl.cfg.pod.5 > +++ b/docs/man/xl.cfg.pod.5 > @@ -737,8 +737,15 @@ Possible B<KEY>s are: > > =item B<type=TYPE> > > -Specifies the usb controller type. Currently only 'pv' and 'auto' > -are supported. > +Specifies the usb controller type. > + > +"pv" denotes a kernel based pvusb backend. > + > +"qusb" specifies a qemu base backend for pvusb. > + > +"auto" (the default) determines whether a kernel based backend is > installed. > +If this is the case, "pv" is selected, "qusb" will be selected if no kernel > +backend is currently available. > > =item B<version=VERSION> > > diff --git a/tools/libxl/libxl_device.c b/tools/libxl/libxl_device.c > index 4ced9b6..eba3087 100644 > --- a/tools/libxl/libxl_device.c > +++ b/tools/libxl/libxl_device.c > @@ -680,7 +680,8 @@ void libxl__devices_destroy(libxl__egc *egc, > libxl__devices_remove_state *drs) > aodev->action = LIBXL__DEVICE_ACTION_REMOVE; > aodev->dev = dev; > aodev->force = drs->force; > - if (dev->backend_kind == LIBXL__DEVICE_KIND_VUSB) > + if (dev->backend_kind == LIBXL__DEVICE_KIND_VUSB || > + dev->backend_kind == LIBXL__DEVICE_KIND_QUSB) > libxl__initiate_device_usbctrl_remove(egc, aodev); > else > libxl__initiate_device_generic_remove(egc, aodev); > diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c > index 897f3f9..361e584 100644 > --- a/tools/libxl/libxl_dm.c > +++ b/tools/libxl/libxl_dm.c > @@ -2138,6 +2138,14 @@ int libxl__need_xenpv_qemu(libxl__gc *gc, > libxl_domain_config *d_config) > } > } > > + for (i = 0; i < d_config->num_usbctrls; i++) { > + if (d_config->usbctrls[i].type == LIBXL_USBCTRL_TYPE_QUSB && > + d_config->usbctrls[i].backend_domid == domid) { > + ret = 1; > + goto out; > + } > + } > + > out: > return ret; > } > diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h > index fc7bdab..2db8b1b 100644 > --- a/tools/libxl/libxl_internal.h > +++ b/tools/libxl/libxl_internal.h > @@ -487,6 +487,7 @@ typedef struct { > #define QEMU_BACKEND(dev) (\ > (dev)->backend_kind == LIBXL__DEVICE_KIND_QDISK || \ > (dev)->backend_kind == LIBXL__DEVICE_KIND_VFB || \ > + (dev)->backend_kind == LIBXL__DEVICE_KIND_QUSB || \ > (dev)->backend_kind == LIBXL__DEVICE_KIND_VKBD) > > #define XC_PCI_BDF "0x%x, 0x%x, 0x%x, 0x%x" > diff --git a/tools/libxl/libxl_pvusb.c b/tools/libxl/libxl_pvusb.c > index 5f92628..7200ead 100644 > --- a/tools/libxl/libxl_pvusb.c > +++ b/tools/libxl/libxl_pvusb.c > @@ -22,6 +22,21 @@ > > #define USBHUB_CLASS_CODE 9 > > +static int usbback_is_loaded(libxl__gc *gc) > +{ > + int r; > + struct stat st; > + > + r = lstat(SYSFS_USBBACK_DRIVER, &st); > + > + if (r == 0) > + return 1; > + if (r < 0 && errno == ENOENT) > + return 0; > + LOGE(ERROR, "Accessing %s", SYSFS_USBBACK_DRIVER); > + return -1; > +} > + > static int libxl__device_usbctrl_setdefault(libxl__gc *gc, uint32_t domid, > libxl_device_usbctrl *usbctrl) > { > @@ -36,7 +51,8 @@ static int libxl__device_usbctrl_setdefault(libxl__gc *gc, > uint32_t domid, > > if (usbctrl->type == LIBXL_USBCTRL_TYPE_AUTO) { > if (domtype == LIBXL_DOMAIN_TYPE_PV) { > - usbctrl->type = LIBXL_USBCTRL_TYPE_PV; > + usbctrl->type = usbback_is_loaded(gc) ? LIBXL_USBCTRL_TYPE_PV The condition should be (usbback_is_loaded(gc) > 0)? usbback_is_loaded(gc) < 0 means lstat error, cannot determine if the usbback driver is loaded. Otherwise, it looks good! -Chunyan > + : > LIBXL_USBCTRL_TYPE_QUSB; > } else if (domtype == LIBXL_DOMAIN_TYPE_HVM) { > /* FIXME: See if we can detect PV frontend */ > usbctrl->type = LIBXL_USBCTRL_TYPE_DEVICEMODEL; > @@ -54,7 +70,9 @@ int libxl__device_from_usbctrl(libxl__gc *gc, uint32_t > domid, > { > device->backend_devid = usbctrl->devid; > device->backend_domid = usbctrl->backend_domid; > - device->backend_kind = LIBXL__DEVICE_KIND_VUSB; > + device->backend_kind = (usbctrl->type == LIBXL_USBCTRL_TYPE_PV) > + ? LIBXL__DEVICE_KIND_VUSB > + : LIBXL__DEVICE_KIND_QUSB; > device->devid = usbctrl->devid; > device->domid = domid; > device->kind = LIBXL__DEVICE_KIND_VUSB; > @@ -64,9 +82,9 @@ int libxl__device_from_usbctrl(libxl__gc *gc, uint32_t > domid, > > /* Add usbctrl information to xenstore. > * > - * Adding a usb controller will add a new 'vusb' device in xenstore, and > - * add corresponding frontend, backend information to it. According to > - * "update_json", decide wether to update json config file. > + * Adding a usb controller will add a new 'qusb' or 'vusb' device in > xenstore, > + * and add corresponding frontend, backend information to it. According to > + * "update_json", decide whether to update json config file. > */ > static int libxl__device_usbctrl_add_xenstore(libxl__gc *gc, uint32_t > domid, > libxl_device_usbctrl > *usbctrl, > @@ -159,6 +177,18 @@ out: > return rc; > } > > +static char *pvusb_get_device_type(libxl_usbctrl_type type) > +{ > + switch (type) { > + case LIBXL_USBCTRL_TYPE_PV: > + return "vusb"; > + case LIBXL_USBCTRL_TYPE_QUSB: > + return "qusb"; > + default: > + return NULL; > + } > +} > + > /* AO operation to add a usb controller. > * > * Generally, it does: > @@ -190,7 +220,8 @@ void libxl__device_usbctrl_add(libxl__egc *egc, uint32_t > domid, > } > } > > - if (usbctrl->type != LIBXL_USBCTRL_TYPE_PV) { > + if (usbctrl->type != LIBXL_USBCTRL_TYPE_PV && > + usbctrl->type != LIBXL_USBCTRL_TYPE_QUSB) { > LOG(ERROR, "Unsupported USB controller type"); > rc = ERROR_FAIL; > goto out; > @@ -252,7 +283,8 @@ void libxl__initiate_device_usbctrl_remove(libxl__egc > *egc, > rc = libxl_device_usbctrl_getinfo(CTX, domid, &usbctrl, &usbctrlinfo); > if (rc) goto out; > > - if (usbctrlinfo.type != LIBXL_USBCTRL_TYPE_PV) { > + if (usbctrlinfo.type != LIBXL_USBCTRL_TYPE_PV && > + usbctrlinfo.type != LIBXL_USBCTRL_TYPE_QUSB) { > LOG(ERROR, "Unsupported USB controller type"); > rc = ERROR_FAIL; > goto out; > @@ -293,6 +325,7 @@ static const char *vusb_be_from_xs_fe(libxl__gc *gc, > const char *fe_path, > const char *be_path; > int r; > uint32_t be_domid, fe_domid; > + char be_type[16]; > > r = libxl__xs_read_checked(gc, XBT_NULL, GCSPRINTF("%s/backend", > fe_path), > &be_path); > @@ -300,10 +333,10 @@ static const char *vusb_be_from_xs_fe(libxl__gc *gc, > const char *fe_path, > > /* Check to see that it has the proper form, and that fe_domid == > * target domid */ > - r = sscanf(be_path, "/local/domain/%d/backend/vusb/%d", > - &be_domid, &fe_domid); > + r = sscanf(be_path, "/local/domain/%d/backend/%15[^/]/%d", > + &be_domid, be_type, &fe_domid); > > - if (r != 2 || fe_domid != tgt_domid) { > + if (r != 3 || fe_domid != tgt_domid) { > LOG(ERROR, "Malformed backend, refusing to use"); > return NULL; > } > @@ -740,8 +773,9 @@ libxl__device_usbdev_set_default_usbctrl(libxl__gc *gc, > uint32_t domid, > for (j = 0; j < usbctrls[i].ports; j++) { > const char *path, *tmp; > > - path = GCSPRINTF("%s/backend/vusb/%d/%d/port/%d", > + path = GCSPRINTF("%s/backend/%s/%d/%d/port/%d", > libxl__xs_get_dompath(gc, > LIBXL_TOOLSTACK_DOMID), > + pvusb_get_device_type(usbctrls[i].type), > domid, usbctrls[i].devid, j + 1); > rc = libxl__xs_read_checked(gc, XBT_NULL, path, &tmp); > if (rc) goto out; > @@ -883,11 +917,12 @@ out: > > /* Add usb information to xenstore > * > - * Adding a usb device won't create new 'vusb' device, but only write > + * Adding a usb device won't create new 'qusb'/'vusb' device, but only > write > * the device busid to the controller:port in xenstore. > */ > static int libxl__device_usbdev_add_xenstore(libxl__gc *gc, uint32_t domid, > libxl_device_usbdev *usbdev, > + libxl_usbctrl_type type, > bool update_json) > { > char *be_path, *busid; > @@ -931,8 +966,9 @@ static int libxl__device_usbdev_add_xenstore(libxl__gc > *gc, uint32_t domid, > if (rc) goto out; > } > > - be_path = GCSPRINTF("%s/backend/vusb/%d/%d/port/%d", > + be_path = GCSPRINTF("%s/backend/%s/%d/%d/port/%d", > libxl__xs_get_dompath(gc, > LIBXL_TOOLSTACK_DOMID), > + pvusb_get_device_type(type), > domid, usbdev->ctrl, usbdev->port); > > LOG(DEBUG, "Adding usb device %s to xenstore: controller %d, port > %d", > @@ -956,12 +992,14 @@ out: > } > > static int libxl__device_usbdev_remove_xenstore(libxl__gc *gc, uint32_t > domid, > - libxl_device_usbdev *usbdev) > + libxl_device_usbdev > *usbdev, > + libxl_usbctrl_type type) > { > char *be_path; > > - be_path = GCSPRINTF("%s/backend/vusb/%d/%d/port/%d", > + be_path = GCSPRINTF("%s/backend/%s/%d/%d/port/%d", > libxl__xs_get_dompath(gc, LIBXL_TOOLSTACK_DOMID), > + pvusb_get_device_type(type), > domid, usbdev->ctrl, usbdev->port); > > LOG(DEBUG, "Removing usb device from xenstore: controller %d, port %d", > @@ -971,12 +1009,14 @@ static int > libxl__device_usbdev_remove_xenstore(libxl__gc *gc, uint32_t domid, > } > > static char *usbdev_busid_from_ctrlport(libxl__gc *gc, uint32_t domid, > - libxl_device_usbdev *usbdev) > + libxl_device_usbdev *usbdev, > + libxl_usbctrl_type type) > { > return libxl__xs_read(gc, XBT_NULL, > - GCSPRINTF("%s/backend/vusb/%d/%d/port/%d", > + GCSPRINTF("%s/backend/%s/%d/%d/port/%d", > libxl__xs_get_dompath(gc, > LIBXL_TOOLSTACK_DOMID), > - domid, usbdev->ctrl, usbdev->port)); > + pvusb_get_device_type(type), > + domid, usbdev->ctrl, usbdev->port)); > } > > /* get original driver path of usb interface, stored in @drvpath */ > @@ -1333,15 +1373,25 @@ static int do_usbdev_add(libxl__gc *gc, uint32_t > domid, > goto out; > } > > - rc = libxl__device_usbdev_add_xenstore(gc, domid, usbdev, > update_json); > + rc = libxl__device_usbdev_add_xenstore(gc, domid, usbdev, > + LIBXL_USBCTRL_TYPE_PV, > + update_json); > if (rc) goto out; > > rc = usbback_dev_assign(gc, busid); > if (rc) { > - libxl__device_usbdev_remove_xenstore(gc, domid, usbdev); > + libxl__device_usbdev_remove_xenstore(gc, domid, usbdev, > + LIBXL_USBCTRL_TYPE_PV); > goto out; > } > break; > + case LIBXL_USBCTRL_TYPE_QUSB: > + rc = libxl__device_usbdev_add_xenstore(gc, domid, usbdev, > + LIBXL_USBCTRL_TYPE_QUSB, > + update_json); > + if (rc) goto out; > + > + break; > case LIBXL_USBCTRL_TYPE_DEVICEMODEL: > default: > LOG(ERROR, "Unsupported usb controller type"); > @@ -1458,7 +1508,7 @@ static int do_usbdev_remove(libxl__gc *gc, uint32_t > domid, > > switch (usbctrlinfo.type) { > case LIBXL_USBCTRL_TYPE_PV: > - busid = usbdev_busid_from_ctrlport(gc, domid, usbdev); > + busid = usbdev_busid_from_ctrlport(gc, domid, usbdev, > usbctrlinfo.type); > if (!busid) { > rc = ERROR_FAIL; > goto out; > @@ -1483,7 +1533,8 @@ static int do_usbdev_remove(libxl__gc *gc, uint32_t > domid, > goto out; > } > > - rc = libxl__device_usbdev_remove_xenstore(gc, domid, usbdev); > + rc = libxl__device_usbdev_remove_xenstore(gc, domid, usbdev, > + LIBXL_USBCTRL_TYPE_PV); > if (rc) { > LOG(ERROR, "Error removing device from guest." > " Try running usbdev-detach again."); > @@ -1499,6 +1550,12 @@ static int do_usbdev_remove(libxl__gc *gc, uint32_t > domid, > } > > break; > + case LIBXL_USBCTRL_TYPE_QUSB: > + rc = libxl__device_usbdev_remove_xenstore(gc, domid, usbdev, > + LIBXL_USBCTRL_TYPE_QUSB); > + if (rc) goto out; > + > + break; > case LIBXL_USBCTRL_TYPE_DEVICEMODEL: > default: > LOG(ERROR, "Unsupported usb controller type"); > @@ -1583,7 +1640,6 @@ int libxl_ctrlport_to_device_usbdev(libxl_ctx *ctx, > dompath = libxl__xs_get_dompath(gc, domid); > > fe_path = GCSPRINTF("%s/device/vusb/%d", dompath, ctrl); > - > be_path = vusb_be_from_xs_fe(gc, fe_path, domid); > if (!be_path) { > rc = ERROR_FAIL; > diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl > index 59b183c..304aa11 100644 > --- a/tools/libxl/libxl_types.idl > +++ b/tools/libxl/libxl_types.idl > @@ -618,6 +618,7 @@ libxl_usbctrl_type = Enumeration("usbctrl_type", [ > (0, "AUTO"), > (1, "PV"), > (2, "DEVICEMODEL"), > + (3, "QUSB"), > ]) > > libxl_usbdev_type = Enumeration("usbdev_type", [ > diff --git a/tools/libxl/libxl_types_internal.idl > b/tools/libxl/libxl_types_internal.idl > index 696f5f8..177f9b7 100644 > --- a/tools/libxl/libxl_types_internal.idl > +++ b/tools/libxl/libxl_types_internal.idl > @@ -23,6 +23,7 @@ libxl__device_kind = Enumeration("device_kind", [ > (7, "CONSOLE"), > (8, "VTPM"), > (9, "VUSB"), > + (10, "QUSB"), > ]) > > libxl__console_backend = Enumeration("console_backend", [ _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |