fuel-plugin-ovs/ovs_build/dpdk_2.2.0/debian/patches/ubuntu-backport-37-pci-igno...

95 lines
3.0 KiB
Diff

Description: backport of dpdk 16.04 fix for LP: #1570195
The whole infrastructure of 756ce64b1ecd eal: "introduce PCI ioport API" was
introduced post DPDK 2.2.
Old virtio is not using lib/librte_eal/linuxapp/eal/eal_pci.c:pci_map_device
New Code:
vtpci_init
First tries for modern device -> virtio_read_caps -> rte_eal_pci_map_device
This detects and returns with "Not managed by a supported kernel driver"
Then legacy_virtio_resource_init -> rte_eal_pci_ioport_mapi
This is where the original patch added the check
vtpci_init came in c52afa68 "virtio: move left PCI stuff in the right file"
Old code was eth_virtio_dev_init -> virtio_resource_init(pci_dev)
The logic of the new patch isn't too complex, just the places don't exist
yet. So we add a semantically equivalent check just before virtio_resource_init.
Additionally I added a message to make it more clear what happened:
EAL: PCI device 0000:00:04.0 on NUMA socket -1
EAL: probe driver: 1af4:1000 rte_virtio_pmd
=> PMD: device not available (in use by the kernel)
EAL: Error - exiting with code: 1
Cause: Requested device 0000:00:04.0 cannot be used
Forwarded: n/a (already upstream)
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Last-Update: 2016-04-19
From b8eb345378bdefc4c976eaaf5abb221e0aca3460 Mon Sep 17 00:00:00 2001
From: Huawei Xie <huawei.xie@intel.com>
Date: Tue, 8 Mar 2016 23:33:42 +0800
Subject: [PATCH] pci: ignore devices already managed in Linux when mapping x86
ioport
call pci_ioport_map (on x86) only if the pci device is not bound
to a kernel driver.
Signed-off-by: Huawei Xie <huawei.xie@intel.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
Acked-by: David Marchand <david.marchand@6wind.com>
---
lib/librte_eal/linuxapp/eal/eal_pci.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
Index: dpdk/drivers/net/virtio/virtio_ethdev.c
===================================================================
--- dpdk.orig/drivers/net/virtio/virtio_ethdev.c
+++ dpdk/drivers/net/virtio/virtio_ethdev.c
@@ -1219,6 +1219,34 @@ static int virtio_resource_init(struct r
}
#endif
+static int virtio_resource_available(struct rte_pci_device *pci_dev)
+{
+ int ret = -1;
+
+ /* only use virtio devices if bound on a supported or no driver
+ * backport of b8eb3453 "pci: ignore devices already managed in Linux
+ * when mapping x86"
+ * Fixes (LP #1570195) and avoids various workarounds and warnings
+ * that formerly were needed */
+ switch (pci_dev->kdrv) {
+#ifdef VFIO_PRESENT
+ case RTE_KDRV_VFIO:
+#endif
+ case RTE_KDRV_IGB_UIO:
+ case RTE_KDRV_UIO_GENERIC:
+ case RTE_KDRV_NONE:
+ ret = 1;
+ break;
+ default:
+ RTE_LOG(ERR, PMD, "device not available for DPDK"
+ " (in use by kernel)\n");
+ ret = -1;
+ break;
+ }
+
+ return ret;
+}
+
/*
* Process Virtio Config changed interrupt and call the callback
* if link state changed.
@@ -1289,6 +1317,9 @@ eth_virtio_dev_init(struct rte_eth_dev *
pci_dev = eth_dev->pci_dev;
+ if (virtio_resource_available(pci_dev) < 0)
+ return -1;
+
if (virtio_resource_init(pci_dev) < 0)
return -1;