Re: [PATCH 4/4] rhashtable: fix vmalloc() deadlock in atomic rehash

From: Uladzislau Rezki

Date: Thu Oct 29 2026 - 06:17:58 EST


On Thu, Oct 29, 2026 at 10:16:36AM +0800, Herbert Xu wrote:
> On Wed, Oct 28, 2026 at 11:42:18AM -0400, Liam R. Howlett (Google) wrote:
> >
> > Below, one CPU adds an FDB entry for an RTM_NEWNEIGH netlink request,
> > while another CPU is inside vmalloc() or vfree():
> >
> > RTM_NEWNEIGH vmalloc() or vfree()
> > ============ ====================
> > spin_lock_bh(&br->hash_lock)
> > spin_lock(&vn->busy.lock)
> > rhashtable_insert_rehash()
> > kvmalloc(GFP_ATOMIC)
> > vmalloc()
> > spin_lock(&vn->busy.lock)
> > waits for the other CPU
> > softirq: a frame for the bridge
> > spin_lock(&br->hash_lock)
> > waits for RTM_NEWNEIGH
>
> I think this is a fundamental bug in the kvmalloc non-blocking
> support patch. How can it be used at all if it is susceptible
> to such dead-locks?
>
> And if you can't use it safely why don't we just get rid of the
> broken kvmalloc non-block path and have it always go to kmalloc
> like it did before?
>
If we have a look at this as we did not have vmalloc() here:


RTM_NEWNEIGH foo() or ...
============ ====================
lock_bh(&br->hash_lock)
foo()
lock(B)
rhashtable_insert_rehash()
foo()
lock(B)
waits for the other CPU
softirq: a frame for the bridge
lock(&br->hash_lock)
waits for RTM_NEWNEIGH

Same issue?

I have a question:

GFP_ATOMIC/GFP_NOWAIT guarantee they do not sleep. Do they guarantee
not hitting ABBA dead-locks or they are not interrupted?

--
Uladzislau Rezki