Re: [PATCH 4/4] rhashtable: fix vmalloc() deadlock in atomic rehash
From: Uladzislau Rezki
Date: Thu Nov 05 2026 - 13:50:50 EST
On Thu, Nov 05, 2026 at 04:51:39PM +0800, Herbert Xu wrote:
> On Wed, Nov 04, 2026 at 12:11:24PM +0100, Uladzislau Rezki wrote:
> >
> > There are users in kernel. For example:
>
> Thanks for the list.
>
> > drivers/GPU
> > /* Allocate the file in vmalloc memory, it's likely to be big */
> > iter.start = __vmalloc(file_size, GFP_NOWAIT);
> >
> > AMD-GPU:
> > kvzalloc(size, GFP_NOWAIT);
> > kvzalloc_objs(struct amdgpu_coredump_ring, GFP_NOWAIT);
> > kvzalloc(ring->ring_size, GFP_NOWAIT);
>
> These appear to be executing out of process context without spin
> locks so they're not really GFP_ATOMIC.
>
> > Virtio ring-testing:
> > (alloc_ring(0)), gfpflags_allow_blocking(0) does not allow blocking.
>
> I didn't really look into this as it's just test code.
>
> > net/ipv4/udp.c:
> > err = bpf_iter_udp_realloc_batch(iter, batch_sks, GFP_NOWAIT);
>
> This looks buggy in exactly the same way as rhashtable. It's
> called under spin_lock_bh, and the same lock can be taken on
> the softirq path on another CPU.
>
> So are there any safe users of kvmalloc with GFP_ATOMIC? If not
> I suggest that we change kvmalloc to disallow vmalloc when called
> with GFP_ATOMIC.
>
kvmalloc() disallow and vmalloc() allow?
The deadlock looks like from below spin_lock():
<snip>
diff --git a/net/bridge/br_fdb.c b/net/bridge/br_fdb.c
index e4570bbed854..97aac4a4a92b 100644
--- a/net/bridge/br_fdb.c
+++ b/net/bridge/br_fdb.c
@@ -1025,7 +1025,13 @@ void br_fdb_update(struct net_bridge *br, struct net_bridge_port *source,
}
}
} else {
- spin_lock(&br->hash_lock);
+ if (in_serving_softirq()) {
+ if (!spin_trylock(&br->hash_lock))
+ return;
+ } else {
+ spin_lock(&br->hash_lock);
+ }
+
fdb = fdb_create(br, source, addr, vid, flags);
if (fdb) {
trace_br_fdb_update(br, source, addr, vid, flags);
<snip>
is that applicable for bridge update code?
--
Uladzislau Rezki