diff options
| author | Stephen Hemminger <shemminger@vyatta.com> | 2008-11-20 23:14:53 -0500 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2008-11-20 23:14:53 -0500 |
| commit | 008298231abbeb91bc7be9e8b078607b816d1a4a (patch) | |
| tree | 8cb0c17720086ef97c614b96241f06aa63ce8511 /drivers/net/bonding/bond_main.c | |
| parent | 6ab33d51713d6d60c7677c0d020910a8cb37e513 (diff) | |
netdev: add more functions to netdevice ops
This patch moves neigh_setup and hard_start_xmit into the network device ops
structure. For bisection, fix all the previously converted drivers as well.
Bonding driver took the biggest hit on this.
Added a prefetch of the hard_start_xmit in the fast path to try and reduce
any impact this would have.
Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/bonding/bond_main.c')
| -rw-r--r-- | drivers/net/bonding/bond_main.c | 56 |
1 files changed, 46 insertions, 10 deletions
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 614656c8187b..a339a8052737 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
| @@ -1377,14 +1377,12 @@ done: | |||
| 1377 | return 0; | 1377 | return 0; |
| 1378 | } | 1378 | } |
| 1379 | 1379 | ||
| 1380 | |||
| 1381 | static void bond_setup_by_slave(struct net_device *bond_dev, | 1380 | static void bond_setup_by_slave(struct net_device *bond_dev, |
| 1382 | struct net_device *slave_dev) | 1381 | struct net_device *slave_dev) |
| 1383 | { | 1382 | { |
| 1384 | struct bonding *bond = netdev_priv(bond_dev); | 1383 | struct bonding *bond = netdev_priv(bond_dev); |
| 1385 | 1384 | ||
| 1386 | bond_dev->neigh_setup = slave_dev->neigh_setup; | 1385 | bond_dev->header_ops = slave_dev->header_ops; |
| 1387 | bond_dev->header_ops = slave_dev->header_ops; | ||
| 1388 | 1386 | ||
| 1389 | bond_dev->type = slave_dev->type; | 1387 | bond_dev->type = slave_dev->type; |
| 1390 | bond_dev->hard_header_len = slave_dev->hard_header_len; | 1388 | bond_dev->hard_header_len = slave_dev->hard_header_len; |
| @@ -4124,6 +4122,20 @@ static void bond_set_multicast_list(struct net_device *bond_dev) | |||
| 4124 | read_unlock(&bond->lock); | 4122 | read_unlock(&bond->lock); |
| 4125 | } | 4123 | } |
| 4126 | 4124 | ||
| 4125 | static int bond_neigh_setup(struct net_device *dev, struct neigh_parms *parms) | ||
| 4126 | { | ||
| 4127 | struct bonding *bond = netdev_priv(dev); | ||
| 4128 | struct slave *slave = bond->first_slave; | ||
| 4129 | |||
| 4130 | if (slave) { | ||
| 4131 | const struct net_device_ops *slave_ops | ||
| 4132 | = slave->dev->netdev_ops; | ||
| 4133 | if (slave_ops->ndo_neigh_setup) | ||
| 4134 | return slave_ops->ndo_neigh_setup(dev, parms); | ||
| 4135 | } | ||
| 4136 | return 0; | ||
| 4137 | } | ||
| 4138 | |||
| 4127 | /* | 4139 | /* |
| 4128 | * Change the MTU of all of a master's slaves to match the master | 4140 | * Change the MTU of all of a master's slaves to match the master |
| 4129 | */ | 4141 | */ |
| @@ -4490,6 +4502,35 @@ static void bond_set_xmit_hash_policy(struct bonding *bond) | |||
| 4490 | } | 4502 | } |
| 4491 | } | 4503 | } |
| 4492 | 4504 | ||
| 4505 | static int bond_start_xmit(struct sk_buff *skb, struct net_device *dev) | ||
| 4506 | { | ||
| 4507 | const struct bonding *bond = netdev_priv(dev); | ||
| 4508 | |||
| 4509 | switch (bond->params.mode) { | ||
| 4510 | case BOND_MODE_ROUNDROBIN: | ||
| 4511 | return bond_xmit_roundrobin(skb, dev); | ||
| 4512 | case BOND_MODE_ACTIVEBACKUP: | ||
| 4513 | return bond_xmit_activebackup(skb, dev); | ||
| 4514 | case BOND_MODE_XOR: | ||
| 4515 | return bond_xmit_xor(skb, dev); | ||
| 4516 | case BOND_MODE_BROADCAST: | ||
| 4517 | return bond_xmit_broadcast(skb, dev); | ||
| 4518 | case BOND_MODE_8023AD: | ||
| 4519 | return bond_3ad_xmit_xor(skb, dev); | ||
| 4520 | case BOND_MODE_ALB: | ||
| 4521 | case BOND_MODE_TLB: | ||
| 4522 | return bond_alb_xmit(skb, dev); | ||
| 4523 | default: | ||
| 4524 | /* Should never happen, mode already checked */ | ||
| 4525 | printk(KERN_ERR DRV_NAME ": %s: Error: Unknown bonding mode %d\n", | ||
| 4526 | dev->name, bond->params.mode); | ||
| 4527 | WARN_ON_ONCE(1); | ||
| 4528 | dev_kfree_skb(skb); | ||
| 4529 | return NETDEV_TX_OK; | ||
| 4530 | } | ||
| 4531 | } | ||
| 4532 | |||
| 4533 | |||
| 4493 | /* | 4534 | /* |
| 4494 | * set bond mode specific net device operations | 4535 | * set bond mode specific net device operations |
| 4495 | */ | 4536 | */ |
| @@ -4499,28 +4540,22 @@ void bond_set_mode_ops(struct bonding *bond, int mode) | |||
| 4499 | 4540 | ||
| 4500 | switch (mode) { | 4541 | switch (mode) { |
| 4501 | case BOND_MODE_ROUNDROBIN: | 4542 | case BOND_MODE_ROUNDROBIN: |
| 4502 | bond_dev->hard_start_xmit = bond_xmit_roundrobin; | ||
| 4503 | break; | 4543 | break; |
| 4504 | case BOND_MODE_ACTIVEBACKUP: | 4544 | case BOND_MODE_ACTIVEBACKUP: |
| 4505 | bond_dev->hard_start_xmit = bond_xmit_activebackup; | ||
| 4506 | break; | 4545 | break; |
| 4507 | case BOND_MODE_XOR: | 4546 | case BOND_MODE_XOR: |
| 4508 | bond_dev->hard_start_xmit = bond_xmit_xor; | ||
| 4509 | bond_set_xmit_hash_policy(bond); | 4547 | bond_set_xmit_hash_policy(bond); |
| 4510 | break; | 4548 | break; |
| 4511 | case BOND_MODE_BROADCAST: | 4549 | case BOND_MODE_BROADCAST: |
| 4512 | bond_dev->hard_start_xmit = bond_xmit_broadcast; | ||
| 4513 | break; | 4550 | break; |
| 4514 | case BOND_MODE_8023AD: | 4551 | case BOND_MODE_8023AD: |
| 4515 | bond_set_master_3ad_flags(bond); | 4552 | bond_set_master_3ad_flags(bond); |
| 4516 | bond_dev->hard_start_xmit = bond_3ad_xmit_xor; | ||
| 4517 | bond_set_xmit_hash_policy(bond); | 4553 | bond_set_xmit_hash_policy(bond); |
| 4518 | break; | 4554 | break; |
| 4519 | case BOND_MODE_ALB: | 4555 | case BOND_MODE_ALB: |
| 4520 | bond_set_master_alb_flags(bond); | 4556 | bond_set_master_alb_flags(bond); |
| 4521 | /* FALLTHRU */ | 4557 | /* FALLTHRU */ |
| 4522 | case BOND_MODE_TLB: | 4558 | case BOND_MODE_TLB: |
| 4523 | bond_dev->hard_start_xmit = bond_alb_xmit; | ||
| 4524 | break; | 4559 | break; |
| 4525 | default: | 4560 | default: |
| 4526 | /* Should never happen, mode already checked */ | 4561 | /* Should never happen, mode already checked */ |
| @@ -4553,12 +4588,13 @@ static const struct ethtool_ops bond_ethtool_ops = { | |||
| 4553 | static const struct net_device_ops bond_netdev_ops = { | 4588 | static const struct net_device_ops bond_netdev_ops = { |
| 4554 | .ndo_open = bond_open, | 4589 | .ndo_open = bond_open, |
| 4555 | .ndo_stop = bond_close, | 4590 | .ndo_stop = bond_close, |
| 4591 | .ndo_start_xmit = bond_start_xmit, | ||
| 4556 | .ndo_get_stats = bond_get_stats, | 4592 | .ndo_get_stats = bond_get_stats, |
| 4557 | .ndo_do_ioctl = bond_do_ioctl, | 4593 | .ndo_do_ioctl = bond_do_ioctl, |
| 4558 | .ndo_set_multicast_list = bond_set_multicast_list, | 4594 | .ndo_set_multicast_list = bond_set_multicast_list, |
| 4559 | .ndo_change_mtu = bond_change_mtu, | 4595 | .ndo_change_mtu = bond_change_mtu, |
| 4560 | .ndo_validate_addr = NULL, | ||
| 4561 | .ndo_set_mac_address = bond_set_mac_address, | 4596 | .ndo_set_mac_address = bond_set_mac_address, |
| 4597 | .ndo_neigh_setup = bond_neigh_setup, | ||
| 4562 | .ndo_vlan_rx_register = bond_vlan_rx_register, | 4598 | .ndo_vlan_rx_register = bond_vlan_rx_register, |
| 4563 | .ndo_vlan_rx_add_vid = bond_vlan_rx_add_vid, | 4599 | .ndo_vlan_rx_add_vid = bond_vlan_rx_add_vid, |
| 4564 | .ndo_vlan_rx_kill_vid = bond_vlan_rx_kill_vid, | 4600 | .ndo_vlan_rx_kill_vid = bond_vlan_rx_kill_vid, |
