bnxt_en: Add page info to struct bnxt_ctx_mem_type
authorMichael Chan <michael.chan@broadcom.com>
Mon, 20 Nov 2023 23:43:56 +0000 (15:43 -0800)
committerJakub Kicinski <kuba@kernel.org>
Wed, 22 Nov 2023 01:32:48 +0000 (17:32 -0800)
This will further improve the organization of the bnxt_ctx_mem_info
structure by moving the standalone page info structures into the
bnxt_ctx_mem_type array.  Add the allocation and free logic first and
the next patch will migrate to use the new infrastructure.

Reviewed-by: Somnath Kotur <somnath.kotur@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Link: https://lore.kernel.org/r/20231120234405.194542-5-michael.chan@broadcom.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/broadcom/bnxt/bnxt.c
drivers/net/ethernet/broadcom/bnxt/bnxt.h

index df25b559ee457a011c20a02476c0c3c0e3efa591..3b18bcee151a80ddb3a5e5e7ac9356299299f374 100644 (file)
@@ -7187,6 +7187,27 @@ static void bnxt_init_ctx_initializer(struct bnxt_ctx_mem_type *ctxm,
                ctxm->init_value = 0;
 }
 
+static int bnxt_alloc_all_ctx_pg_info(struct bnxt *bp, int ctx_max)
+{
+       struct bnxt_ctx_mem_info *ctx = bp->ctx;
+       u16 type;
+
+       for (type = 0; type < ctx_max; type++) {
+               struct bnxt_ctx_mem_type *ctxm = &ctx->ctx_arr[type];
+               int n = 1;
+
+               if (!ctxm->max_entries)
+                       continue;
+
+               if (ctxm->instance_bmap)
+                       n = hweight32(ctxm->instance_bmap);
+               ctxm->pg_info = kcalloc(n, sizeof(*ctxm->pg_info), GFP_KERNEL);
+               if (!ctxm->pg_info)
+                       return -ENOMEM;
+       }
+       return 0;
+}
+
 static int bnxt_hwrm_func_backing_store_qcaps(struct bnxt *bp)
 {
        struct hwrm_func_backing_store_qcaps_output *resp;
@@ -7298,6 +7319,7 @@ static int bnxt_hwrm_func_backing_store_qcaps(struct bnxt *bp)
                }
                for (i = 0; i < tqm_rings; i++, ctx_pg++)
                        ctx->tqm_mem[i] = ctx_pg;
+               rc = bnxt_alloc_all_ctx_pg_info(bp, BNXT_CTX_MAX);
        } else {
                rc = 0;
        }
@@ -7564,6 +7586,7 @@ static void bnxt_free_ctx_pg_tbls(struct bnxt *bp,
 void bnxt_free_ctx_mem(struct bnxt *bp)
 {
        struct bnxt_ctx_mem_info *ctx = bp->ctx;
+       u16 type;
        int i;
 
        if (!ctx)
@@ -7583,6 +7606,14 @@ void bnxt_free_ctx_mem(struct bnxt *bp)
        bnxt_free_ctx_pg_tbls(bp, &ctx->cq_mem);
        bnxt_free_ctx_pg_tbls(bp, &ctx->srq_mem);
        bnxt_free_ctx_pg_tbls(bp, &ctx->qp_mem);
+
+       for (type = 0; type < BNXT_CTX_MAX; type++) {
+               struct bnxt_ctx_mem_type *ctxm = &ctx->ctx_arr[type];
+
+               kfree(ctxm->pg_info);
+               ctxm->pg_info = NULL;
+       }
+
        ctx->flags &= ~BNXT_CTX_FLAG_INITED;
        kfree(ctx);
        bp->ctx = NULL;
index 757d2edb8c055cf74ac1f175dc8cf3aacc201aa7..7e67df57b8af4ec2b316f36b86372db45b3b55dc 100644 (file)
@@ -1573,6 +1573,7 @@ struct bnxt_ctx_mem_type {
                };
                u32     split[BNXT_MAX_SPLIT_ENTRY];
        };
+       struct bnxt_ctx_pg_info *pg_info;
 };
 
 #define BNXT_CTX_MRAV_AV_SPLIT_ENTRY   0