diff options
Diffstat (limited to 'drivers/net/bonding/bond_main.c')
-rw-r--r-- | drivers/net/bonding/bond_main.c | 70 |
1 files changed, 42 insertions, 28 deletions
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index c0bbddae4ec4..6482aed4bb7c 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
@@ -1336,6 +1336,13 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev) | |||
1336 | goto err_undo_flags; | 1336 | goto err_undo_flags; |
1337 | } | 1337 | } |
1338 | 1338 | ||
1339 | if (slave_dev->get_stats == NULL) { | ||
1340 | printk(KERN_NOTICE DRV_NAME | ||
1341 | ": %s: the driver for slave device %s does not provide " | ||
1342 | "get_stats function, network statistics will be " | ||
1343 | "inaccurate.\n", bond_dev->name, slave_dev->name); | ||
1344 | } | ||
1345 | |||
1339 | new_slave = kmalloc(sizeof(struct slave), GFP_KERNEL); | 1346 | new_slave = kmalloc(sizeof(struct slave), GFP_KERNEL); |
1340 | if (!new_slave) { | 1347 | if (!new_slave) { |
1341 | res = -ENOMEM; | 1348 | res = -ENOMEM; |
@@ -3605,33 +3612,35 @@ static struct net_device_stats *bond_get_stats(struct net_device *bond_dev) | |||
3605 | read_lock_bh(&bond->lock); | 3612 | read_lock_bh(&bond->lock); |
3606 | 3613 | ||
3607 | bond_for_each_slave(bond, slave, i) { | 3614 | bond_for_each_slave(bond, slave, i) { |
3608 | sstats = slave->dev->get_stats(slave->dev); | 3615 | if (slave->dev->get_stats) { |
3609 | 3616 | sstats = slave->dev->get_stats(slave->dev); | |
3610 | stats->rx_packets += sstats->rx_packets; | 3617 | |
3611 | stats->rx_bytes += sstats->rx_bytes; | 3618 | stats->rx_packets += sstats->rx_packets; |
3612 | stats->rx_errors += sstats->rx_errors; | 3619 | stats->rx_bytes += sstats->rx_bytes; |
3613 | stats->rx_dropped += sstats->rx_dropped; | 3620 | stats->rx_errors += sstats->rx_errors; |
3614 | 3621 | stats->rx_dropped += sstats->rx_dropped; | |
3615 | stats->tx_packets += sstats->tx_packets; | 3622 | |
3616 | stats->tx_bytes += sstats->tx_bytes; | 3623 | stats->tx_packets += sstats->tx_packets; |
3617 | stats->tx_errors += sstats->tx_errors; | 3624 | stats->tx_bytes += sstats->tx_bytes; |
3618 | stats->tx_dropped += sstats->tx_dropped; | 3625 | stats->tx_errors += sstats->tx_errors; |
3619 | 3626 | stats->tx_dropped += sstats->tx_dropped; | |
3620 | stats->multicast += sstats->multicast; | 3627 | |
3621 | stats->collisions += sstats->collisions; | 3628 | stats->multicast += sstats->multicast; |
3622 | 3629 | stats->collisions += sstats->collisions; | |
3623 | stats->rx_length_errors += sstats->rx_length_errors; | 3630 | |
3624 | stats->rx_over_errors += sstats->rx_over_errors; | 3631 | stats->rx_length_errors += sstats->rx_length_errors; |
3625 | stats->rx_crc_errors += sstats->rx_crc_errors; | 3632 | stats->rx_over_errors += sstats->rx_over_errors; |
3626 | stats->rx_frame_errors += sstats->rx_frame_errors; | 3633 | stats->rx_crc_errors += sstats->rx_crc_errors; |
3627 | stats->rx_fifo_errors += sstats->rx_fifo_errors; | 3634 | stats->rx_frame_errors += sstats->rx_frame_errors; |
3628 | stats->rx_missed_errors += sstats->rx_missed_errors; | 3635 | stats->rx_fifo_errors += sstats->rx_fifo_errors; |
3629 | 3636 | stats->rx_missed_errors += sstats->rx_missed_errors; | |
3630 | stats->tx_aborted_errors += sstats->tx_aborted_errors; | 3637 | |
3631 | stats->tx_carrier_errors += sstats->tx_carrier_errors; | 3638 | stats->tx_aborted_errors += sstats->tx_aborted_errors; |
3632 | stats->tx_fifo_errors += sstats->tx_fifo_errors; | 3639 | stats->tx_carrier_errors += sstats->tx_carrier_errors; |
3633 | stats->tx_heartbeat_errors += sstats->tx_heartbeat_errors; | 3640 | stats->tx_fifo_errors += sstats->tx_fifo_errors; |
3634 | stats->tx_window_errors += sstats->tx_window_errors; | 3641 | stats->tx_heartbeat_errors += sstats->tx_heartbeat_errors; |
3642 | stats->tx_window_errors += sstats->tx_window_errors; | ||
3643 | } | ||
3635 | } | 3644 | } |
3636 | 3645 | ||
3637 | read_unlock_bh(&bond->lock); | 3646 | read_unlock_bh(&bond->lock); |
@@ -3675,7 +3684,7 @@ static int bond_do_ioctl(struct net_device *bond_dev, struct ifreq *ifr, int cmd | |||
3675 | mii->val_out = 0; | 3684 | mii->val_out = 0; |
3676 | read_lock_bh(&bond->lock); | 3685 | read_lock_bh(&bond->lock); |
3677 | read_lock(&bond->curr_slave_lock); | 3686 | read_lock(&bond->curr_slave_lock); |
3678 | if (bond->curr_active_slave) { | 3687 | if (netif_carrier_ok(bond->dev)) { |
3679 | mii->val_out = BMSR_LSTATUS; | 3688 | mii->val_out = BMSR_LSTATUS; |
3680 | } | 3689 | } |
3681 | read_unlock(&bond->curr_slave_lock); | 3690 | read_unlock(&bond->curr_slave_lock); |
@@ -4692,6 +4701,8 @@ static int bond_check_params(struct bond_params *params) | |||
4692 | return 0; | 4701 | return 0; |
4693 | } | 4702 | } |
4694 | 4703 | ||
4704 | static struct lock_class_key bonding_netdev_xmit_lock_key; | ||
4705 | |||
4695 | /* Create a new bond based on the specified name and bonding parameters. | 4706 | /* Create a new bond based on the specified name and bonding parameters. |
4696 | * Caller must NOT hold rtnl_lock; we need to release it here before we | 4707 | * Caller must NOT hold rtnl_lock; we need to release it here before we |
4697 | * set up our sysfs entries. | 4708 | * set up our sysfs entries. |
@@ -4727,6 +4738,9 @@ int bond_create(char *name, struct bond_params *params, struct bonding **newbond | |||
4727 | if (res < 0) { | 4738 | if (res < 0) { |
4728 | goto out_bond; | 4739 | goto out_bond; |
4729 | } | 4740 | } |
4741 | |||
4742 | lockdep_set_class(&bond_dev->_xmit_lock, &bonding_netdev_xmit_lock_key); | ||
4743 | |||
4730 | if (newbond) | 4744 | if (newbond) |
4731 | *newbond = bond_dev->priv; | 4745 | *newbond = bond_dev->priv; |
4732 | 4746 | ||