[pve-devel] applied: [PATCH qemu-server] use new pcie port hardware

Thomas Lamprecht t.lamprecht at proxmox.com
Thu Jul 11 19:46:47 CEST 2019


On 7/8/19 11:25 AM, Dominik Csapak wrote:
> with qemu 4.0 we can make use of the new pcie-root-ports with settings
> for the width/speed which can resolve issues with some hardware combinations
> when negioating link speed
> 
> so we add a new q35 cfg that we include with machine types >= 4.0
> to preserve live migration of machines without passthrough but q35
> 
> for details about the link speeds see:
> 
> pcie: Enhanced link speed and width support
> https://lists.gnu.org/archive/html/qemu-devel/2018-12/msg02827.html
> 
> Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
> ---
> i would like to get this into 6.0 before release, else we either cannot do this
> until qemu 4.0.1/4.1 or have some situations where live migration is not possible
> 
> an alternative would be to only do this change when we do pci(e) passthrough
> which would minimize the impact on live migration, but makes the code a bit
> more complicated
> 

applied, but I only skimmed the new config so I'd be great to get another
cross-check of it soon...

>  Makefile              |   1 +
>  PVE/QemuServer.pm     |   9 +++
>  PVE/QemuServer/USB.pm |   6 +-
>  pve-q35-4.0.cfg       | 161 ++++++++++++++++++++++++++++++++++++++++++
>  4 files changed, 172 insertions(+), 5 deletions(-)
>  create mode 100644 pve-q35-4.0.cfg
> 
> diff --git a/Makefile b/Makefile
> index 8274060..6e8fc78 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -77,6 +77,7 @@ install: ${PKGSOURCES}
>  	install -d ${DESTDIR}/usr/share/${PACKAGE}
>  	install -m 0644 pve-usb.cfg ${DESTDIR}/usr/share/${PACKAGE}
>  	install -m 0644 pve-q35.cfg ${DESTDIR}/usr/share/${PACKAGE}
> +	install -m 0644 pve-q35-4.0.cfg ${DESTDIR}/usr/share/${PACKAGE}
>  	install -m 0644 -D qm.bash-completion ${DESTDIR}/${BASHCOMPLDIR}/qm
>  	install -m 0644 -D qmrestore.bash-completion ${DESTDIR}/${BASHCOMPLDIR}/qmrestore
>  	install -m 0644 -D qm.zsh-completion ${DESTDIR}/${ZSHCOMPLDIR}/_qm
> diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
> index 5ef92a3..9f29927 100644
> --- a/PVE/QemuServer.pm
> +++ b/PVE/QemuServer.pm
> @@ -3628,6 +3628,15 @@ sub config_to_command {
>  	push @$cmd, '-drive', "if=pflash,unit=1,format=$format,id=drive-efidisk0,file=$path";
>      }
>  
> +    # load q35 config
> +    if ($q35) {
> +	# we use different pcie-port hardware for qemu >= 4.0 for passthrough
> +	if (qemu_machine_feature_enabled($machine_type, $kvmver, 4, 0)) {
> +	    push @$devices, '-readconfig', '/usr/share/qemu-server/pve-q35-4.0.cfg';
> +	} else {
> +	    push @$devices, '-readconfig', '/usr/share/qemu-server/pve-q35.cfg';
> +	}
> +    }
>  
>      # add usb controllers
>      my @usbcontrollers = PVE::QemuServer::USB::get_usb_controllers($conf, $bridges, $arch, $machine_type, $usbdesc->{format}, $MAX_USB_DEVICES);
> diff --git a/PVE/QemuServer/USB.pm b/PVE/QemuServer/USB.pm
> index 9eaaccc..a2097b9 100644
> --- a/PVE/QemuServer/USB.pm
> +++ b/PVE/QemuServer/USB.pm
> @@ -42,11 +42,7 @@ sub get_usb_controllers {
>      if ($arch eq 'aarch64') {
>          $pciaddr = print_pci_addr('ehci', $bridges, $arch, $machine);
>          push @$devices, '-device', "usb-ehci,id=ehci$pciaddr";
> -    } elsif ($machine =~ /q35/) { # FIXME: combine this and machine_type_is_q35
> -	# the q35 chipset support native usb2, so we enable usb controller
> -	# by default for this machine type
> -        push @$devices, '-readconfig', '/usr/share/qemu-server/pve-q35.cfg';
> -    } else {
> +    } elsif ($machine !~ /q35/) { # FIXME: combine this and machine_type_is_q35
>          $pciaddr = print_pci_addr("piix3", $bridges, $arch, $machine);
>          push @$devices, '-device', "piix3-usb-uhci,id=uhci$pciaddr.0x2";
>  
> diff --git a/pve-q35-4.0.cfg b/pve-q35-4.0.cfg
> new file mode 100644
> index 0000000..9a294bd
> --- /dev/null
> +++ b/pve-q35-4.0.cfg
> @@ -0,0 +1,161 @@
> +[device "ehci"]
> +  driver = "ich9-usb-ehci1"
> +  multifunction = "on"
> +  bus = "pcie.0"
> +  addr = "1d.7"
> +
> +[device "uhci-1"]
> +  driver = "ich9-usb-uhci1"
> +  multifunction = "on"
> +  bus = "pcie.0"
> +  addr = "1d.0"
> +  masterbus = "ehci.0"
> +  firstport = "0"
> +
> +[device "uhci-2"]
> +  driver = "ich9-usb-uhci2"
> +  multifunction = "on"
> +  bus = "pcie.0"
> +  addr = "1d.1"
> +  masterbus = "ehci.0"
> +  firstport = "2"
> +
> +[device "uhci-3"]
> +  driver = "ich9-usb-uhci3"
> +  multifunction = "on"
> +  bus = "pcie.0"
> +  addr = "1d.2"
> +  masterbus = "ehci.0"
> +  firstport = "4"
> +
> +[device "ehci-2"]
> +  driver = "ich9-usb-ehci2"
> +  multifunction = "on"
> +  bus = "pcie.0"
> +  addr = "1a.7"
> +
> +[device "uhci-4"]
> +  driver = "ich9-usb-uhci4"
> +  multifunction = "on"
> +  bus = "pcie.0"
> +  addr = "1a.0"
> +  masterbus = "ehci-2.0"
> +  firstport = "0"
> +
> +[device "uhci-5"]
> +  driver = "ich9-usb-uhci5"
> +  multifunction = "on"
> +  bus = "pcie.0"
> +  addr = "1a.1"
> +  masterbus = "ehci-2.0"
> +  firstport = "2"
> +
> +[device "uhci-6"]
> +  driver = "ich9-usb-uhci6"
> +  multifunction = "on"
> +  bus = "pcie.0"
> +  addr = "1a.2"
> +  masterbus = "ehci-2.0"
> +  firstport = "4"
> +
> +
> +[device "audio0"]
> +  driver = "ich9-intel-hda"
> +  bus = "pcie.0"
> +  addr = "1b.0"
> +
> +
> +[device "ich9-pcie-port-1"]
> +  driver = "pcie-root-port"
> +  x-speed = "16"
> +  x-width = "32"
> +  multifunction = "on"
> +  bus = "pcie.0"
> +  addr = "1c.0"
> +  port = "1"
> +  chassis = "1"
> +
> +[device "ich9-pcie-port-2"]
> +  driver = "pcie-root-port"
> +  x-speed = "16"
> +  x-width = "32"
> +  multifunction = "on"
> +  bus = "pcie.0"
> +  addr = "1c.1"
> +  port = "2"
> +  chassis = "2"
> +
> +[device "ich9-pcie-port-3"]
> +  driver = "pcie-root-port"
> +  x-speed = "16"
> +  x-width = "32"
> +  multifunction = "on"
> +  bus = "pcie.0"
> +  addr = "1c.2"
> +  port = "3"
> +  chassis = "3"
> +
> +[device "ich9-pcie-port-4"]
> +  driver = "pcie-root-port"
> +  x-speed = "16"
> +  x-width = "32"
> +  multifunction = "on"
> +  bus = "pcie.0"
> +  addr = "1c.3"
> +  port = "4"
> +  chassis = "4"
> +
> +##
> +# Example PCIe switch with two downstream ports
> +#
> +#[device "pcie-switch-upstream-port-1"]
> +#  driver = "x3130-upstream"
> +#  bus = "ich9-pcie-port-4"
> +#  addr = "00.0"
> +#
> +#[device "pcie-switch-downstream-port-1-1"]
> +#  driver = "xio3130-downstream"
> +#  multifunction = "on"
> +#  bus = "pcie-switch-upstream-port-1"
> +#  addr = "00.0"
> +#  port = "1"
> +#  chassis = "5"
> +#
> +#[device "pcie-switch-downstream-port-1-2"]
> +#  driver = "xio3130-downstream"
> +#  multifunction = "on"
> +#  bus = "pcie-switch-upstream-port-1"
> +#  addr = "00.1"
> +#  port = "1"
> +#  chassis = "6"
> +
> +
> +
> +[device "pcidmi"]
> +  driver = "i82801b11-bridge"
> +  bus = "pcie.0"
> +  addr = "1e.0"
> +
> +[device "pci.0"]
> +  driver = "pci-bridge"
> +  bus = "pcidmi"
> +  addr = "1.0"
> +  chassis_nr = "1"
> +
> +[device "pci.1"]
> +  driver = "pci-bridge"
> +  bus = "pcidmi"
> +  addr = "2.0"
> +  chassis_nr = "2"
> +
> +[device "pci.2"]
> +  driver = "pci-bridge"
> +  bus = "pcidmi"
> +  addr = "3.0"
> +  chassis_nr = "3"
> +
> +[device "pci.3"]
> +  driver = "pci-bridge"
> +  bus = "pcidmi"
> +  addr = "4.0"
> +  chassis_nr = "4"
> 





More information about the pve-devel mailing list