From: "Chun Yan Liu" <cyliu@suse.com>
To: xen-devel@lists.xen.org, Juergen Gross <JGross@suse.com>
Cc: George.Dunlap@eu.citrix.com, ian.jackson@eu.citrix.com,
wei.liu2@citrix.com, stefano.stabellini@eu.citrix.com
Subject: Re: [PATCH v3 2/5] libxl: add new pvusb backend "qusb" provided by qemu
Date: Thu, 24 Mar 2016 20:23:24 -0600 [thread overview]
Message-ID: <56F5119C02000066000C0F24@prv-mh.provo.novell.com> (raw)
In-Reply-To: <1458735847-9448-3-git-send-email-jgross@suse.com>
>>> On 3/23/2016 at 08:24 PM, in message
<1458735847-9448-3-git-send-email-jgross@suse.com>, Juergen Gross
<jgross@suse.com> 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@suse.com>
> ---
> 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@lists.xen.org
http://lists.xen.org/xen-devel
next prev parent reply other threads:[~2016-03-25 2:23 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-03-23 12:24 [PATCH v3 0/5] libxl: add support for qemu base pvusb backend Juergen Gross
2016-03-23 12:24 ` [PATCH v3 1/5] libxl: make libxl__need_xenpv_qemu() operate on domain config Juergen Gross
2016-03-24 20:28 ` Wei Liu
2016-03-25 6:13 ` Juergen Gross
2016-03-23 12:24 ` [PATCH v3 2/5] libxl: add new pvusb backend "qusb" provided by qemu Juergen Gross
2016-03-25 2:23 ` Chun Yan Liu [this message]
[not found] ` <56F5119C02000066000C0F24@suse.com>
2016-03-25 6:29 ` Juergen Gross
2016-03-25 6:38 ` Chun Yan Liu
2016-03-23 12:24 ` [PATCH v3 3/5] libxl: add service function to check whether device model is running Juergen Gross
2016-03-24 20:28 ` Wei Liu
2016-03-23 12:24 ` [PATCH v3 4/5] libxl: check for dynamic device model start required Juergen Gross
2016-03-25 2:06 ` Chun Yan Liu
[not found] ` <56F50DC102000066000C0EF4@suse.com>
2016-03-25 6:25 ` Juergen Gross
2016-03-25 6:29 ` Chun Yan Liu
2016-03-23 12:24 ` [PATCH v3 5/5] libxl: add domain config parameter to force start of qemu Juergen Gross
2016-03-24 20:28 ` Wei Liu
2016-03-24 20:35 ` Wei Liu
2016-03-25 6:20 ` Juergen Gross
2016-03-25 6:16 ` Juergen Gross
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=56F5119C02000066000C0F24@prv-mh.provo.novell.com \
--to=cyliu@suse.com \
--cc=George.Dunlap@eu.citrix.com \
--cc=JGross@suse.com \
--cc=ian.jackson@eu.citrix.com \
--cc=stefano.stabellini@eu.citrix.com \
--cc=wei.liu2@citrix.com \
--cc=xen-devel@lists.xen.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).