[pve-devel] [PATCH v3 qemu-server 1/3] Add USB3 capablities to Spice USB devices

Aaron Lauterer a.lauterer at proxmox.com
Tue Sep 10 12:04:31 CEST 2019



On 9/10/19 10:46 AM, Thomas Lamprecht wrote:
> On 06.09.19 15:26, Aaron Lauterer wrote:
>> To not change current behaviour and thus breaking live migration USB3
>> for a Spice USB device requires Qemu v4.1.
>>
>> The old behavior was that even though technically it was possible to
>> the set `usb3=1` setting, it was ignored. The bus was hardcoded to
>> ehci. If another USB2 device was added or the machine type was set to
>> Q35 an ehci controller was present and the VM was able to boot.
>>
>> With this patch the behaviour is changing and the bus is set to xhci if
>> USB3 is set for the Spice USB device and the VM is running under Qemu
>> v4.1.
>>
>> Signed-off-by: Aaron Lauterer <a.lauterer at proxmox.com>
>> ---
>>
>> I use the `qemu_machine_feature_enabled` function from QemuServer.pm to
>> check against Qemu v4.1
>>
>>
>>   PVE/QemuServer.pm     |  2 +-
>>   PVE/QemuServer/USB.pm | 10 +++++++---
>>   2 files changed, 8 insertions(+), 4 deletions(-)
>>
>> diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
>> index a424720..0489b27 100644
>> --- a/PVE/QemuServer.pm
>> +++ b/PVE/QemuServer.pm
>> @@ -3830,7 +3830,7 @@ sub config_to_command {
>>       }
>>   
>>       # usb devices
>> -    my @usbdevices = PVE::QemuServer::USB::get_usb_devices($conf, $usbdesc->{format}, $MAX_USB_DEVICES);
>> +    my @usbdevices = PVE::QemuServer::USB::get_usb_devices($conf, $usbdesc->{format}, $MAX_USB_DEVICES, $machine_type, $kvmver);
>>       push @$devices, @usbdevices if @usbdevices;
>>       # serial devices
>>       for (my $i = 0; $i < $MAX_SERIAL_PORTS; $i++)  {
>> diff --git a/PVE/QemuServer/USB.pm b/PVE/QemuServer/USB.pm
>> index a2097b9..af24636 100644
>> --- a/PVE/QemuServer/USB.pm
>> +++ b/PVE/QemuServer/USB.pm
>> @@ -3,6 +3,7 @@ package PVE::QemuServer::USB;
>>   use strict;
>>   use warnings;
>>   use PVE::QemuServer::PCI qw(print_pci_addr);
>> +use PVE::QemuServer;
> 
> this adds a cyclic module dependency:
> 
> PVE::QemuServer -> QemuServer::USB -> PVE::QemuServer
> 
> While it's intra-package, and thus not as harmful as cross package, I'd still
> like to avoid that if anyhow possible..

Yeah, that was one of the things where I wasn't sure if it would fly.
> 
>>   use PVE::JSONSchema;
>>   use base 'Exporter';
>>   
>> @@ -74,7 +75,7 @@ sub get_usb_controllers {
>>   }
>>   
>>   sub get_usb_devices {
>> -    my ($conf, $format, $max_usb_devices) = @_;
>> +    my ($conf, $format, $max_usb_devices, $machine, $kvmver) = @_;
> 
> instead off adding those two you could also just add a single feature flag?
> Maybe a hash? alà
> 
> my ($conf, $format, $max_usb_devices, $features) = @_;
> 
> where $features includes a "spice_usb3 => 1" entry if it should be used?
> as an idea..

I will move the qemu_machine_feature_check to the QemuServer.pm and try 
something like this.

> 
>>   
>>       my $devices = [];
>>   
>> @@ -87,9 +88,12 @@ sub get_usb_devices {
>>   	    my $hostdevice = parse_usb_device($d->{host});
>>   	    $hostdevice->{usb3} = $d->{usb3};
>>   	    if (defined($hostdevice->{spice}) && $hostdevice->{spice}) {
> 
> while you do not touch above, it's still redundant,
> if ($hostdevice->{spice})
> would be enough...

Should I clean this up with the next version? Maybe as a separate commit?

> 
>> -		# usb redir support for spice, currently no usb3
>> +		# usb redir support for spice
>> +		my $bus = 'ehci';
>> +		$bus = 'xhci' if $hostdevice->{usb3} && PVE::QemuServer::qemu_machine_feature_enabled($machine, $kvmver, 4, 1);
>> +
>>   		push @$devices, '-chardev', "spicevmc,id=usbredirchardev$i,name=usbredir";
>> -		push @$devices, '-device', "usb-redir,chardev=usbredirchardev$i,id=usbredirdev$i,bus=ehci.0";
>> +		push @$devices, '-device', "usb-redir,chardev=usbredirchardev$i,id=usbredirdev$i,bus=$bus.0";
>>   	    } else {
>>   		push @$devices, '-device', print_usbdevice_full($conf, "usb$i", $hostdevice);
>>   	    }
>>
> 
> 




More information about the pve-devel mailing list