Merge branch 'dev-hold-per-netns-rtnl-in-register-netdev'
Kuniyuki Iwashima says: ==================== dev: Hold per-netns RTNL in register_netdev(). Patch 1 adds rtnl_net_lock_killable() and Patch 2 uses it in register_netdev() and converts it and unregister_netdev() to per-netns RTNL. With this and the netdev notifier series [0], ASSERT_RTNL_NET() for NETDEV_REGISTER [1] wasn't fired on a simplest QEMU setup like e1000 + x86_64_defconfig + CONFIG_DEBUG_NET_SMALL_RTNL. [0]: https://lore.kernel.org/netdev/20250104063735.36945-1-kuniyu@amazon.com/ [1]: ---8<--- diff --git a/net/core/rtnl_net_debug.c b/net/core/rtnl_net_debug.c index f406045cbd0e..c0c30929002e 100644 --- a/net/core/rtnl_net_debug.c +++ b/net/core/rtnl_net_debug.c @@ -21,7 +21,6 @@ static int rtnl_net_debug_event(struct notifier_block *nb, case NETDEV_DOWN: case NETDEV_REBOOT: case NETDEV_CHANGE: - case NETDEV_REGISTER: case NETDEV_UNREGISTER: case NETDEV_CHANGEMTU: case NETDEV_CHANGEADDR: @@ -60,19 +59,10 @@ static int rtnl_net_debug_event(struct notifier_block *nb, ASSERT_RTNL(); break; - /* Once an event fully supports RTNL_NET, move it here - * and remove "if (0)" below. - * - * case NETDEV_XXX: - * ASSERT_RTNL_NET(net); - * break; - */ - } - - /* Just to avoid unused-variable error for dev and net. */ - if (0) + case NETDEV_REGISTER: ASSERT_RTNL_NET(net); + break; + } return NOTIFY_DONE; } ---8<--- ==================== Link: https://patch.msgid.link/20250104082149.48493-1-kuniyu@amazon.com Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
commit
04ced323ef
@ -102,6 +102,7 @@ void __rtnl_net_unlock(struct net *net);
|
||||
void rtnl_net_lock(struct net *net);
|
||||
void rtnl_net_unlock(struct net *net);
|
||||
int rtnl_net_trylock(struct net *net);
|
||||
int rtnl_net_lock_killable(struct net *net);
|
||||
int rtnl_net_lock_cmp_fn(const struct lockdep_map *a, const struct lockdep_map *b);
|
||||
|
||||
bool rtnl_net_is_locked(struct net *net);
|
||||
@ -138,6 +139,11 @@ static inline int rtnl_net_trylock(struct net *net)
|
||||
return rtnl_trylock();
|
||||
}
|
||||
|
||||
static inline int rtnl_net_lock_killable(struct net *net)
|
||||
{
|
||||
return rtnl_lock_killable();
|
||||
}
|
||||
|
||||
static inline void ASSERT_RTNL_NET(struct net *net)
|
||||
{
|
||||
ASSERT_RTNL();
|
||||
|
||||
@ -10731,12 +10731,16 @@ EXPORT_SYMBOL_GPL(init_dummy_netdev);
|
||||
*/
|
||||
int register_netdev(struct net_device *dev)
|
||||
{
|
||||
struct net *net = dev_net(dev);
|
||||
int err;
|
||||
|
||||
if (rtnl_lock_killable())
|
||||
if (rtnl_net_lock_killable(net))
|
||||
return -EINTR;
|
||||
|
||||
err = register_netdevice(dev);
|
||||
rtnl_unlock();
|
||||
|
||||
rtnl_net_unlock(net);
|
||||
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL(register_netdev);
|
||||
@ -11606,9 +11610,11 @@ EXPORT_SYMBOL(unregister_netdevice_many);
|
||||
*/
|
||||
void unregister_netdev(struct net_device *dev)
|
||||
{
|
||||
rtnl_lock();
|
||||
struct net *net = dev_net(dev);
|
||||
|
||||
rtnl_net_lock(net);
|
||||
unregister_netdevice(dev);
|
||||
rtnl_unlock();
|
||||
rtnl_net_unlock(net);
|
||||
}
|
||||
EXPORT_SYMBOL(unregister_netdev);
|
||||
|
||||
|
||||
@ -84,7 +84,6 @@ int rtnl_lock_killable(void)
|
||||
{
|
||||
return mutex_lock_killable(&rtnl_mutex);
|
||||
}
|
||||
EXPORT_SYMBOL(rtnl_lock_killable);
|
||||
|
||||
static struct sk_buff *defer_kfree_skb_list;
|
||||
void rtnl_kfree_skbs(struct sk_buff *head, struct sk_buff *tail)
|
||||
@ -221,6 +220,16 @@ int rtnl_net_trylock(struct net *net)
|
||||
}
|
||||
EXPORT_SYMBOL(rtnl_net_trylock);
|
||||
|
||||
int rtnl_net_lock_killable(struct net *net)
|
||||
{
|
||||
int ret = rtnl_lock_killable();
|
||||
|
||||
if (!ret)
|
||||
__rtnl_net_lock(net);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int rtnl_net_cmp_locks(const struct net *net_a, const struct net *net_b)
|
||||
{
|
||||
if (net_eq(net_a, net_b))
|
||||
|
||||
Loading…
Reference in New Issue
Block a user