diff options
author | Jiri Pirko <jpirko@redhat.com> | 2011-02-12 01:48:36 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-02-13 13:42:07 -0500 |
commit | 1765a575334f1a232c1478accdee5c7d19f4b3e3 (patch) | |
tree | 6613f53ce9095b799048d891f0b4b6e34a479fe0 | |
parent | d59cfde2fb960b5970ccb5a38cea25d38b37a8e8 (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.c | 3 | ||||
-rw-r--r-- | drivers/infiniband/hw/nes/nes_cm.c | 2 | ||||
-rw-r--r-- | drivers/net/bonding/bond_main.c | 10 | ||||
-rw-r--r-- | drivers/net/cxgb3/cxgb3_offload.c | 3 | ||||
-rw-r--r-- | include/linux/netdevice.h | 7 | ||||
-rw-r--r-- | net/core/dev.c | 49 |
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 | ||
1814 | err_unset_master: | 1814 | err_unset_master: |
1815 | netdev_set_master(slave_dev, NULL); | 1815 | netdev_set_bond_master(slave_dev, NULL); |
1816 | 1816 | ||
1817 | err_restore_mac: | 1817 | err_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; | |||
2377 | extern int netdev_tstamp_prequeue; | 2377 | extern int netdev_tstamp_prequeue; |
2378 | extern int weight_p; | 2378 | extern int weight_p; |
2379 | extern int netdev_set_master(struct net_device *dev, struct net_device *master); | 2379 | extern int netdev_set_master(struct net_device *dev, struct net_device *master); |
2380 | extern int netdev_set_bond_master(struct net_device *dev, | ||
2381 | struct net_device *master); | ||
2380 | extern int skb_checksum_help(struct sk_buff *skb); | 2382 | extern int skb_checksum_help(struct sk_buff *skb); |
2381 | extern struct sk_buff *skb_gso_segment(struct sk_buff *skb, u32 features); | 2383 | extern 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 | ||
2442 | static inline int netif_is_bond_slave(struct net_device *dev) | ||
2443 | { | ||
2444 | return dev->flags & IFF_SLAVE && dev->priv_flags & IFF_BONDING; | ||
2445 | } | ||
2446 | |||
2440 | extern struct pernet_operations __net_initdata loopback_net_ops; | 2447 | extern struct pernet_operations __net_initdata loopback_net_ops; |
2441 | 2448 | ||
2442 | static inline int dev_ethtool_get_settings(struct net_device *dev, | 2449 | static 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 | */ |
4359 | int netdev_set_master(struct net_device *slave, struct net_device *master) | 4361 | int 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 | } | ||
4381 | EXPORT_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 | */ | ||
4393 | int 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 | } |
4385 | EXPORT_SYMBOL(netdev_set_master); | 4410 | EXPORT_SYMBOL(netdev_set_bond_master); |
4386 | 4411 | ||
4387 | static void dev_change_rx_flags(struct net_device *dev, int flags) | 4412 | static void dev_change_rx_flags(struct net_device *dev, int flags) |
4388 | { | 4413 | { |