Re: [linus:master] [mm] c6307674ed: BUG:sleeping_function_called_from_invalid_context_at_mm/vmalloc.c

From: Uladzislau Rezki

Date: Wed Apr 22 2026 - 03:23:41 EST


On Wed, Apr 22, 2026 at 01:32:35PM +0800, Herbert Xu wrote:
> On Tue, Apr 21, 2026 at 02:36:26PM +0200, Uladzislau Rezki wrote:
> >
> > <snip>
> > diff --git a/lib/rhashtable.c b/lib/rhashtable.c
> > index 6074ed5f66f3..a892766dcedd 100644
> > --- a/lib/rhashtable.c
> > +++ b/lib/rhashtable.c
> > @@ -473,7 +473,7 @@ static int rhashtable_insert_rehash(struct rhashtable *ht,
> >
> > err = rhashtable_rehash_attach(ht, tbl, new_tbl);
> > if (err) {
> > - bucket_table_free(new_tbl);
> > + call_rcu(&new_tbl->rcu, bucket_table_free_rcu);
> > if (err == -EEXIST)
> > err = 0;
> > } else
> > <snip>
> >
> > Could you please check? The problem here is
> >
> > rcu_read_lock()
> > rhashtable_insert_rehash()
> > vfree();
> > rcu_read_unlokc();
> >
> > we can just defer freeing via call_rcu().
>
> I think we should fix that warning instead. The memory
> that's being freed here was just allocated in exactly the
> same context through kvmalloc with GFP_ATOMIC. I can't
> see why you're allowed to call kvmalloc but not kvfree.
>
> That makes no sense.
>
There is vfree_atomic() implementation. Regular vfree(), historically
is not supposed to be called from non-sleeping contexts:

<snip>
* Context:
* May sleep if called *not* from interrupt context.
* Must not be called in NMI context (strictly speaking, it could be
* if we have CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG, but making the calling
* conventions for vfree() arch-dependent would be a really bad idea).
*/
void vfree(const void *addr)
{
struct vm_struct *vm;
int i;

if (unlikely(in_interrupt())) {
vfree_atomic(addr);
return;
}

BUG_ON(in_nmi());
kmemleak_free(addr);
might_sleep();
<snip>

since your GFP_ATOMIC context allocated chunk of memory using vmalloc()
sense kvfree() uses vfree(). The simplest fix to free via RCU.

--
Uladzislau Rezki