@@ -1135,8 +1135,8 @@ static int team_port_add(struct team *team, struct net_device *port_dev,
1135
1135
struct netlink_ext_ack * extack )
1136
1136
{
1137
1137
struct net_device * dev = team -> dev ;
1138
- char * portname = port_dev -> name ;
1139
1138
struct team_port * port ;
1139
+ char * portname = port_dev -> name ;
1140
1140
int err ;
1141
1141
1142
1142
if (port_dev -> flags & IFF_LOOPBACK ) {
@@ -1203,31 +1203,18 @@ static int team_port_add(struct team *team, struct net_device *port_dev,
1203
1203
1204
1204
memcpy (port -> orig .dev_addr , port_dev -> dev_addr , port_dev -> addr_len );
1205
1205
1206
- err = dev_open (port_dev , extack );
1207
- if (err ) {
1208
- netdev_dbg (dev , "Device %s opening failed\n" ,
1209
- portname );
1210
- goto err_dev_open ;
1211
- }
1212
-
1213
- err = team_upper_dev_link (team , port , extack );
1206
+ err = team_port_enter (team , port );
1214
1207
if (err ) {
1215
- netdev_err (dev , "Device %s failed to set upper link \n" ,
1208
+ netdev_err (dev , "Device %s failed to enter team mode \n" ,
1216
1209
portname );
1217
- goto err_set_upper_link ;
1210
+ goto err_port_enter ;
1218
1211
}
1219
1212
1220
- /* lockdep subclass variable(dev->nested_level) was updated by
1221
- * team_upper_dev_link().
1222
- */
1223
- team_unlock (team );
1224
- team_lock (team );
1225
-
1226
- err = team_port_enter (team , port );
1213
+ err = dev_open (port_dev , extack );
1227
1214
if (err ) {
1228
- netdev_err (dev , "Device %s failed to enter team mode \n" ,
1215
+ netdev_dbg (dev , "Device %s opening failed \n" ,
1229
1216
portname );
1230
- goto err_port_enter ;
1217
+ goto err_dev_open ;
1231
1218
}
1232
1219
1233
1220
err = vlan_vids_add_by_dev (port_dev , dev );
@@ -1255,6 +1242,13 @@ static int team_port_add(struct team *team, struct net_device *port_dev,
1255
1242
goto err_handler_register ;
1256
1243
}
1257
1244
1245
+ err = team_upper_dev_link (team , port , extack );
1246
+ if (err ) {
1247
+ netdev_err (dev , "Device %s failed to set upper link\n" ,
1248
+ portname );
1249
+ goto err_set_upper_link ;
1250
+ }
1251
+
1258
1252
err = __team_option_inst_add_port (team , port );
1259
1253
if (err ) {
1260
1254
netdev_err (dev , "Device %s failed to add per-port options\n" ,
@@ -1301,6 +1295,9 @@ static int team_port_add(struct team *team, struct net_device *port_dev,
1301
1295
__team_option_inst_del_port (team , port );
1302
1296
1303
1297
err_option_port_add :
1298
+ team_upper_dev_unlink (team , port );
1299
+
1300
+ err_set_upper_link :
1304
1301
netdev_rx_handler_unregister (port_dev );
1305
1302
1306
1303
err_handler_register :
@@ -1310,16 +1307,13 @@ static int team_port_add(struct team *team, struct net_device *port_dev,
1310
1307
vlan_vids_del_by_dev (port_dev , dev );
1311
1308
1312
1309
err_vids_add :
1313
- team_port_leave (team , port );
1314
-
1315
- err_port_enter :
1316
- team_upper_dev_unlink (team , port );
1317
-
1318
- err_set_upper_link :
1319
1310
dev_close (port_dev );
1320
1311
1321
1312
err_dev_open :
1313
+ team_port_leave (team , port );
1322
1314
team_port_set_orig_dev_addr (port );
1315
+
1316
+ err_port_enter :
1323
1317
dev_set_mtu (port_dev , port -> orig .mtu );
1324
1318
1325
1319
err_set_mtu :
@@ -1622,7 +1616,6 @@ static int team_init(struct net_device *dev)
1622
1616
int err ;
1623
1617
1624
1618
team -> dev = dev ;
1625
- mutex_init (& team -> lock );
1626
1619
team_set_no_mode (team );
1627
1620
team -> notifier_ctx = false;
1628
1621
@@ -1650,6 +1643,8 @@ static int team_init(struct net_device *dev)
1650
1643
goto err_options_register ;
1651
1644
netif_carrier_off (dev );
1652
1645
1646
+ lockdep_register_key (& team -> team_lock_key );
1647
+ __mutex_init (& team -> lock , "team->team_lock_key" , & team -> team_lock_key );
1653
1648
netdev_lockdep_set_classes (dev );
1654
1649
1655
1650
return 0 ;
@@ -1670,7 +1665,7 @@ static void team_uninit(struct net_device *dev)
1670
1665
struct team_port * port ;
1671
1666
struct team_port * tmp ;
1672
1667
1673
- team_lock ( team );
1668
+ mutex_lock ( & team -> lock );
1674
1669
list_for_each_entry_safe (port , tmp , & team -> port_list , list )
1675
1670
team_port_del (team , port -> dev );
1676
1671
@@ -1679,8 +1674,9 @@ static void team_uninit(struct net_device *dev)
1679
1674
team_mcast_rejoin_fini (team );
1680
1675
team_notify_peers_fini (team );
1681
1676
team_queue_override_fini (team );
1682
- team_unlock ( team );
1677
+ mutex_unlock ( & team -> lock );
1683
1678
netdev_change_features (dev );
1679
+ lockdep_unregister_key (& team -> team_lock_key );
1684
1680
}
1685
1681
1686
1682
static void team_destructor (struct net_device * dev )
@@ -1794,18 +1790,18 @@ static void team_set_rx_mode(struct net_device *dev)
1794
1790
1795
1791
static int team_set_mac_address (struct net_device * dev , void * p )
1796
1792
{
1797
- struct team * team = netdev_priv (dev );
1798
1793
struct sockaddr * addr = p ;
1794
+ struct team * team = netdev_priv (dev );
1799
1795
struct team_port * port ;
1800
1796
1801
1797
if (dev -> type == ARPHRD_ETHER && !is_valid_ether_addr (addr -> sa_data ))
1802
1798
return - EADDRNOTAVAIL ;
1803
1799
dev_addr_set (dev , addr -> sa_data );
1804
- team_lock ( team );
1800
+ mutex_lock ( & team -> lock );
1805
1801
list_for_each_entry (port , & team -> port_list , list )
1806
1802
if (team -> ops .port_change_dev_addr )
1807
1803
team -> ops .port_change_dev_addr (team , port );
1808
- team_unlock ( team );
1804
+ mutex_unlock ( & team -> lock );
1809
1805
return 0 ;
1810
1806
}
1811
1807
@@ -1819,7 +1815,7 @@ static int team_change_mtu(struct net_device *dev, int new_mtu)
1819
1815
* Alhough this is reader, it's guarded by team lock. It's not possible
1820
1816
* to traverse list in reverse under rcu_read_lock
1821
1817
*/
1822
- team_lock ( team );
1818
+ mutex_lock ( & team -> lock );
1823
1819
team -> port_mtu_change_allowed = true;
1824
1820
list_for_each_entry (port , & team -> port_list , list ) {
1825
1821
err = dev_set_mtu (port -> dev , new_mtu );
@@ -1830,7 +1826,7 @@ static int team_change_mtu(struct net_device *dev, int new_mtu)
1830
1826
}
1831
1827
}
1832
1828
team -> port_mtu_change_allowed = false;
1833
- team_unlock ( team );
1829
+ mutex_unlock ( & team -> lock );
1834
1830
1835
1831
dev -> mtu = new_mtu ;
1836
1832
@@ -1840,7 +1836,7 @@ static int team_change_mtu(struct net_device *dev, int new_mtu)
1840
1836
list_for_each_entry_continue_reverse (port , & team -> port_list , list )
1841
1837
dev_set_mtu (port -> dev , dev -> mtu );
1842
1838
team -> port_mtu_change_allowed = false;
1843
- team_unlock ( team );
1839
+ mutex_unlock ( & team -> lock );
1844
1840
1845
1841
return err ;
1846
1842
}
@@ -1894,20 +1890,20 @@ static int team_vlan_rx_add_vid(struct net_device *dev, __be16 proto, u16 vid)
1894
1890
* Alhough this is reader, it's guarded by team lock. It's not possible
1895
1891
* to traverse list in reverse under rcu_read_lock
1896
1892
*/
1897
- team_lock ( team );
1893
+ mutex_lock ( & team -> lock );
1898
1894
list_for_each_entry (port , & team -> port_list , list ) {
1899
1895
err = vlan_vid_add (port -> dev , proto , vid );
1900
1896
if (err )
1901
1897
goto unwind ;
1902
1898
}
1903
- team_unlock ( team );
1899
+ mutex_unlock ( & team -> lock );
1904
1900
1905
1901
return 0 ;
1906
1902
1907
1903
unwind :
1908
1904
list_for_each_entry_continue_reverse (port , & team -> port_list , list )
1909
1905
vlan_vid_del (port -> dev , proto , vid );
1910
- team_unlock ( team );
1906
+ mutex_unlock ( & team -> lock );
1911
1907
1912
1908
return err ;
1913
1909
}
@@ -1917,10 +1913,10 @@ static int team_vlan_rx_kill_vid(struct net_device *dev, __be16 proto, u16 vid)
1917
1913
struct team * team = netdev_priv (dev );
1918
1914
struct team_port * port ;
1919
1915
1920
- team_lock ( team );
1916
+ mutex_lock ( & team -> lock );
1921
1917
list_for_each_entry (port , & team -> port_list , list )
1922
1918
vlan_vid_del (port -> dev , proto , vid );
1923
- team_unlock ( team );
1919
+ mutex_unlock ( & team -> lock );
1924
1920
1925
1921
return 0 ;
1926
1922
}
@@ -1942,9 +1938,9 @@ static void team_netpoll_cleanup(struct net_device *dev)
1942
1938
{
1943
1939
struct team * team = netdev_priv (dev );
1944
1940
1945
- team_lock ( team );
1941
+ mutex_lock ( & team -> lock );
1946
1942
__team_netpoll_cleanup (team );
1947
- team_unlock ( team );
1943
+ mutex_unlock ( & team -> lock );
1948
1944
}
1949
1945
1950
1946
static int team_netpoll_setup (struct net_device * dev ,
@@ -1954,15 +1950,15 @@ static int team_netpoll_setup(struct net_device *dev,
1954
1950
struct team_port * port ;
1955
1951
int err = 0 ;
1956
1952
1957
- team_lock ( team );
1953
+ mutex_lock ( & team -> lock );
1958
1954
list_for_each_entry (port , & team -> port_list , list ) {
1959
1955
err = __team_port_enable_netpoll (port );
1960
1956
if (err ) {
1961
1957
__team_netpoll_cleanup (team );
1962
1958
break ;
1963
1959
}
1964
1960
}
1965
- team_unlock ( team );
1961
+ mutex_unlock ( & team -> lock );
1966
1962
return err ;
1967
1963
}
1968
1964
#endif
@@ -1973,9 +1969,9 @@ static int team_add_slave(struct net_device *dev, struct net_device *port_dev,
1973
1969
struct team * team = netdev_priv (dev );
1974
1970
int err ;
1975
1971
1976
- team_lock ( team );
1972
+ mutex_lock ( & team -> lock );
1977
1973
err = team_port_add (team , port_dev , extack );
1978
- team_unlock ( team );
1974
+ mutex_unlock ( & team -> lock );
1979
1975
1980
1976
if (!err )
1981
1977
netdev_change_features (dev );
@@ -1988,12 +1984,19 @@ static int team_del_slave(struct net_device *dev, struct net_device *port_dev)
1988
1984
struct team * team = netdev_priv (dev );
1989
1985
int err ;
1990
1986
1991
- team_lock ( team );
1987
+ mutex_lock ( & team -> lock );
1992
1988
err = team_port_del (team , port_dev );
1993
- team_unlock ( team );
1989
+ mutex_unlock ( & team -> lock );
1994
1990
1995
- if (!err )
1996
- netdev_change_features (dev );
1991
+ if (err )
1992
+ return err ;
1993
+
1994
+ if (netif_is_team_master (port_dev )) {
1995
+ lockdep_unregister_key (& team -> team_lock_key );
1996
+ lockdep_register_key (& team -> team_lock_key );
1997
+ lockdep_set_class (& team -> lock , & team -> team_lock_key );
1998
+ }
1999
+ netdev_change_features (dev );
1997
2000
1998
2001
return err ;
1999
2002
}
@@ -2313,13 +2316,13 @@ static struct team *team_nl_team_get(struct genl_info *info)
2313
2316
}
2314
2317
2315
2318
team = netdev_priv (dev );
2316
- __team_lock ( team );
2319
+ mutex_lock ( & team -> lock );
2317
2320
return team ;
2318
2321
}
2319
2322
2320
2323
static void team_nl_team_put (struct team * team )
2321
2324
{
2322
- team_unlock ( team );
2325
+ mutex_unlock ( & team -> lock );
2323
2326
dev_put (team -> dev );
2324
2327
}
2325
2328
@@ -2981,9 +2984,9 @@ static void team_port_change_check(struct team_port *port, bool linkup)
2981
2984
{
2982
2985
struct team * team = port -> team ;
2983
2986
2984
- team_lock ( team );
2987
+ mutex_lock ( & team -> lock );
2985
2988
__team_port_change_check (port , linkup );
2986
- team_unlock ( team );
2989
+ mutex_unlock ( & team -> lock );
2987
2990
}
2988
2991
2989
2992
0 commit comments