]> www.infradead.org Git - users/willy/xarray.git/commitdiff
xdp: obtain the mem_id mutex before trying to remove an entry.
authorJonathan Lemon <jonathan.lemon@gmail.com>
Tue, 3 Dec 2019 22:01:14 +0000 (14:01 -0800)
committerDavid S. Miller <davem@davemloft.net>
Thu, 5 Dec 2019 00:35:18 +0000 (16:35 -0800)
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>
net/core/xdp.c

index e334fad0a6b861deab0ffb8747905ca1f46e6a4d..7c8390ad4dc613bf67b4845c37a7ed97360dd2a7 100644 (file)
@@ -80,12 +80,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)
@@ -93,6 +89,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);
@@ -106,6 +104,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)