mlx4_en: Using real number of rings as RSS map size
authorYevgeny Petrilin <yevgenyp@mellanox.co.il>
Fri, 7 Aug 2009 02:27:51 +0000 (19:27 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 7 Aug 2009 02:27:51 +0000 (19:27 -0700)
There is no point in using more QPs then actual number of receive rings.
If the RSS function for two streams gives the same result modulo number
of rings, they will arrive to the same RX ring anyway.

Signed-off-by: Yevgeny Petrilin <yevgenyp@mellanox.co.il>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/mlx4/en_main.c
drivers/net/mlx4/en_netdev.c
drivers/net/mlx4/en_rx.c
drivers/net/mlx4/mlx4_en.h

index 9ed4a158f895cedaf7e4fc441e7361944523d117..507e11fce9ed7f202e9d6aa59e3135326d6aa94d 100644 (file)
@@ -218,8 +218,9 @@ static void *mlx4_en_add(struct mlx4_dev *dev)
        mlx4_foreach_port(i, dev, MLX4_PORT_TYPE_ETH) {
                mlx4_info(mdev, "Using %d tx rings for port:%d\n",
                          mdev->profile.prof[i].tx_ring_num, i);
-               mdev->profile.prof[i].rx_ring_num =
-                       min_t(int, dev->caps.num_comp_vectors, MAX_RX_RINGS);
+               mdev->profile.prof[i].rx_ring_num = min_t(int,
+                       roundup_pow_of_two(dev->caps.num_comp_vectors),
+                       MAX_RX_RINGS);
                mlx4_info(mdev, "Defaulting to %d rx rings for port:%d\n",
                          mdev->profile.prof[i].rx_ring_num, i);
        }
index c8a24dcca7621112c460d019f67c5c90de7c6d00..f8bbc5a39e1597e915d68361867c92d781dfe632 100644 (file)
@@ -1011,9 +1011,6 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
        if (err)
                goto out;
 
-       /* Populate Rx default RSS mappings */
-       mlx4_en_set_default_rss_map(priv, &priv->rss_map, priv->rx_ring_num *
-                                               RSS_FACTOR, priv->rx_ring_num);
        /* Allocate page for receive rings */
        err = mlx4_alloc_hwq_res(mdev->dev, &priv->res,
                                MLX4_EN_PAGE_SIZE, MLX4_EN_PAGE_SIZE);
index 91bdfdfd431f214665e3b66c6c9028de3f64ff04..47b178e2b49e18ec06d31f57041a9e840871ff01 100644 (file)
@@ -835,23 +835,6 @@ void mlx4_en_calc_rx_buf(struct net_device *dev)
 
 /* RSS related functions */
 
-/* Calculate rss size and map each entry in rss table to rx ring */
-void mlx4_en_set_default_rss_map(struct mlx4_en_priv *priv,
-                                struct mlx4_en_rss_map *rss_map,
-                                int num_entries, int num_rings)
-{
-       int i;
-
-       rss_map->size = roundup_pow_of_two(num_entries);
-       en_dbg(DRV, priv, "Setting default RSS map of %d entires\n",
-              rss_map->size);
-
-       for (i = 0; i < rss_map->size; i++) {
-               rss_map->map[i] = i % num_rings;
-               en_dbg(DRV, priv, "Entry %d ---> ring %d\n", i, rss_map->map[i]);
-       }
-}
-
 static int mlx4_en_config_rss_qp(struct mlx4_en_priv *priv,
                                 int qpn, int srqn, int cqn,
                                 enum mlx4_qp_state *state,
@@ -902,16 +885,17 @@ int mlx4_en_config_rss_steer(struct mlx4_en_priv *priv)
        int good_qps = 0;
 
        en_dbg(DRV, priv, "Configuring rss steering\n");
-       err = mlx4_qp_reserve_range(mdev->dev, rss_map->size,
-                                   rss_map->size, &rss_map->base_qpn);
+       err = mlx4_qp_reserve_range(mdev->dev, priv->rx_ring_num,
+                                   priv->rx_ring_num,
+                                   &rss_map->base_qpn);
        if (err) {
-               en_err(priv, "Failed reserving %d qps\n", rss_map->size);
+               en_err(priv, "Failed reserving %d qps\n", priv->rx_ring_num);
                return err;
        }
 
-       for (i = 0; i < rss_map->size; i++) {
-               cqn = priv->rx_ring[rss_map->map[i]].cqn;
-               srqn = priv->rx_ring[rss_map->map[i]].srq.srqn;
+       for (i = 0; i < priv->rx_ring_num; i++) {
+               cqn = priv->rx_ring[i].cqn;
+               srqn = priv->rx_ring[i].srq.srqn;
                qpn = rss_map->base_qpn + i;
                err = mlx4_en_config_rss_qp(priv, qpn, srqn, cqn,
                                            &rss_map->state[i],
@@ -940,7 +924,7 @@ int mlx4_en_config_rss_steer(struct mlx4_en_priv *priv)
 
        ptr = ((void *) &context) + 0x3c;
        rss_context = (struct mlx4_en_rss_context *) ptr;
-       rss_context->base_qpn = cpu_to_be32(ilog2(rss_map->size) << 24 |
+       rss_context->base_qpn = cpu_to_be32(ilog2(priv->rx_ring_num) << 24 |
                                            (rss_map->base_qpn));
        rss_context->default_qpn = cpu_to_be32(rss_map->base_qpn);
        rss_context->hash_fn = rss_xor & 0x3;
@@ -967,7 +951,7 @@ rss_err:
                mlx4_qp_remove(mdev->dev, &rss_map->qps[i]);
                mlx4_qp_free(mdev->dev, &rss_map->qps[i]);
        }
-       mlx4_qp_release_range(mdev->dev, rss_map->base_qpn, rss_map->size);
+       mlx4_qp_release_range(mdev->dev, rss_map->base_qpn, priv->rx_ring_num);
        return err;
 }
 
@@ -983,13 +967,13 @@ void mlx4_en_release_rss_steer(struct mlx4_en_priv *priv)
        mlx4_qp_free(mdev->dev, &rss_map->indir_qp);
        mlx4_qp_release_range(mdev->dev, priv->base_qpn, 1);
 
-       for (i = 0; i < rss_map->size; i++) {
+       for (i = 0; i < priv->rx_ring_num; i++) {
                mlx4_qp_modify(mdev->dev, NULL, rss_map->state[i],
                               MLX4_QP_STATE_RST, NULL, 0, 0, &rss_map->qps[i]);
                mlx4_qp_remove(mdev->dev, &rss_map->qps[i]);
                mlx4_qp_free(mdev->dev, &rss_map->qps[i]);
        }
-       mlx4_qp_release_range(mdev->dev, rss_map->base_qpn, rss_map->size);
+       mlx4_qp_release_range(mdev->dev, rss_map->base_qpn, priv->rx_ring_num);
 }
 
 
index c7c5e86804ff9878e80654c1e0b98c56f059f2bb..2d76ff4c564bece3f82c5a58e0a68dae53acc1bb 100644 (file)
@@ -95,8 +95,6 @@
 #define MLX4_EN_PAGE_SIZE      (1 << MLX4_EN_PAGE_SHIFT)
 #define MAX_TX_RINGS           16
 #define MAX_RX_RINGS           16
-#define MAX_RSS_MAP_SIZE       64
-#define RSS_FACTOR             2
 #define TXBB_SIZE              64
 #define HEADROOM               (2048 / TXBB_SIZE + 1)
 #define STAMP_STRIDE           64
@@ -377,11 +375,9 @@ struct mlx4_en_dev {
 
 
 struct mlx4_en_rss_map {
-       int size;
        int base_qpn;
-       u16 map[MAX_RSS_MAP_SIZE];
-       struct mlx4_qp qps[MAX_RSS_MAP_SIZE];
-       enum mlx4_qp_state state[MAX_RSS_MAP_SIZE];
+       struct mlx4_qp qps[MAX_RX_RINGS];
+       enum mlx4_qp_state state[MAX_RX_RINGS];
        struct mlx4_qp indir_qp;
        enum mlx4_qp_state indir_state;
 };
@@ -555,9 +551,6 @@ int mlx4_en_map_buffer(struct mlx4_buf *buf);
 void mlx4_en_unmap_buffer(struct mlx4_buf *buf);
 
 void mlx4_en_calc_rx_buf(struct net_device *dev);
-void mlx4_en_set_default_rss_map(struct mlx4_en_priv *priv,
-                                struct mlx4_en_rss_map *rss_map,
-                                int num_entries, int num_rings);
 int mlx4_en_config_rss_steer(struct mlx4_en_priv *priv);
 void mlx4_en_release_rss_steer(struct mlx4_en_priv *priv);
 int mlx4_en_free_tx_buf(struct net_device *dev, struct mlx4_en_tx_ring *ring);