summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDarek Stojaczyk <dariusz.stojaczyk@intel.com>2018-11-23 15:58:24 +0100
committerThomas Monjalon <thomas@monjalon.net>2018-11-25 13:27:17 +0100
commit494db286f37ddbb88cd5b9d84dd9b18d1a797e5c (patch)
tree1c085512731c859dcc60ec3cded21029fbe4d788
parentd27eed313929685fda8c7f223f897a7e7baa9f63 (diff)
downloaddpdk-494db286f37ddbb88cd5b9d84dd9b18d1a797e5c.zip
dpdk-494db286f37ddbb88cd5b9d84dd9b18d1a797e5c.tar.gz
dpdk-494db286f37ddbb88cd5b9d84dd9b18d1a797e5c.tar.xz
eal: fix multi-process hotplug if attached in secondary
Consider the following scenario: 1) primary process (A) starts, probes the bus 2) a secondary process (B) starts, probes the bus 3) yet another secondary process (C) starts 4) (C) registers the pci driver and hotplugs the device * an IPC attach req is sent to the primary (A) * (A) ignores the -EEXIST from process-local probe * (A) propagates the request to all secondary processes * (B) responds with -EEXIST * (A) replies to the original request with the -EEXIST return code * the -EEXIST is returned back to the user, although the device was successfully attached both locally and in all other processes This patch makes the primary process reply with rc=0 even if there was another secondary process with the device already attached. The primary process already didn't reply with -EEXIST when the device was attached locally, so now this behavior is even more consistent. Looking by the code, this seems to be the originally intended behavior. Fixes: ac9e4a17370f ("eal: support attach/detach shared device from secondary") Signed-off-by: Darek Stojaczyk <dariusz.stojaczyk@intel.com> Acked-by: Qi Zhang <qi.z.zhang@intel.com>
-rw-r--r--lib/librte_eal/common/hotplug_mp.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/lib/librte_eal/common/hotplug_mp.c b/lib/librte_eal/common/hotplug_mp.c
index d9e6790..ed0d7d3 100644
--- a/lib/librte_eal/common/hotplug_mp.c
+++ b/lib/librte_eal/common/hotplug_mp.c
@@ -404,13 +404,13 @@ int eal_dev_hotplug_request_to_secondary(struct eal_dev_mp_req *req)
struct eal_dev_mp_req *resp =
(struct eal_dev_mp_req *)mp_reply.msgs[i].param;
if (resp->result != 0) {
- req->result = resp->result;
if (req->t == EAL_DEV_REQ_TYPE_ATTACH &&
- req->result != -EEXIST)
- break;
+ resp->result == -EEXIST)
+ continue;
if (req->t == EAL_DEV_REQ_TYPE_DETACH &&
- req->result != -ENOENT)
- break;
+ resp->result == -ENOENT)
+ continue;
+ req->result = resp->result;
}
}