diff options
| author | Eran Ben Elisha <eranbe@mellanox.com> | 2015-03-30 10:45:24 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2015-03-31 16:36:50 -0400 |
| commit | 3da8a36cc5c2a172bb42f8dc89638f5b41d7d7a6 (patch) | |
| tree | dd68732106614f7711cb3f72e886a2d0c3b5d10b | |
| parent | 6fcd27354b36fb9234aabeecde337b40d5a16842 (diff) | |
net/mlx4_en: Protect access to the statistics bitmap
This will allow parallel access to the statistics bitmap.
A pre-step for adding PFC counters, where the statistics bitmap
can be dynamically changed when modifying the PFC setting.
Signed-off-by: Eran Ben Elisha <eranbe@mellanox.com>
Signed-off-by: Hadar Hen Zion <hadarh@mellanox.com>
Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/en_ethtool.c | 6 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/en_netdev.c | 25 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | 9 |
3 files changed, 23 insertions, 17 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c index 1a29329d52c6..3e7ed39e8e76 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c | |||
| @@ -263,7 +263,7 @@ static int mlx4_en_get_sset_count(struct net_device *dev, int sset) | |||
| 263 | struct mlx4_en_priv *priv = netdev_priv(dev); | 263 | struct mlx4_en_priv *priv = netdev_priv(dev); |
| 264 | struct bitmap_iterator it; | 264 | struct bitmap_iterator it; |
| 265 | 265 | ||
| 266 | bitmap_iterator_init(&it, priv->stats_bitmap, NUM_ALL_STATS); | 266 | bitmap_iterator_init(&it, priv->stats_bitmap.bitmap, NUM_ALL_STATS); |
| 267 | 267 | ||
| 268 | switch (sset) { | 268 | switch (sset) { |
| 269 | case ETH_SS_STATS: | 269 | case ETH_SS_STATS: |
| @@ -292,7 +292,7 @@ static void mlx4_en_get_ethtool_stats(struct net_device *dev, | |||
| 292 | int i; | 292 | int i; |
| 293 | struct bitmap_iterator it; | 293 | struct bitmap_iterator it; |
| 294 | 294 | ||
| 295 | bitmap_iterator_init(&it, priv->stats_bitmap, NUM_ALL_STATS); | 295 | bitmap_iterator_init(&it, priv->stats_bitmap.bitmap, NUM_ALL_STATS); |
| 296 | 296 | ||
| 297 | spin_lock_bh(&priv->stats_lock); | 297 | spin_lock_bh(&priv->stats_lock); |
| 298 | 298 | ||
| @@ -339,7 +339,7 @@ static void mlx4_en_get_strings(struct net_device *dev, | |||
| 339 | int i, strings = 0; | 339 | int i, strings = 0; |
| 340 | struct bitmap_iterator it; | 340 | struct bitmap_iterator it; |
| 341 | 341 | ||
| 342 | bitmap_iterator_init(&it, priv->stats_bitmap, NUM_ALL_STATS); | 342 | bitmap_iterator_init(&it, priv->stats_bitmap.bitmap, NUM_ALL_STATS); |
| 343 | 343 | ||
| 344 | switch (stringset) { | 344 | switch (stringset) { |
| 345 | case ETH_SS_TEST: | 345 | case ETH_SS_TEST: |
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c index b7710321a2ca..4542bab9494b 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c | |||
| @@ -2649,35 +2649,36 @@ int mlx4_en_netdev_event(struct notifier_block *this, | |||
| 2649 | } | 2649 | } |
| 2650 | 2650 | ||
| 2651 | void mlx4_en_set_stats_bitmap(struct mlx4_dev *dev, | 2651 | void mlx4_en_set_stats_bitmap(struct mlx4_dev *dev, |
| 2652 | unsigned long *stats_bitmap) | 2652 | struct mlx4_en_stats_bitmap *stats_bitmap) |
| 2653 | { | 2653 | { |
| 2654 | int last_i = 0; | 2654 | int last_i = 0; |
| 2655 | 2655 | ||
| 2656 | bitmap_zero(stats_bitmap, NUM_ALL_STATS); | 2656 | mutex_init(&stats_bitmap->mutex); |
| 2657 | bitmap_zero(stats_bitmap->bitmap, NUM_ALL_STATS); | ||
| 2657 | 2658 | ||
| 2658 | if (mlx4_is_slave(dev)) { | 2659 | if (mlx4_is_slave(dev)) { |
| 2659 | bitmap_set(stats_bitmap, last_i + | 2660 | bitmap_set(stats_bitmap->bitmap, last_i + |
| 2660 | MLX4_FIND_NETDEV_STAT(rx_packets), 1); | 2661 | MLX4_FIND_NETDEV_STAT(rx_packets), 1); |
| 2661 | bitmap_set(stats_bitmap, last_i + | 2662 | bitmap_set(stats_bitmap->bitmap, last_i + |
| 2662 | MLX4_FIND_NETDEV_STAT(tx_packets), 1); | 2663 | MLX4_FIND_NETDEV_STAT(tx_packets), 1); |
| 2663 | bitmap_set(stats_bitmap, last_i + | 2664 | bitmap_set(stats_bitmap->bitmap, last_i + |
| 2664 | MLX4_FIND_NETDEV_STAT(rx_bytes), 1); | 2665 | MLX4_FIND_NETDEV_STAT(rx_bytes), 1); |
| 2665 | bitmap_set(stats_bitmap, last_i + | 2666 | bitmap_set(stats_bitmap->bitmap, last_i + |
| 2666 | MLX4_FIND_NETDEV_STAT(tx_bytes), 1); | 2667 | MLX4_FIND_NETDEV_STAT(tx_bytes), 1); |
| 2667 | bitmap_set(stats_bitmap, last_i + | 2668 | bitmap_set(stats_bitmap->bitmap, last_i + |
| 2668 | MLX4_FIND_NETDEV_STAT(rx_dropped), 1); | 2669 | MLX4_FIND_NETDEV_STAT(rx_dropped), 1); |
| 2669 | bitmap_set(stats_bitmap, last_i + | 2670 | bitmap_set(stats_bitmap->bitmap, last_i + |
| 2670 | MLX4_FIND_NETDEV_STAT(tx_dropped), 1); | 2671 | MLX4_FIND_NETDEV_STAT(tx_dropped), 1); |
| 2671 | } else { | 2672 | } else { |
| 2672 | bitmap_set(stats_bitmap, last_i, NUM_MAIN_STATS); | 2673 | bitmap_set(stats_bitmap->bitmap, last_i, NUM_MAIN_STATS); |
| 2673 | } | 2674 | } |
| 2674 | last_i += NUM_MAIN_STATS; | 2675 | last_i += NUM_MAIN_STATS; |
| 2675 | 2676 | ||
| 2676 | bitmap_set(stats_bitmap, last_i, NUM_PORT_STATS); | 2677 | bitmap_set(stats_bitmap->bitmap, last_i, NUM_PORT_STATS); |
| 2677 | last_i += NUM_PORT_STATS; | 2678 | last_i += NUM_PORT_STATS; |
| 2678 | 2679 | ||
| 2679 | if (!mlx4_is_slave(dev)) | 2680 | if (!mlx4_is_slave(dev)) |
| 2680 | bitmap_set(stats_bitmap, last_i, NUM_PKT_STATS); | 2681 | bitmap_set(stats_bitmap->bitmap, last_i, NUM_PKT_STATS); |
| 2681 | } | 2682 | } |
| 2682 | 2683 | ||
| 2683 | int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port, | 2684 | int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port, |
| @@ -2913,7 +2914,7 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port, | |||
| 2913 | queue_delayed_work(mdev->workqueue, &priv->service_task, | 2914 | queue_delayed_work(mdev->workqueue, &priv->service_task, |
| 2914 | SERVICE_TASK_DELAY); | 2915 | SERVICE_TASK_DELAY); |
| 2915 | 2916 | ||
| 2916 | mlx4_en_set_stats_bitmap(mdev->dev, priv->stats_bitmap); | 2917 | mlx4_en_set_stats_bitmap(mdev->dev, &priv->stats_bitmap); |
| 2917 | 2918 | ||
| 2918 | return 0; | 2919 | return 0; |
| 2919 | 2920 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h index a612bfd921f7..d5d971a408f2 100644 --- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h +++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | |||
| @@ -485,6 +485,11 @@ enum { | |||
| 485 | #define MLX4_EN_MAC_HASH_SIZE (1 << BITS_PER_BYTE) | 485 | #define MLX4_EN_MAC_HASH_SIZE (1 << BITS_PER_BYTE) |
| 486 | #define MLX4_EN_MAC_HASH_IDX 5 | 486 | #define MLX4_EN_MAC_HASH_IDX 5 |
| 487 | 487 | ||
| 488 | struct mlx4_en_stats_bitmap { | ||
| 489 | DECLARE_BITMAP(bitmap, NUM_ALL_STATS); | ||
| 490 | struct mutex mutex; /* for mutual access to stats bitmap */ | ||
| 491 | }; | ||
| 492 | |||
| 488 | struct mlx4_en_priv { | 493 | struct mlx4_en_priv { |
| 489 | struct mlx4_en_dev *mdev; | 494 | struct mlx4_en_dev *mdev; |
| 490 | struct mlx4_en_port_profile *prof; | 495 | struct mlx4_en_port_profile *prof; |
| @@ -561,7 +566,7 @@ struct mlx4_en_priv { | |||
| 561 | struct mlx4_en_perf_stats pstats; | 566 | struct mlx4_en_perf_stats pstats; |
| 562 | struct mlx4_en_pkt_stats pkstats; | 567 | struct mlx4_en_pkt_stats pkstats; |
| 563 | struct mlx4_en_port_stats port_stats; | 568 | struct mlx4_en_port_stats port_stats; |
| 564 | DECLARE_BITMAP(stats_bitmap, NUM_ALL_STATS); | 569 | struct mlx4_en_stats_bitmap stats_bitmap; |
| 565 | struct list_head mc_list; | 570 | struct list_head mc_list; |
| 566 | struct list_head curr_list; | 571 | struct list_head curr_list; |
| 567 | u64 broadcast_id; | 572 | u64 broadcast_id; |
| @@ -731,7 +736,7 @@ int mlx4_en_start_port(struct net_device *dev); | |||
| 731 | void mlx4_en_stop_port(struct net_device *dev, int detach); | 736 | void mlx4_en_stop_port(struct net_device *dev, int detach); |
| 732 | 737 | ||
| 733 | void mlx4_en_set_stats_bitmap(struct mlx4_dev *dev, | 738 | void mlx4_en_set_stats_bitmap(struct mlx4_dev *dev, |
| 734 | unsigned long *stats_bitmap); | 739 | struct mlx4_en_stats_bitmap *stats_bitmap); |
| 735 | 740 | ||
| 736 | void mlx4_en_free_resources(struct mlx4_en_priv *priv); | 741 | void mlx4_en_free_resources(struct mlx4_en_priv *priv); |
| 737 | int mlx4_en_alloc_resources(struct mlx4_en_priv *priv); | 742 | int mlx4_en_alloc_resources(struct mlx4_en_priv *priv); |
