aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJiri Pirko <jpirko@redhat.com>2011-02-12 01:48:36 -0500
committerDavid S. Miller <davem@davemloft.net>2011-02-13 13:42:07 -0500
commit1765a575334f1a232c1478accdee5c7d19f4b3e3 (patch)
tree6613f53ce9095b799048d891f0b4b6e34a479fe0
parentd59cfde2fb960b5970ccb5a38cea25d38b37a8e8 (diff)
net: make dev->master general
dev->master is now tightly connected to bonding driver. This patch makes this pointer more general and ready to be used by others. - netdev_set_master() - bond specifics moved to new function netdev_set_bond_master() - introduced netif_is_bond_slave() to check if device is a bonding slave Signed-off-by: Jiri Pirko <jpirko@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/infiniband/hw/nes/nes.c3
-rw-r--r--drivers/infiniband/hw/nes/nes_cm.c2
-rw-r--r--drivers/net/bonding/bond_main.c10
-rw-r--r--drivers/net/cxgb3/cxgb3_offload.c3
-rw-r--r--include/linux/netdevice.h7
-rw-r--r--net/core/dev.c49
6 files changed, 54 insertions, 20 deletions
diff --git a/drivers/infiniband/hw/nes/nes.c b/drivers/infiniband/hw/nes/nes.c
index 3b4ec3238ceb..3d7f3664b67b 100644
--- a/drivers/infiniband/hw/nes/nes.c
+++ b/drivers/infiniband/hw/nes/nes.c
@@ -153,7 +153,8 @@ static int nes_inetaddr_event(struct notifier_block *notifier,
153 nesdev, nesdev->netdev[0]->name); 153 nesdev, nesdev->netdev[0]->name);
154 netdev = nesdev->netdev[0]; 154 netdev = nesdev->netdev[0];
155 nesvnic = netdev_priv(netdev); 155 nesvnic = netdev_priv(netdev);
156 is_bonded = (netdev->master == event_netdev); 156 is_bonded = netif_is_bond_slave(netdev) &&
157 (netdev->master == event_netdev);
157 if ((netdev == event_netdev) || is_bonded) { 158 if ((netdev == event_netdev) || is_bonded) {
158 if (nesvnic->rdma_enabled == 0) { 159 if (nesvnic->rdma_enabled == 0) {
159 nes_debug(NES_DBG_NETDEV, "Returning without processing event for %s since" 160 nes_debug(NES_DBG_NETDEV, "Returning without processing event for %s since"
diff --git a/drivers/infiniband/hw/nes/nes_cm.c b/drivers/infiniband/hw/nes/nes_cm.c
index 009ec814d517..ec3aa11c36cb 100644
--- a/drivers/infiniband/hw/nes/nes_cm.c
+++ b/drivers/infiniband/hw/nes/nes_cm.c
@@ -1118,7 +1118,7 @@ static int nes_addr_resolve_neigh(struct nes_vnic *nesvnic, u32 dst_ip, int arpi
1118 return rc; 1118 return rc;
1119 } 1119 }
1120 1120
1121 if (nesvnic->netdev->master) 1121 if (netif_is_bond_slave(netdev))
1122 netdev = nesvnic->netdev->master; 1122 netdev = nesvnic->netdev->master;
1123 else 1123 else
1124 netdev = nesvnic->netdev; 1124 netdev = nesvnic->netdev;
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index 1df9f0ea9184..9f877878d636 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -1594,9 +1594,9 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
1594 } 1594 }
1595 } 1595 }
1596 1596
1597 res = netdev_set_master(slave_dev, bond_dev); 1597 res = netdev_set_bond_master(slave_dev, bond_dev);
1598 if (res) { 1598 if (res) {
1599 pr_debug("Error %d calling netdev_set_master\n", res); 1599 pr_debug("Error %d calling netdev_set_bond_master\n", res);
1600 goto err_restore_mac; 1600 goto err_restore_mac;
1601 } 1601 }
1602 /* open the slave since the application closed it */ 1602 /* open the slave since the application closed it */
@@ -1812,7 +1812,7 @@ err_close:
1812 dev_close(slave_dev); 1812 dev_close(slave_dev);
1813 1813
1814err_unset_master: 1814err_unset_master:
1815 netdev_set_master(slave_dev, NULL); 1815 netdev_set_bond_master(slave_dev, NULL);
1816 1816
1817err_restore_mac: 1817err_restore_mac:
1818 if (!bond->params.fail_over_mac) { 1818 if (!bond->params.fail_over_mac) {
@@ -1992,7 +1992,7 @@ int bond_release(struct net_device *bond_dev, struct net_device *slave_dev)
1992 netif_addr_unlock_bh(bond_dev); 1992 netif_addr_unlock_bh(bond_dev);
1993 } 1993 }
1994 1994
1995 netdev_set_master(slave_dev, NULL); 1995 netdev_set_bond_master(slave_dev, NULL);
1996 1996
1997#ifdef CONFIG_NET_POLL_CONTROLLER 1997#ifdef CONFIG_NET_POLL_CONTROLLER
1998 read_lock_bh(&bond->lock); 1998 read_lock_bh(&bond->lock);
@@ -2114,7 +2114,7 @@ static int bond_release_all(struct net_device *bond_dev)
2114 netif_addr_unlock_bh(bond_dev); 2114 netif_addr_unlock_bh(bond_dev);
2115 } 2115 }
2116 2116
2117 netdev_set_master(slave_dev, NULL); 2117 netdev_set_bond_master(slave_dev, NULL);
2118 2118
2119 /* close slave before restoring its mac address */ 2119 /* close slave before restoring its mac address */
2120 dev_close(slave_dev); 2120 dev_close(slave_dev);
diff --git a/drivers/net/cxgb3/cxgb3_offload.c b/drivers/net/cxgb3/cxgb3_offload.c
index 7ea94b5205f8..862804f32b6e 100644
--- a/drivers/net/cxgb3/cxgb3_offload.c
+++ b/drivers/net/cxgb3/cxgb3_offload.c
@@ -186,9 +186,10 @@ static struct net_device *get_iff_from_mac(struct adapter *adapter,
186 dev = NULL; 186 dev = NULL;
187 if (grp) 187 if (grp)
188 dev = vlan_group_get_device(grp, vlan); 188 dev = vlan_group_get_device(grp, vlan);
189 } else 189 } else if (netif_is_bond_slave(dev)) {
190 while (dev->master) 190 while (dev->master)
191 dev = dev->master; 191 dev = dev->master;
192 }
192 return dev; 193 return dev;
193 } 194 }
194 } 195 }
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 5a5baeaaa50f..5a42b1003767 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -2377,6 +2377,8 @@ extern int netdev_max_backlog;
2377extern int netdev_tstamp_prequeue; 2377extern int netdev_tstamp_prequeue;
2378extern int weight_p; 2378extern int weight_p;
2379extern int netdev_set_master(struct net_device *dev, struct net_device *master); 2379extern int netdev_set_master(struct net_device *dev, struct net_device *master);
2380extern int netdev_set_bond_master(struct net_device *dev,
2381 struct net_device *master);
2380extern int skb_checksum_help(struct sk_buff *skb); 2382extern int skb_checksum_help(struct sk_buff *skb);
2381extern struct sk_buff *skb_gso_segment(struct sk_buff *skb, u32 features); 2383extern struct sk_buff *skb_gso_segment(struct sk_buff *skb, u32 features);
2382#ifdef CONFIG_BUG 2384#ifdef CONFIG_BUG
@@ -2437,6 +2439,11 @@ static inline void netif_set_gso_max_size(struct net_device *dev,
2437 dev->gso_max_size = size; 2439 dev->gso_max_size = size;
2438} 2440}
2439 2441
2442static inline int netif_is_bond_slave(struct net_device *dev)
2443{
2444 return dev->flags & IFF_SLAVE && dev->priv_flags & IFF_BONDING;
2445}
2446
2440extern struct pernet_operations __net_initdata loopback_net_ops; 2447extern struct pernet_operations __net_initdata loopback_net_ops;
2441 2448
2442static inline int dev_ethtool_get_settings(struct net_device *dev, 2449static inline int dev_ethtool_get_settings(struct net_device *dev,
diff --git a/net/core/dev.c b/net/core/dev.c
index d874fd1baf49..a4132766d363 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -3146,7 +3146,6 @@ static int __netif_receive_skb(struct sk_buff *skb)
3146 struct packet_type *ptype, *pt_prev; 3146 struct packet_type *ptype, *pt_prev;
3147 rx_handler_func_t *rx_handler; 3147 rx_handler_func_t *rx_handler;
3148 struct net_device *orig_dev; 3148 struct net_device *orig_dev;
3149 struct net_device *master;
3150 struct net_device *null_or_orig; 3149 struct net_device *null_or_orig;
3151 struct net_device *orig_or_bond; 3150 struct net_device *orig_or_bond;
3152 int ret = NET_RX_DROP; 3151 int ret = NET_RX_DROP;
@@ -3173,15 +3172,19 @@ static int __netif_receive_skb(struct sk_buff *skb)
3173 */ 3172 */
3174 null_or_orig = NULL; 3173 null_or_orig = NULL;
3175 orig_dev = skb->dev; 3174 orig_dev = skb->dev;
3176 master = ACCESS_ONCE(orig_dev->master);
3177 if (skb->deliver_no_wcard) 3175 if (skb->deliver_no_wcard)
3178 null_or_orig = orig_dev; 3176 null_or_orig = orig_dev;
3179 else if (master) { 3177 else if (netif_is_bond_slave(orig_dev)) {
3180 if (__skb_bond_should_drop(skb, master)) { 3178 struct net_device *bond_master = ACCESS_ONCE(orig_dev->master);
3181 skb->deliver_no_wcard = 1; 3179
3182 null_or_orig = orig_dev; /* deliver only exact match */ 3180 if (likely(bond_master)) {
3183 } else 3181 if (__skb_bond_should_drop(skb, bond_master)) {
3184 skb->dev = master; 3182 skb->deliver_no_wcard = 1;
3183 /* deliver only exact match */
3184 null_or_orig = orig_dev;
3185 } else
3186 skb->dev = bond_master;
3187 }
3185 } 3188 }
3186 3189
3187 __this_cpu_inc(softnet_data.processed); 3190 __this_cpu_inc(softnet_data.processed);
@@ -4346,15 +4349,14 @@ static int __init dev_proc_init(void)
4346 4349
4347 4350
4348/** 4351/**
4349 * netdev_set_master - set up master/slave pair 4352 * netdev_set_master - set up master pointer
4350 * @slave: slave device 4353 * @slave: slave device
4351 * @master: new master device 4354 * @master: new master device
4352 * 4355 *
4353 * Changes the master device of the slave. Pass %NULL to break the 4356 * Changes the master device of the slave. Pass %NULL to break the
4354 * bonding. The caller must hold the RTNL semaphore. On a failure 4357 * bonding. The caller must hold the RTNL semaphore. On a failure
4355 * a negative errno code is returned. On success the reference counts 4358 * a negative errno code is returned. On success the reference counts
4356 * are adjusted, %RTM_NEWLINK is sent to the routing socket and the 4359 * are adjusted and the function returns zero.
4357 * function returns zero.
4358 */ 4360 */
4359int netdev_set_master(struct net_device *slave, struct net_device *master) 4361int netdev_set_master(struct net_device *slave, struct net_device *master)
4360{ 4362{
@@ -4374,6 +4376,29 @@ int netdev_set_master(struct net_device *slave, struct net_device *master)
4374 synchronize_net(); 4376 synchronize_net();
4375 dev_put(old); 4377 dev_put(old);
4376 } 4378 }
4379 return 0;
4380}
4381EXPORT_SYMBOL(netdev_set_master);
4382
4383/**
4384 * netdev_set_bond_master - set up bonding master/slave pair
4385 * @slave: slave device
4386 * @master: new master device
4387 *
4388 * Changes the master device of the slave. Pass %NULL to break the
4389 * bonding. The caller must hold the RTNL semaphore. On a failure
4390 * a negative errno code is returned. On success %RTM_NEWLINK is sent
4391 * to the routing socket and the function returns zero.
4392 */
4393int netdev_set_bond_master(struct net_device *slave, struct net_device *master)
4394{
4395 int err;
4396
4397 ASSERT_RTNL();
4398
4399 err = netdev_set_master(slave, master);
4400 if (err)
4401 return err;
4377 if (master) 4402 if (master)
4378 slave->flags |= IFF_SLAVE; 4403 slave->flags |= IFF_SLAVE;
4379 else 4404 else
@@ -4382,7 +4407,7 @@ int netdev_set_master(struct net_device *slave, struct net_device *master)
4382 rtmsg_ifinfo(RTM_NEWLINK, slave, IFF_SLAVE); 4407 rtmsg_ifinfo(RTM_NEWLINK, slave, IFF_SLAVE);
4383 return 0; 4408 return 0;
4384} 4409}
4385EXPORT_SYMBOL(netdev_set_master); 4410EXPORT_SYMBOL(netdev_set_bond_master);
4386 4411
4387static void dev_change_rx_flags(struct net_device *dev, int flags) 4412static void dev_change_rx_flags(struct net_device *dev, int flags)
4388{ 4413{