[libvirt] [PATCH V2 2/7] libxl: support USB controllers in creation time

Chunyan Liu cyliu at suse.com
Wed Jun 15 06:00:09 UTC 2016


To support USB Controller in xen guest domains, just add
USB controller in domain config xml as following:
<controller type='usb' model='qusb2' ports='4'/>

Signed-off-by: Chunyan Liu <cyliu at suse.com>
---
Changes:
  drop pvusb1 and pvusb2 models

 src/libxl/libxl_conf.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++
 src/libxl/libxl_conf.h |  4 +++
 2 files changed, 88 insertions(+)

diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
index 5989819..a7d91d3 100644
--- a/src/libxl/libxl_conf.c
+++ b/src/libxl/libxl_conf.c
@@ -1516,6 +1516,87 @@ int libxlDriverConfigLoadFile(libxlDriverConfigPtr cfg,
 
 #ifdef LIBXL_HAVE_PVUSB
 int
+libxlMakeUSBController(virDomainControllerDefPtr controller,
+                       libxl_device_usbctrl *usbctrl)
+{
+    usbctrl->devid = controller->idx;
+
+    if (controller->type != VIR_DOMAIN_CONTROLLER_TYPE_USB)
+        return -1;
+
+    if (controller->model == -1) {
+        usbctrl->version = 2;
+        usbctrl->type = LIBXL_USBCTRL_TYPE_QUSB;
+    } else {
+        switch (controller->model) {
+        case VIR_DOMAIN_CONTROLLER_MODEL_USB_QUSB1:
+            usbctrl->version = 1;
+            usbctrl->type = LIBXL_USBCTRL_TYPE_QUSB;
+            break;
+
+        case VIR_DOMAIN_CONTROLLER_MODEL_USB_QUSB2:
+            usbctrl->version = 2;
+            usbctrl->type = LIBXL_USBCTRL_TYPE_QUSB;
+            break;
+
+        default:
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                           _("unsupported usb model"));
+            return -1;
+        }
+    }
+
+    if (controller->opts.usbopts.ports == -1)
+        usbctrl->ports = 8;
+    else
+        usbctrl->ports = controller->opts.usbopts.ports;
+
+    return 0;
+}
+
+static int
+libxlMakeUSBControllerList(virDomainDefPtr def, libxl_domain_config *d_config)
+{
+    virDomainControllerDefPtr *l_controllers = def->controllers;
+    size_t ncontrollers = def->ncontrollers;
+    size_t nusbctrls = 0;
+    libxl_device_usbctrl *x_usbctrls;
+    size_t i;
+
+    if (ncontrollers == 0)
+        return 0;
+
+    if (VIR_ALLOC_N(x_usbctrls, ncontrollers) < 0)
+        return -1;
+
+    for (i = 0; i < ncontrollers; i++) {
+        if (l_controllers[i]->type != VIR_DOMAIN_CONTROLLER_TYPE_USB)
+            continue;
+
+        libxl_device_usbctrl_init(&x_usbctrls[nusbctrls]);
+
+        if (libxlMakeUSBController(l_controllers[i],
+                                   &x_usbctrls[nusbctrls]) < 0)
+            goto error;
+
+        nusbctrls++;
+    }
+
+    VIR_SHRINK_N(x_usbctrls, ncontrollers, ncontrollers - nusbctrls);
+    d_config->usbctrls = x_usbctrls;
+    d_config->num_usbctrls = nusbctrls;
+
+    return 0;
+
+ error:
+    for (i = 0; i < nusbctrls; i++)
+        libxl_device_usbctrl_dispose(&x_usbctrls[i]);
+
+    VIR_FREE(x_usbctrls);
+    return -1;
+}
+
+int
 libxlMakeUSB(virDomainHostdevDefPtr hostdev, libxl_device_usbdev *usbdev)
 {
     virDomainHostdevSubsysUSBPtr usbsrc = &hostdev->source.subsys.u.usb;
@@ -1787,6 +1868,9 @@ libxlBuildDomainConfig(virPortAllocatorPtr graphicsports,
         return -1;
 
 #ifdef LIBXL_HAVE_PVUSB
+    if (libxlMakeUSBControllerList(def, d_config) < 0)
+        return -1;
+
     if (libxlMakeUSBList(def, d_config) < 0)
         return -1;
 #endif
diff --git a/src/libxl/libxl_conf.h b/src/libxl/libxl_conf.h
index 8cb2b14..ed5a3de 100644
--- a/src/libxl/libxl_conf.h
+++ b/src/libxl/libxl_conf.h
@@ -186,6 +186,10 @@ libxlMakePCI(virDomainHostdevDefPtr hostdev, libxl_device_pci *pcidev);
 
 # ifdef LIBXL_HAVE_PVUSB
 int
+libxlMakeUSBController(virDomainControllerDefPtr controller,
+                       libxl_device_usbctrl *usbctrl);
+
+int
 libxlMakeUSB(virDomainHostdevDefPtr hostdev, libxl_device_usbdev *usbdev);
 # endif
 
-- 
2.1.4




More information about the libvir-list mailing list