summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaslan Darawsheh <rasland@mellanox.com>2017-10-20 00:15:00 +0300
committerFerruh Yigit <ferruh.yigit@intel.com>2017-10-26 02:33:01 +0200
commitb8f4fa4103eaaf082d42ad85f01b1a08e74b89d6 (patch)
treeac8542efa01849c78be7a66b024e0e4154b333a3
parent5697a4142107ae1bc69ec13699d146b157d06652 (diff)
downloaddpdk-next-eventdev-b8f4fa4103eaaf082d42ad85f01b1a08e74b89d6.zip
dpdk-next-eventdev-b8f4fa4103eaaf082d42ad85f01b1a08e74b89d6.tar.gz
dpdk-next-eventdev-b8f4fa4103eaaf082d42ad85f01b1a08e74b89d6.tar.xz
net/failsafe: fix PCI devices init
When trying to attach a port as a sub-device, the ethdev port was compared with devargs. In the case of a PCI device, the name in devargs is the PCI address. And since DPDK 17.08, the devargs name of the underlying device was used to match an ethdev port: a1e7c17555e8 ("ethdev: use device name from device structure") But the recent commit 72e3efb149cc has reverted this wrong matching to use the ethdev port name as identifier of the port. It impacts functions like rte_eth_dev_allocated() used in failsafe for matching ports with given devargs. The fix is to search for matching devargs in underlying device of all ethdev ports. If many ports match the same PCI device, only the first one is matched. This limitation was already present in previous implementation of rte_eth_dev_allocated(), and must be adressed later with a better devargs syntax. Fixes: 72e3efb149cc ("ethdev: revert use port name from device structure") Cc: stable@dpdk.org Signed-off-by: Raslan Darawsheh <rasland@mellanox.com> Acked-by: Gaetan Rivet <gaetan.rivet@6wind.com>
-rw-r--r--drivers/net/failsafe/failsafe_eal.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/drivers/net/failsafe/failsafe_eal.c b/drivers/net/failsafe/failsafe_eal.c
index aeb87a0..19d26f5 100644
--- a/drivers/net/failsafe/failsafe_eal.c
+++ b/drivers/net/failsafe/failsafe_eal.c
@@ -41,6 +41,7 @@ fs_bus_init(struct rte_eth_dev *dev)
struct sub_device *sdev;
struct rte_devargs *da;
uint8_t i;
+ uint16_t j;
int ret;
FOREACH_SUBDEV(sdev, i, dev) {
@@ -57,7 +58,13 @@ fs_bus_init(struct rte_eth_dev *dev)
rte_errno ? ")" : "");
continue;
}
- ETH(sdev) = rte_eth_dev_allocated(da->name);
+ RTE_ETH_FOREACH_DEV(j) {
+ if (strcmp(rte_eth_devices[j].device->name,
+ da->name) == 0) {
+ ETH(sdev) = &rte_eth_devices[j];
+ break;
+ }
+ }
if (ETH(sdev) == NULL) {
ERROR("sub_device %d init went wrong", i);
return -ENODEV;