[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH V3 4/6] xl: add pvusb commands



On 04/19/2015 05:50 AM, Chunyan Liu wrote:
Add pvusb commands: usb-ctrl-attach, usb-ctrl-detach, usb-list,
usb-attach and usb-detach.

To attach a usb device to guest through pvusb, one could follow
following example:

  #xl usb-ctrl-attach test_vm version=1 num_ports=8

  #xl usb-list test_vm
  will show the usb controllers and port usage under the domain.

  #xl usb-attach test_vm 1.6
  will find the first usable controller:port, and attach usb
  device whose bus address is 1.6 (busnum is 1, devnum is 6)
  to it. One could also specify which <controller> and which <port>.

  #xl usb-detach test_vm 1.6

  #xl usb-ctrl-detach test_vm dev_id
  will destroy the controller with specified dev_id. Dev_id
  can be traced in usb-list info.

Signed-off-by: Chunyan Liu <cyliu@xxxxxxxx>
Signed-off-by: Simon Cao <caobosimon@xxxxxxxxx>
---
Changes to v2:
   * use bus.addr as user interface instead of busid in usb-attach|detach
   * remove usb-assignable-list interface

Why? While lsusb in combination with xl usb-list for each domain will
give the same information, having to iterate through all domains can be
quite annoying.

An alternative would be to accept omitting the domain for xl usb-list
and list all domains with assigned usb devices in this case.

   * add documentation

  docs/man/xl.pod.1         |  38 ++++++++
  tools/libxl/xl.h          |   5 +
  tools/libxl/xl_cmdimpl.c  | 238 ++++++++++++++++++++++++++++++++++++++++++++++
  tools/libxl/xl_cmdtable.c |  25 +++++
  4 files changed, 306 insertions(+)

...
--- a/tools/libxl/xl_cmdimpl.c
+++ b/tools/libxl/xl_cmdimpl.c
@@ -3196,6 +3196,244 @@ int main_cd_insert(int argc, char **argv)
      return 0;
  }

+static void usbinfo_print(libxl_device_usb *usbs, int num) {
+    int i;
+    if ( usbs == NULL )

Coding style.

+         return;
+    for (i = 0; i < num; i++) {
+        libxl_usbinfo usbinfo;
+        libxl_usbinfo_init(&usbinfo);
+
+        if (usbs[i].port )

Coding style.

+            printf("  Port %d:", usbs[i].port);
+        if (!libxl_device_usb_getinfo(ctx, usbs[i].busid, &usbinfo)) {
+            printf(" Bus %03x Device %03x: ID %04x:%04x %s %s\n",
+                    usbinfo.busnum, usbinfo.devnum, usbinfo.idVendor,
+                    usbinfo.idProduct, usbinfo.manuf, usbinfo.prod);
+        }
+        libxl_usbinfo_dispose(&usbinfo);
+    }
+}
+
+int main_usbctrl_attach(int argc, char **argv)
+{
+    uint32_t domid;
+    int opt;
+    char *oparg;
+    libxl_device_usbctrl usbctrl;
+
+    SWITCH_FOREACH_OPT(opt, "", NULL, "usb-ctrl-attach", 1) {
+        /* No options */
+    }
+
+    domid = find_domain(argv[optind++]);
+
+    libxl_device_usbctrl_init(&usbctrl);
+
+    while (argc > optind) {
+        if (MATCH_OPTION("version", argv[optind], oparg)) {
+            usbctrl.version = atoi(oparg);
+        } else if (MATCH_OPTION("ports", argv[optind], oparg)) {
+            usbctrl.ports = atoi(oparg);
+        } else {
+            fprintf(stderr, "unrecognized argument `%s'\n", argv[optind]);
+            exit(-1);

I don't think this is the preferred way of error handling.
Returning with an appropriate error code would be better.

Same applies to all other uses of exit() below.

+        }
+        optind++;
+    }
+
+    if (dryrun_only) {
+       char* json = libxl_device_usbctrl_to_json(ctx, &usbctrl);
+       printf("usb controller: %s\n", json);
+       free(json);
+       libxl_device_usbctrl_dispose(&usbctrl);
+       if (ferror(stdout) || fflush(stdout)) {
+           perror("stdout");
+           exit(-1);
+       }
+       return 0;
+    }
+
+    if (libxl_device_usbctrl_add(ctx, domid, &usbctrl, 0)) {
+        fprintf(stderr, "libxl_device_usbctrl_add failed.\n");
+        exit(-1);
+    }
+    libxl_device_usbctrl_dispose(&usbctrl);
+    return 0;
+}
+
+int main_usbctrl_detach(int argc, char **argv)
+{
+    uint32_t domid;
+    int opt;
+    libxl_device_usbctrl usbctrl;
+
+    SWITCH_FOREACH_OPT(opt, "", NULL, "usb-ctrl-detach", 2) {
+        /* No options */
+    }
+
+    domid = find_domain(argv[optind]);
+
+    libxl_device_usbctrl_init(&usbctrl);
+    usbctrl.devid = atoi(argv[optind+1]);
+
+    if(libxl_device_usbctrl_remove(ctx, domid, &usbctrl, 0)) {

Coding style.

+        fprintf(stderr, "libxl_device_usbctrl_add failed.\n");
+        exit(-1);
+    }
+    libxl_device_usbctrl_dispose(&usbctrl);
+    return 0;
+
+}

Juergen


_______________________________________________
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®.