From f4ac75181e5133be157068927a4372a881acf04f Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Tue, 8 Jun 2021 19:17:27 +0200 Subject: [PATCH] 5.4-stable patches added patches: xen-pciback-redo-vf-placement-in-the-virtual-topology.patch --- queue-5.4/series | 1 + ...vf-placement-in-the-virtual-topology.patch | 82 +++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 queue-5.4/xen-pciback-redo-vf-placement-in-the-virtual-topology.patch diff --git a/queue-5.4/series b/queue-5.4/series index 601ced60540..c09620c7643 100644 --- a/queue-5.4/series +++ b/queue-5.4/series @@ -73,3 +73,4 @@ x86-kvm-teardown-pv-features-on-boot-cpu-as-well.patch x86-kvm-disable-kvmclock-on-all-cpus-on-shutdown.patch x86-kvm-disable-all-pv-features-on-crash.patch lib-lz4-explicitly-support-in-place-decompression.patch +xen-pciback-redo-vf-placement-in-the-virtual-topology.patch diff --git a/queue-5.4/xen-pciback-redo-vf-placement-in-the-virtual-topology.patch b/queue-5.4/xen-pciback-redo-vf-placement-in-the-virtual-topology.patch new file mode 100644 index 00000000000..3052ce869ac --- /dev/null +++ b/queue-5.4/xen-pciback-redo-vf-placement-in-the-virtual-topology.patch @@ -0,0 +1,82 @@ +From foo@baz Tue Jun 8 07:08:09 PM CEST 2021 +From: Jan Beulich +Date: Tue, 18 May 2021 18:13:42 +0200 +Subject: xen-pciback: redo VF placement in the virtual topology + +From: Jan Beulich + +The commit referenced below was incomplete: It merely affected what +would get written to the vdev- xenstore node. The guest would still +find the function at the original function number as long as +__xen_pcibk_get_pci_dev() wouldn't be in sync. The same goes for AER wrt +__xen_pcibk_get_pcifront_dev(). + +Undo overriding the function to zero and instead make sure that VFs at +function zero remain alone in their slot. This has the added benefit of +improving overall capacity, considering that there's only a total of 32 +slots available right now (PCI segment and bus can both only ever be +zero at present). + +This is upstream commit 4ba50e7c423c29639878c00573288869aa627068. + +Fixes: 8a5248fe10b1 ("xen PV passthru: assign SR-IOV virtual functions to +separate virtual slots") +Signed-off-by: Jan Beulich +Reviewed-by: Boris Ostrovsky +Link: https://lore.kernel.org/r/8def783b-404c-3452-196d-3f3fd4d72c9e@suse.com +Signed-off-by: Juergen Gross +Signed-off-by: Greg Kroah-Hartman +--- + drivers/xen/xen-pciback/vpci.c | 14 ++++++++------ + 1 file changed, 8 insertions(+), 6 deletions(-) + +--- a/drivers/xen/xen-pciback/vpci.c ++++ b/drivers/xen/xen-pciback/vpci.c +@@ -69,7 +69,7 @@ static int __xen_pcibk_add_pci_dev(struc + struct pci_dev *dev, int devid, + publish_pci_dev_cb publish_cb) + { +- int err = 0, slot, func = -1; ++ int err = 0, slot, func = PCI_FUNC(dev->devfn); + struct pci_dev_entry *t, *dev_entry; + struct vpci_dev_data *vpci_dev = pdev->pci_dev_data; + +@@ -94,23 +94,26 @@ static int __xen_pcibk_add_pci_dev(struc + + /* + * Keep multi-function devices together on the virtual PCI bus, except +- * virtual functions. ++ * that we want to keep virtual functions at func 0 on their own. They ++ * aren't multi-function devices and hence their presence at func 0 ++ * may cause guests to not scan the other functions. + */ +- if (!dev->is_virtfn) { ++ if (!dev->is_virtfn || func) { + for (slot = 0; slot < PCI_SLOT_MAX; slot++) { + if (list_empty(&vpci_dev->dev_list[slot])) + continue; + + t = list_entry(list_first(&vpci_dev->dev_list[slot]), + struct pci_dev_entry, list); ++ if (t->dev->is_virtfn && !PCI_FUNC(t->dev->devfn)) ++ continue; + + if (match_slot(dev, t->dev)) { + pr_info("vpci: %s: assign to virtual slot %d func %d\n", + pci_name(dev), slot, +- PCI_FUNC(dev->devfn)); ++ func); + list_add_tail(&dev_entry->list, + &vpci_dev->dev_list[slot]); +- func = PCI_FUNC(dev->devfn); + goto unlock; + } + } +@@ -123,7 +126,6 @@ static int __xen_pcibk_add_pci_dev(struc + pci_name(dev), slot); + list_add_tail(&dev_entry->list, + &vpci_dev->dev_list[slot]); +- func = dev->is_virtfn ? 0 : PCI_FUNC(dev->devfn); + goto unlock; + } + } -- 2.47.3