From: Haggai Abramovsky <hag...@mellanox.com>

Add new database that stores all the QPs and XSRQs context. Insertions
and deletions to the database are done using the object's user-index.

This database will allow us to retrieve the objects; QPs and XSRQs; by
their user-index in the poll_one.

Signed-off-by: Haggai Abramovsky <hag...@mellanox.com>
---
 src/mlx5.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/mlx5.h | 24 ++++++++++++++++++++++
 2 files changed, 91 insertions(+)

diff --git a/src/mlx5.c b/src/mlx5.c
index e44898a..dc4c5c4 100644
--- a/src/mlx5.c
+++ b/src/mlx5.c
@@ -128,6 +128,73 @@ static int read_number_from_line(const char *line, int 
*value)
        return 0;
 }
 
+static int32_t get_free_uidx(struct mlx5_context *ctx)
+{
+       int32_t tind;
+       int32_t i;
+
+       for (tind = 0; tind < MLX5_UIDX_TABLE_SIZE; tind++) {
+               if (ctx->uidx_table[tind].refcnt < MLX5_UIDX_TABLE_MASK)
+                       break;
+       }
+
+       if (tind == MLX5_UIDX_TABLE_SIZE)
+               return -1;
+
+       if (!ctx->uidx_table[tind].refcnt)
+               return tind << MLX5_UIDX_TABLE_SHIFT;
+
+       for (i = 0; i < MLX5_UIDX_TABLE_MASK + 1; i++) {
+               if (!ctx->uidx_table[tind].table[i])
+                       break;
+       }
+
+       return (tind << MLX5_UIDX_TABLE_SHIFT) | i;
+}
+
+int32_t mlx5_store_uidx(struct mlx5_context *ctx, void *rsc)
+{
+       int32_t tind;
+       int32_t uidx;
+
+       pthread_mutex_lock(&ctx->uidx_table_mutex);
+       uidx = get_free_uidx(ctx);
+       if (uidx < 0)
+               goto out;
+
+       tind = uidx >> MLX5_UIDX_TABLE_SHIFT;
+
+       if (!ctx->uidx_table[tind].refcnt) {
+               ctx->uidx_table[tind].table = calloc(MLX5_UIDX_TABLE_MASK + 1,
+                                                    sizeof(void *));
+               if (!ctx->uidx_table[tind].table) {
+                       uidx = -1;
+                       goto out;
+               }
+       }
+
+       ++ctx->uidx_table[tind].refcnt;
+       ctx->uidx_table[tind].table[uidx & MLX5_UIDX_TABLE_MASK] = rsc;
+
+out:
+       pthread_mutex_unlock(&ctx->uidx_table_mutex);
+       return uidx;
+}
+
+void mlx5_clear_uidx(struct mlx5_context *ctx, uint32_t uidx)
+{
+       int tind = uidx >> MLX5_UIDX_TABLE_SHIFT;
+
+       pthread_mutex_lock(&ctx->uidx_table_mutex);
+
+       if (!--ctx->uidx_table[tind].refcnt)
+               free(ctx->uidx_table[tind].table);
+       else
+               ctx->uidx_table[tind].table[uidx & MLX5_UIDX_TABLE_MASK] = NULL;
+
+       pthread_mutex_unlock(&ctx->uidx_table_mutex);
+}
+
 static int mlx5_is_sandy_bridge(int *num_cores)
 {
        char line[128];
diff --git a/src/mlx5.h b/src/mlx5.h
index d8ce908..dd618bd 100644
--- a/src/mlx5.h
+++ b/src/mlx5.h
@@ -165,6 +165,12 @@ enum {
 };
 
 enum {
+       MLX5_UIDX_TABLE_SHIFT           = 12,
+       MLX5_UIDX_TABLE_MASK            = (1 << MLX5_UIDX_TABLE_SHIFT) - 1,
+       MLX5_UIDX_TABLE_SIZE            = 1 << (24 - MLX5_UIDX_TABLE_SHIFT),
+};
+
+enum {
        MLX5_SRQ_TABLE_SHIFT            = 12,
        MLX5_SRQ_TABLE_MASK             = (1 << MLX5_SRQ_TABLE_SHIFT) - 1,
        MLX5_SRQ_TABLE_SIZE             = 1 << (24 - MLX5_SRQ_TABLE_SHIFT),
@@ -275,6 +281,12 @@ struct mlx5_context {
        }                               srq_table[MLX5_SRQ_TABLE_SIZE];
        pthread_mutex_t                 srq_table_mutex;
 
+       struct {
+               struct mlx5_resource  **table;
+               int                     refcnt;
+       }                               uidx_table[MLX5_UIDX_TABLE_SIZE];
+       pthread_mutex_t                 uidx_table_mutex;
+
        void                           *uar[MLX5_MAX_UAR_PAGES];
        struct mlx5_spinlock            lock32;
        struct mlx5_db_page            *db_list;
@@ -616,6 +628,8 @@ void mlx5_set_sq_sizes(struct mlx5_qp *qp, struct 
ibv_qp_cap *cap,
 struct mlx5_qp *mlx5_find_qp(struct mlx5_context *ctx, uint32_t qpn);
 int mlx5_store_qp(struct mlx5_context *ctx, uint32_t qpn, struct mlx5_qp *qp);
 void mlx5_clear_qp(struct mlx5_context *ctx, uint32_t qpn);
+int32_t mlx5_store_uidx(struct mlx5_context *ctx, void *rsc);
+void mlx5_clear_uidx(struct mlx5_context *ctx, uint32_t uidx);
 struct mlx5_srq *mlx5_find_srq(struct mlx5_context *ctx, uint32_t srqn);
 int mlx5_store_srq(struct mlx5_context *ctx, uint32_t srqn,
                   struct mlx5_srq *srq);
@@ -640,6 +654,16 @@ int mlx5_close_xrcd(struct ibv_xrcd *ib_xrcd);
 struct ibv_srq *mlx5_create_srq_ex(struct ibv_context *context,
                                   struct ibv_srq_init_attr_ex *attr);
 
+static inline void *mlx5_find_uidx(struct mlx5_context *ctx, uint32_t uidx)
+{
+       int tind = uidx >> MLX5_UIDX_TABLE_SHIFT;
+
+       if (likely(ctx->uidx_table[tind].refcnt))
+               return ctx->uidx_table[tind].table[uidx & MLX5_UIDX_TABLE_MASK];
+
+       return NULL;
+}
+
 static inline int mlx5_spin_lock(struct mlx5_spinlock *lock)
 {
        if (!mlx5_single_threaded)
-- 
1.8.3.1

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to