# Re: \[PATCH\] netns: fix net\_alloc\_generic()

- From: Eric Dumazet \<hidden\>
- Date: 2012-01-26 10:51:54 
- List: netdev
- Page: https://ratatoskr.run/netdev/2012/01/3813866
- Thread: https://ratatoskr.run/netdev/2012/01/3813612/t.md

```text
Le jeudi 26 janvier 2012 à 14:44 +0400, Pavel Emelyanov a écrit :
> > I believe the problem is in net_namespace infrastructure, not in CAIF.
> > 
> > Could you test following patch instead ?
> > 
> > [PATCH] netns: fix net_alloc_generic()
> > 
> > When a new net namespace is created, we should attach to it a "struct
> > net_generic" with enough slots (even empty), or we can hit the following
> > BUG_ON() :
> > 
> > [  200.752016] kernel BUG at include/net/netns/generic.h:40!
> > ...
> > [  200.752016]  [<ffffffff825c3cea>] ? get_cfcnfg+0x3a/0x180
> > [  200.752016]  [<ffffffff821cf0b0>] ? lockdep_rtnl_is_held+0x10/0x20
> > [  200.752016]  [<ffffffff825c41be>] caif_device_notify+0x2e/0x530
> > [  200.752016]  [<ffffffff810d61b7>] notifier_call_chain+0x67/0x110
> > [  200.752016]  [<ffffffff810d67c1>] raw_notifier_call_chain+0x11/0x20
> > [  200.752016]  [<ffffffff821bae82>] call_netdevice_notifiers+0x32/0x60
> > [  200.752016]  [<ffffffff821c2b26>] register_netdevice+0x196/0x300
> > [  200.752016]  [<ffffffff821c2ca9>] register_netdev+0x19/0x30
> > [  200.752016]  [<ffffffff81c1c67a>] loopback_net_init+0x4a/0xa0
> > [  200.752016]  [<ffffffff821b5e62>] ops_init+0x42/0x180
> > [  200.752016]  [<ffffffff821b600b>] setup_net+0x6b/0x100
> > [  200.752016]  [<ffffffff821b6466>] copy_net_ns+0x86/0x110
> > [  200.752016]  [<ffffffff810d5789>] create_new_namespaces+0xd9/0x190
> > 
> > net_alloc_generic() should take into account the maximum index into the
> > ptr array, as a subsystem might use net_generic() anytime.
> 
> I'm not sure I understand it correctly, but subsystem can only use the
> net_generic() only (!) after the net_assign_generic() is performed.

Yes, but here, loopback_net_init() calls register_netdev()

So every subsystems _notify are called, even if subsystem _init_net()
was not yet called.

Its a chicken and egg problem.
```
