aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEran Ben Elisha <eranbe@mellanox.com>2015-03-30 10:45:24 -0400
committerDavid S. Miller <davem@davemloft.net>2015-03-31 16:36:50 -0400
commit3da8a36cc5c2a172bb42f8dc89638f5b41d7d7a6 (patch)
treedd68732106614f7711cb3f72e886a2d0c3b5d10b
parent6fcd27354b36fb9234aabeecde337b40d5a16842 (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.c6
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/en_netdev.c25
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/mlx4_en.h9
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
2651void mlx4_en_set_stats_bitmap(struct mlx4_dev *dev, 2651void 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
2683int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port, 2684int 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
488struct mlx4_en_stats_bitmap {
489 DECLARE_BITMAP(bitmap, NUM_ALL_STATS);
490 struct mutex mutex; /* for mutual access to stats bitmap */
491};
492
488struct mlx4_en_priv { 493struct 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);
731void mlx4_en_stop_port(struct net_device *dev, int detach); 736void mlx4_en_stop_port(struct net_device *dev, int detach);
732 737
733void mlx4_en_set_stats_bitmap(struct mlx4_dev *dev, 738void mlx4_en_set_stats_bitmap(struct mlx4_dev *dev,
734 unsigned long *stats_bitmap); 739 struct mlx4_en_stats_bitmap *stats_bitmap);
735 740
736void mlx4_en_free_resources(struct mlx4_en_priv *priv); 741void mlx4_en_free_resources(struct mlx4_en_priv *priv);
737int mlx4_en_alloc_resources(struct mlx4_en_priv *priv); 742int mlx4_en_alloc_resources(struct mlx4_en_priv *priv);