>From b652a738eb5acbb01f0d0a143a12a7bdcc86d002 Mon Sep 17 00:00:00 2001
From: Yevgeny Petrilin <[EMAIL PROTECTED]>
Date: Tue, 20 May 2008 13:51:00 +0300
Subject: [PATCH] mlx4: Default value for automatic completion vector selection

When the vector number passed to mlx4_cq_alloc is MLX4_ANY_VECTOR (0xff),
the driver selects the completion vector that has the least CQs attached
to it and attaches the CQ to the chosen vector.

Signed-off-by: Yevgeny Petrilin <[EMAIL PROTECTED]>
---
 drivers/net/mlx4/cq.c       |   22 +++++++++++++++++++++-
 drivers/net/mlx4/mlx4.h     |    1 +
 include/linux/mlx4/device.h |    4 ++++
 3 files changed, 26 insertions(+), 1 deletions(-)

diff --git a/drivers/net/mlx4/cq.c b/drivers/net/mlx4/cq.c
index 9be895f..7f0bdf6 100644
--- a/drivers/net/mlx4/cq.c
+++ b/drivers/net/mlx4/cq.c
@@ -187,6 +187,22 @@ int mlx4_cq_resize(struct mlx4_dev *dev, struct mlx4_cq 
*cq,
 }
 EXPORT_SYMBOL_GPL(mlx4_cq_resize);

+static int mlx4_find_least_loaded_vector(struct mlx4_priv *priv)
+{
+       int i;
+       int index = 0;
+       int min = priv->eq_table.eq[MLX4_EQ_COMP_CPU0].load;
+
+       for (i = 1; i < priv->dev.caps.num_comp_vectors; i++) {
+               if (priv->eq_table.eq[MLX4_EQ_COMP_CPU0 + i].load < min) {
+                       index = i;
+                       min = priv->eq_table.eq[MLX4_EQ_COMP_CPU0 + i].load;
+               }
+       }
+
+       return index;
+}
+
 int mlx4_cq_alloc(struct mlx4_dev *dev, int nent, struct mlx4_mtt *mtt,
                  struct mlx4_uar *uar, u64 db_rec, struct mlx4_cq *cq,
                  unsigned vector, int collapsed)
@@ -228,7 +244,9 @@ int mlx4_cq_alloc(struct mlx4_dev *dev, int nent, struct 
mlx4_mtt *mtt,
        cq_context->flags           = cpu_to_be32(!!collapsed << 18);
        cq_context->logsize_usrpage = cpu_to_be32((ilog2(nent) << 24) | 
uar->index);

-       if (vector >= dev->caps.num_comp_vectors) {
+       if (vector == MLX4_ANY_VECTOR)
+               vector = mlx4_find_least_loaded_vector(priv);
+       else if (vector >= dev->caps.num_comp_vectors) {
                err = -EINVAL;
                goto err_radix;
        }
@@ -248,6 +266,7 @@ int mlx4_cq_alloc(struct mlx4_dev *dev, int nent, struct 
mlx4_mtt *mtt,
        if (err)
                goto err_radix;

+       priv->eq_table.eq[cq->comp_eq_idx].load++;
        cq->cons_index = 0;
        cq->arm_sn     = 1;
        cq->uar        = uar;
@@ -285,6 +304,7 @@ void mlx4_cq_free(struct mlx4_dev *dev, struct mlx4_cq *cq)
                mlx4_warn(dev, "HW2SW_CQ failed (%d) for CQN %06x\n", err, 
cq->cqn);

        synchronize_irq(priv->eq_table.eq[cq->comp_eq_idx].irq);
+       priv->eq_table.eq[cq->comp_eq_idx].load--;

        spin_lock_irq(&cq_table->lock);
        radix_tree_delete(&cq_table->tree, cq->cqn);
diff --git a/drivers/net/mlx4/mlx4.h b/drivers/net/mlx4/mlx4.h
index 4435272..b2d103a 100644
--- a/drivers/net/mlx4/mlx4.h
+++ b/drivers/net/mlx4/mlx4.h
@@ -144,6 +144,7 @@ struct mlx4_eq {
        u16                     irq;
        u16                     have_irq;
        int                     nent;
+       int                     load;
        struct mlx4_buf_list   *page_list;
        struct mlx4_mtt         mtt;
 };
diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h
index 7cbe078..3cfe5c1 100644
--- a/include/linux/mlx4/device.h
+++ b/include/linux/mlx4/device.h
@@ -151,6 +151,10 @@ enum {
        MLX4_NUM_FEXCH          = 64 * 1024,
 };

+enum {
+       MLX4_ANY_VECTOR         = 0xff
+};
+
 static inline u64 mlx4_fw_ver(u64 major, u64 minor, u64 subminor)
 {
        return (major << 32) | (minor << 16) | subminor;
-- 
1.5.4

_______________________________________________
general mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to