Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'net-hold-per-netns-rtnl-during-netdev-notifier-registration'

Kuniyuki Iwashima says:

====================
net: Hold per-netns RTNL during netdev notifier registration.

This series adds per-netns RTNL for registration of the global
and per-netns netdev notifiers.

v1: https://lore.kernel.org/netdev/20250104063735.36945-1-kuniyu@amazon.com/
====================

Link: https://patch.msgid.link/20250106070751.63146-1-kuniyu@amazon.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+29 -12
+29 -12
net/core/dev.c
··· 1769 1769 1770 1770 /* Close race with setup_net() and cleanup_net() */ 1771 1771 down_write(&pernet_ops_rwsem); 1772 + 1773 + /* When RTNL is removed, we need protection for netdev_chain. */ 1772 1774 rtnl_lock(); 1775 + 1773 1776 err = raw_notifier_chain_register(&netdev_chain, nb); 1774 1777 if (err) 1775 1778 goto unlock; 1776 1779 if (dev_boot_phase) 1777 1780 goto unlock; 1778 1781 for_each_net(net) { 1782 + __rtnl_net_lock(net); 1779 1783 err = call_netdevice_register_net_notifiers(nb, net); 1784 + __rtnl_net_unlock(net); 1780 1785 if (err) 1781 1786 goto rollback; 1782 1787 } ··· 1792 1787 return err; 1793 1788 1794 1789 rollback: 1795 - for_each_net_continue_reverse(net) 1790 + for_each_net_continue_reverse(net) { 1791 + __rtnl_net_lock(net); 1796 1792 call_netdevice_unregister_net_notifiers(nb, net); 1793 + __rtnl_net_unlock(net); 1794 + } 1797 1795 1798 1796 raw_notifier_chain_unregister(&netdev_chain, nb); 1799 1797 goto unlock; ··· 1829 1821 if (err) 1830 1822 goto unlock; 1831 1823 1832 - for_each_net(net) 1824 + for_each_net(net) { 1825 + __rtnl_net_lock(net); 1833 1826 call_netdevice_unregister_net_notifiers(nb, net); 1827 + __rtnl_net_unlock(net); 1828 + } 1834 1829 1835 1830 unlock: 1836 1831 rtnl_unlock(); ··· 1897 1886 { 1898 1887 int err; 1899 1888 1900 - rtnl_lock(); 1889 + rtnl_net_lock(net); 1901 1890 err = __register_netdevice_notifier_net(net, nb, false); 1902 - rtnl_unlock(); 1891 + rtnl_net_unlock(net); 1892 + 1903 1893 return err; 1904 1894 } 1905 1895 EXPORT_SYMBOL(register_netdevice_notifier_net); ··· 1926 1914 { 1927 1915 int err; 1928 1916 1929 - rtnl_lock(); 1917 + rtnl_net_lock(net); 1930 1918 err = __unregister_netdevice_notifier_net(net, nb); 1931 - rtnl_unlock(); 1919 + rtnl_net_unlock(net); 1920 + 1932 1921 return err; 1933 1922 } 1934 1923 EXPORT_SYMBOL(unregister_netdevice_notifier_net); ··· 1946 1933 struct notifier_block *nb, 1947 1934 struct netdev_net_notifier *nn) 1948 1935 { 1936 + struct net *net = dev_net(dev); 1949 1937 int err; 1950 1938 1951 - rtnl_lock(); 1952 - err = __register_netdevice_notifier_net(dev_net(dev), nb, false); 1939 + rtnl_net_lock(net); 1940 + err = __register_netdevice_notifier_net(net, nb, false); 1953 1941 if (!err) { 1954 1942 nn->nb = nb; 1955 1943 list_add(&nn->list, &dev->net_notifier_list); 1956 1944 } 1957 - rtnl_unlock(); 1945 + rtnl_net_unlock(net); 1946 + 1958 1947 return err; 1959 1948 } 1960 1949 EXPORT_SYMBOL(register_netdevice_notifier_dev_net); ··· 1965 1950 struct notifier_block *nb, 1966 1951 struct netdev_net_notifier *nn) 1967 1952 { 1953 + struct net *net = dev_net(dev); 1968 1954 int err; 1969 1955 1970 - rtnl_lock(); 1956 + rtnl_net_lock(net); 1971 1957 list_del(&nn->list); 1972 - err = __unregister_netdevice_notifier_net(dev_net(dev), nb); 1973 - rtnl_unlock(); 1958 + err = __unregister_netdevice_notifier_net(net, nb); 1959 + rtnl_net_unlock(net); 1960 + 1974 1961 return err; 1975 1962 } 1976 1963 EXPORT_SYMBOL(unregister_netdevice_notifier_dev_net);