Subject: Re: [PATCH net v1] net/ipv6: mcast: fix circular locking dependency in __ipv6_dev_mc_inc()

From: Jakub Kicinski <[email-masked]>
Date: Wed, 18 Mar 2026 20:26:49 -0700

On Thu, 19 Mar 2026 11:04:24 +0800 Jiayuan Chen wrote:
> >> Split mca_alloc() into mca_alloc() + mca_init(): mca_alloc() does the
> >> GFP_KERNEL allocation before mc_lock, mca_init() initializes under
> >> mc_lock. If the address already exists, the pre-allocated memory is
> >> simply freed. Also move inet6_ifmcaddr_notify() outside mc_lock since
> >> it also does GFP_KERNEL allocation.  
> > Moving the allocation seems fine, but also having to move the
> > notification, potentially letting the notification go out of order
> > makes me wonder if we aren't better off adding helpers for taking this
> > lock which also call memalloc_noio_{save,restore} ?  
> Yeah, using memalloc_noio helpers is simpler. I checked and there
> are about 18 places taking mc_lock, so having a common mc_lock()/mc_unlock()
> wrapper that does the noio save/restore covers them all (if necessary).
> 
> The only thing that feels a bit odd is using memalloc_noio in the networking
> subsystem. It makes sense in block/fs to protect itself from recursion.

Totally agree that it feels a bit odd that we have to worry about IO,
but unless we can figure out a way to prevent nbd sockets from getting
here all our solutions are dealing with noio in networking code :(
IMHO it's better to acknowledge this with the explicit memalloc_noio 
so future developers don't break things again with a mis-placed
allocation.