From 5a98bc5e83b1562d5b688a3d5a6dd3ee977694d2 Mon Sep 17 00:00:00 2001 From: Darek Stojaczyk Date: Fri, 29 Mar 2019 10:52:39 +0100 Subject: [PATCH] fbarray: fix attach deadlock rte_fbarray_attach() currently locks its internal spinlock, but never releases it. Secondary processes won't even start if there is more than one fbarray to be attached to - the second rte_fbarray_attach() would be just stuck. Fix it by releasing the lock at the end of rte_fbarray_attach(). I believe this was the original intention. Fixes: 5b61c62cfd76 ("fbarray: add internal tailq for mapped areas") Signed-off-by: Darek Stojaczyk Reviewed-by: Gavin Hu Acked-by: Anatoly Burakov --- lib/librte_eal/common/eal_common_fbarray.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/librte_eal/common/eal_common_fbarray.c b/lib/librte_eal/common/eal_common_fbarray.c index 0e7366e5e9..31cce80a88 100644 --- a/lib/librte_eal/common/eal_common_fbarray.c +++ b/lib/librte_eal/common/eal_common_fbarray.c @@ -859,8 +859,10 @@ rte_fbarray_attach(struct rte_fbarray *arr) } page_sz = sysconf(_SC_PAGESIZE); - if (page_sz == (size_t)-1) - goto fail; + if (page_sz == (size_t)-1) { + free(ma); + return -1; + } mmap_len = calc_data_size(page_sz, arr->elt_sz, arr->len); @@ -906,6 +908,7 @@ rte_fbarray_attach(struct rte_fbarray *arr) /* we're done */ + rte_spinlock_unlock(&mem_area_lock); return 0; fail: if (data) @@ -913,6 +916,7 @@ fail: if (fd >= 0) close(fd); free(ma); + rte_spinlock_unlock(&mem_area_lock); return -1; } -- 2.20.1