aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/team/team.c16
-rw-r--r--include/linux/if_team.h1
2 files changed, 14 insertions, 3 deletions
diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c
index 6cea83b48cad..8156b33ee3e7 100644
--- a/drivers/net/team/team.c
+++ b/drivers/net/team/team.c
@@ -1615,7 +1615,6 @@ static int team_init(struct net_device *dev)
1615 int err; 1615 int err;
1616 1616
1617 team->dev = dev; 1617 team->dev = dev;
1618 mutex_init(&team->lock);
1619 team_set_no_mode(team); 1618 team_set_no_mode(team);
1620 1619
1621 team->pcpu_stats = netdev_alloc_pcpu_stats(struct team_pcpu_stats); 1620 team->pcpu_stats = netdev_alloc_pcpu_stats(struct team_pcpu_stats);
@@ -1642,6 +1641,9 @@ static int team_init(struct net_device *dev)
1642 goto err_options_register; 1641 goto err_options_register;
1643 netif_carrier_off(dev); 1642 netif_carrier_off(dev);
1644 1643
1644 lockdep_register_key(&team->team_lock_key);
1645 __mutex_init(&team->lock, "team->team_lock_key", &team->team_lock_key);
1646
1645 return 0; 1647 return 0;
1646 1648
1647err_options_register: 1649err_options_register:
@@ -1671,6 +1673,7 @@ static void team_uninit(struct net_device *dev)
1671 team_queue_override_fini(team); 1673 team_queue_override_fini(team);
1672 mutex_unlock(&team->lock); 1674 mutex_unlock(&team->lock);
1673 netdev_change_features(dev); 1675 netdev_change_features(dev);
1676 lockdep_unregister_key(&team->team_lock_key);
1674} 1677}
1675 1678
1676static void team_destructor(struct net_device *dev) 1679static void team_destructor(struct net_device *dev)
@@ -1974,8 +1977,15 @@ static int team_del_slave(struct net_device *dev, struct net_device *port_dev)
1974 err = team_port_del(team, port_dev); 1977 err = team_port_del(team, port_dev);
1975 mutex_unlock(&team->lock); 1978 mutex_unlock(&team->lock);
1976 1979
1977 if (!err) 1980 if (err)
1978 netdev_change_features(dev); 1981 return err;
1982
1983 if (netif_is_team_master(port_dev)) {
1984 lockdep_unregister_key(&team->team_lock_key);
1985 lockdep_register_key(&team->team_lock_key);
1986 lockdep_set_class(&team->lock, &team->team_lock_key);
1987 }
1988 netdev_change_features(dev);
1979 1989
1980 return err; 1990 return err;
1981} 1991}
diff --git a/include/linux/if_team.h b/include/linux/if_team.h
index 06faa066496f..ec7e4bd07f82 100644
--- a/include/linux/if_team.h
+++ b/include/linux/if_team.h
@@ -223,6 +223,7 @@ struct team {
223 atomic_t count_pending; 223 atomic_t count_pending;
224 struct delayed_work dw; 224 struct delayed_work dw;
225 } mcast_rejoin; 225 } mcast_rejoin;
226 struct lock_class_key team_lock_key;
226 long mode_priv[TEAM_MODE_PRIV_LONGS]; 227 long mode_priv[TEAM_MODE_PRIV_LONGS];
227}; 228};
228 229