On 05/20/2016 02:25 PM, Jim Fehlig wrote:
On 05/20/2016 04:32 AM, Joao Martins wrote:
> On 05/19/2016 09:14 AM, Chunyan Liu wrote:
>> Support hot attach/detach a USB host device to guest.
>> Curretnly libxl only supports xen PV guest, and only
s/Curretnly/Currently/
>> supports specifying USB host device by 'bus number'
>> and 'device number'.
>>
>> For example:
>> usb.xml:
>> <hostdev mode='subsystem' type='usb'
managed='no'>
>> <source>
>> <address bus='1' device='3'/>
>> </source>
>> </hostdev>
>> #xl attach-device dom usb.xml
>> #xl detach-device dom usb.xml
>>
>> Signed-off-by: Chunyan Liu <cyliu(a)suse.com>
>> ---
>> Changes:
>> * add LIBXL_HAVE_PVUSB check
>> * fix Jim's comments
>>
>> src/libxl/libxl_driver.c | 136 ++++++++++++++++++++++++++++++++++++++++++++++-
>> 1 file changed, 135 insertions(+), 1 deletion(-)
>>
>> diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
>> index 960673f..a171efe 100644
>> --- a/src/libxl/libxl_driver.c
>> +++ b/src/libxl/libxl_driver.c
>> @@ -3028,6 +3028,56 @@ libxlDomainAttachHostPCIDevice(libxlDriverPrivatePtr
driver,
>> return ret;
>> }
>>
>> +#ifdef LIBXL_HAVE_PVUSB
>> +static int
>> +libxlDomainAttachHostUSBDevice(libxlDriverPrivatePtr driver,
>> + virDomainObjPtr vm,
>> + virDomainHostdevDefPtr hostdev)
>> +{
>> + libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver);
>> + libxl_device_usbdev usbdev;
>> + virHostdevManagerPtr hostdev_mgr = driver->hostdevMgr;
>> + int ret = -1;
>> +
>> + libxl_device_usbdev_init(&usbdev);
>> +
>> + if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS ||
>> + hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB)
>> + goto cleanup;
>> +
>> + if (VIR_REALLOC_N(vm->def->hostdevs, vm->def->nhostdevs + 1)
< 0)
>> + goto cleanup;
>> +
>> + if (virHostdevPrepareUSBDevices(hostdev_mgr, LIBXL_DRIVER_NAME,
>> + vm->def->name, &hostdev, 1, 0)
< 0)
>> + goto cleanup;
>> +
>> + if (libxlMakeUSB(hostdev, &usbdev) < 0)
>> + goto reattach;
>> +
>> + if (libxl_device_usbdev_add(cfg->ctx, vm->def->id, &usbdev, 0)
< 0) {
>> + virReportError(VIR_ERR_INTERNAL_ERROR,
>> + _("libxenlight failed to attach usb device
Busnum:%3x, Devnum:%3x"),
>> + hostdev->source.subsys.u.usb.bus,
>> + hostdev->source.subsys.u.usb.device);
>> + goto reattach;
>> + }
>> +
>> + vm->def->hostdevs[vm->def->nhostdevs++] = hostdev;
>> + ret = 0;
>> + goto cleanup;
>> +
>> + reattach:
>> + virHostdevReAttachUSBDevices(hostdev_mgr, LIBXL_DRIVER_NAME,
>> + vm->def->name, &hostdev, 1);
>> +
>> + cleanup:
>> + virObjectUnref(cfg);
>> + libxl_device_usbdev_dispose(&usbdev);
>> + return ret;
>> +}
>> +#endif
>> +
>> static int
>> libxlDomainAttachHostDevice(libxlDriverPrivatePtr driver,
>> virDomainObjPtr vm,
>> @@ -3046,6 +3096,13 @@ libxlDomainAttachHostDevice(libxlDriverPrivatePtr driver,
>> return -1;
>> break;
>>
>> +#ifdef LIBXL_HAVE_PVUSB
>> + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB:
>> + if (libxlDomainAttachHostUSBDevice(driver, vm, hostdev) < 0)
>> + return -1;
>> + break;
>> +#endif
>> +
>> default:
>> virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
>> _("hostdev subsys type '%s' not
supported"),
>> @@ -3271,7 +3328,9 @@ libxlDomainAttachDeviceConfig(virDomainDefPtr vmdef,
virDomainDeviceDefPtr dev)
>> case VIR_DOMAIN_DEVICE_HOSTDEV:
>> hostdev = dev->data.hostdev;
>>
>> - if (hostdev->source.subsys.type !=
VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI)
>> + if (hostdev->source.subsys.type !=
>> + (VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI ||
>> + VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB))
> Is this conditional correct when LIBXL_HAVE_PVUSB isn't there?
I think there are two problems here. First, (VIR_DOMAIN_DEVICE_DISK ||
VIR_DOMAIN_DEVICE_LEASE) evaluates to 1, so essentially this is equivalent to
if (hostdev->source.subsys.type != 1)
Second, I agree that we don't want to add a USB device to the config if libxl
cant support it.
Something like the below diff?
Regards,
Jim
diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
index 9001f34..5b6f87a 100644
--- a/src/libxl/libxl_driver.c
+++ b/src/libxl/libxl_driver.c
@@ -3326,10 +3326,14 @@ libxlDomainAttachDeviceConfig(virDomainDefPtr vmdef,
virDomainDeviceDefPtr dev)
case VIR_DOMAIN_DEVICE_HOSTDEV:
hostdev = dev->data.hostdev;
- if (hostdev->source.subsys.type !=
- (VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI ||
- VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB))
+ switch (hostdev->source.subsys.type) {
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI:
+#ifndef LIBXL_HAVE_PVUSB
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB:
+#endif
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST:
return -1;
+ }
if (virDomainHostdevFind(vmdef, hostdev, &found) >= 0) {
pcisrc = &hostdev->source.subsys.u.pci;
l