Commit 86c76c09 authored by Jonathan Lemon's avatar Jonathan Lemon Committed by David S. Miller

xdp: obtain the mem_id mutex before trying to remove an entry.

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: c3f812ce ("page_pool: do not release pool until inflight == 0.")
Reported-by: default avatarGrygorii Strashko <grygorii.strashko@ti.com>
Signed-off-by: default avatarJonathan Lemon <jonathan.lemon@gmail.com>
Tested-by: default avatarGrygorii Strashko <grygorii.strashko@ti.com>
Acked-by: default avatarJesper Dangaard Brouer <brouer@redhat.com>
Acked-by: default avatarIlias Apalodimas <ilias.apalodimas@linaro.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 95219afb
...@@ -80,12 +80,8 @@ static void mem_xa_remove(struct xdp_mem_allocator *xa) ...@@ -80,12 +80,8 @@ static void mem_xa_remove(struct xdp_mem_allocator *xa)
{ {
trace_mem_disconnect(xa); trace_mem_disconnect(xa);
mutex_lock(&mem_id_lock);
if (!rhashtable_remove_fast(mem_id_ht, &xa->node, mem_id_rht_params)) if (!rhashtable_remove_fast(mem_id_ht, &xa->node, mem_id_rht_params))
call_rcu(&xa->rcu, __xdp_mem_allocator_rcu_free); call_rcu(&xa->rcu, __xdp_mem_allocator_rcu_free);
mutex_unlock(&mem_id_lock);
} }
static void mem_allocator_disconnect(void *allocator) static void mem_allocator_disconnect(void *allocator)
...@@ -93,6 +89,8 @@ static void mem_allocator_disconnect(void *allocator) ...@@ -93,6 +89,8 @@ static void mem_allocator_disconnect(void *allocator)
struct xdp_mem_allocator *xa; struct xdp_mem_allocator *xa;
struct rhashtable_iter iter; struct rhashtable_iter iter;
mutex_lock(&mem_id_lock);
rhashtable_walk_enter(mem_id_ht, &iter); rhashtable_walk_enter(mem_id_ht, &iter);
do { do {
rhashtable_walk_start(&iter); rhashtable_walk_start(&iter);
...@@ -106,6 +104,8 @@ static void mem_allocator_disconnect(void *allocator) ...@@ -106,6 +104,8 @@ static void mem_allocator_disconnect(void *allocator)
} while (xa == ERR_PTR(-EAGAIN)); } while (xa == ERR_PTR(-EAGAIN));
rhashtable_walk_exit(&iter); rhashtable_walk_exit(&iter);
mutex_unlock(&mem_id_lock);
} }
static void mem_id_disconnect(int id) static void mem_id_disconnect(int id)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment