[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

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.