mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-15 00:04:15 +08:00
xdp: obtain the mem_id mutex before trying to remove an entry.
[ Upstream commit86c76c0989
] 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:c3f812cea0
("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>
This commit is contained in:
parent
05f646cb21
commit
9bd01a33c7
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user