summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonathan Lemon <jonathan.lemon@gmail.com>2019-12-03 14:01:14 -0800
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2019-12-18 16:06:00 +0100
commit94fc256eca987332c2aada67eca47ef7c6d03dfb (patch)
tree8afae871e8c6d692e760e5dbaeaa0e8473960cee
parentbf22306d92ca59c59dc4aa3bab14768948193d56 (diff)
downloadlinux-stable-94fc256eca987332c2aada67eca47ef7c6d03dfb.tar.gz
linux-stable-94fc256eca987332c2aada67eca47ef7c6d03dfb.tar.bz2
linux-stable-94fc256eca987332c2aada67eca47ef7c6d03dfb.zip
xdp: obtain the mem_id mutex before trying to remove an entry.
[ Upstream commit 86c76c09898332143be365c702cf8d586ed4ed21 ] A lockdep splat was observed when trying to remove an xdp memory model from the table since the mutex was obtained when trying to remove the entry, but not before the table walk started: Fix the splat by obtaining the lock before starting the table walk. Fixes: c3f812cea0d7 ("page_pool: do not release pool until inflight == 0.") Reported-by: Grygorii Strashko <grygorii.strashko@ti.com> Signed-off-by: Jonathan Lemon <jonathan.lemon@gmail.com> Tested-by: Grygorii Strashko <grygorii.strashko@ti.com> Acked-by: Jesper Dangaard Brouer <brouer@redhat.com> Acked-by: Ilias Apalodimas <ilias.apalodimas@linaro.org> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--net/core/xdp.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/net/core/xdp.c b/net/core/xdp.c
index ac866ac65f2b..b3f463c6543f 100644
--- a/net/core/xdp.c
+++ b/net/core/xdp.c
@@ -85,12 +85,8 @@ static void mem_xa_remove(struct xdp_mem_allocator *xa)
{
trace_mem_disconnect(xa);
- mutex_lock(&mem_id_lock);
-
if (!rhashtable_remove_fast(mem_id_ht, &xa->node, mem_id_rht_params))
call_rcu(&xa->rcu, __xdp_mem_allocator_rcu_free);
-
- mutex_unlock(&mem_id_lock);
}
static void mem_allocator_disconnect(void *allocator)
@@ -98,6 +94,8 @@ static void mem_allocator_disconnect(void *allocator)
struct xdp_mem_allocator *xa;
struct rhashtable_iter iter;
+ mutex_lock(&mem_id_lock);
+
rhashtable_walk_enter(mem_id_ht, &iter);
do {
rhashtable_walk_start(&iter);
@@ -111,6 +109,8 @@ static void mem_allocator_disconnect(void *allocator)
} while (xa == ERR_PTR(-EAGAIN));
rhashtable_walk_exit(&iter);
+
+ mutex_unlock(&mem_id_lock);
}
static void mem_id_disconnect(int id)