Skip to content

Commit

Permalink
bnxt_en: Don't use static arrays for completion ring pages
Browse files Browse the repository at this point in the history
We currently store these page addresses and DMA addreses in static
arrays.  On systems with 4K pages, we support up to 64 pages per
completion ring.  The actual number of pages for each completion ring
may be much less than 64.  For example, when the RX ring size is set
to the default 511 entries, only 16 completion ring pages are needed
per ring.

In the next patch, we'll be doubling the maximum number of completion
pages.  So we convert to allocate these arrays as needed instead of
declaring them statically.

Reviewed-by: Pavan Chebbi <pavan.chebbi@broadcom.com>
Reviewed-by: Somnath Kotur <somnath.kotur@broadcom.com>
Reviewed-by: Edwin Peer <edwin.peer@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Michael Chan authored and David S. Miller committed Aug 3, 2021
1 parent 0547ffe commit 03c7448
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 3 deletions.
65 changes: 65 additions & 0 deletions drivers/net/ethernet/broadcom/bnxt/bnxt.c
Original file line number Diff line number Diff line change
Expand Up @@ -3163,6 +3163,58 @@ static int bnxt_alloc_tx_rings(struct bnxt *bp)
return 0;
}

static void bnxt_free_cp_arrays(struct bnxt_cp_ring_info *cpr)
{
kfree(cpr->cp_desc_ring);
cpr->cp_desc_ring = NULL;
kfree(cpr->cp_desc_mapping);
cpr->cp_desc_mapping = NULL;
}

static int bnxt_alloc_cp_arrays(struct bnxt_cp_ring_info *cpr, int n)
{
cpr->cp_desc_ring = kcalloc(n, sizeof(*cpr->cp_desc_ring), GFP_KERNEL);
if (!cpr->cp_desc_ring)
return -ENOMEM;
cpr->cp_desc_mapping = kcalloc(n, sizeof(*cpr->cp_desc_mapping),
GFP_KERNEL);
if (!cpr->cp_desc_mapping)
return -ENOMEM;
return 0;
}

static void bnxt_free_all_cp_arrays(struct bnxt *bp)
{
int i;

if (!bp->bnapi)
return;
for (i = 0; i < bp->cp_nr_rings; i++) {
struct bnxt_napi *bnapi = bp->bnapi[i];

if (!bnapi)
continue;
bnxt_free_cp_arrays(&bnapi->cp_ring);
}
}

static int bnxt_alloc_all_cp_arrays(struct bnxt *bp)
{
int i, n = bp->cp_nr_pages;

for (i = 0; i < bp->cp_nr_rings; i++) {
struct bnxt_napi *bnapi = bp->bnapi[i];
int rc;

if (!bnapi)
continue;
rc = bnxt_alloc_cp_arrays(&bnapi->cp_ring, n);
if (rc)
return rc;
}
return 0;
}

static void bnxt_free_cp_rings(struct bnxt *bp)
{
int i;
Expand Down Expand Up @@ -3190,6 +3242,7 @@ static void bnxt_free_cp_rings(struct bnxt *bp)
if (cpr2) {
ring = &cpr2->cp_ring_struct;
bnxt_free_ring(bp, &ring->ring_mem);
bnxt_free_cp_arrays(cpr2);
kfree(cpr2);
cpr->cp_ring_arr[j] = NULL;
}
Expand All @@ -3208,6 +3261,12 @@ static struct bnxt_cp_ring_info *bnxt_alloc_cp_sub_ring(struct bnxt *bp)
if (!cpr)
return NULL;

rc = bnxt_alloc_cp_arrays(cpr, bp->cp_nr_pages);
if (rc) {
bnxt_free_cp_arrays(cpr);
kfree(cpr);
return NULL;
}
ring = &cpr->cp_ring_struct;
rmem = &ring->ring_mem;
rmem->nr_pages = bp->cp_nr_pages;
Expand All @@ -3218,6 +3277,7 @@ static struct bnxt_cp_ring_info *bnxt_alloc_cp_sub_ring(struct bnxt *bp)
rc = bnxt_alloc_ring(bp, rmem);
if (rc) {
bnxt_free_ring(bp, rmem);
bnxt_free_cp_arrays(cpr);
kfree(cpr);
cpr = NULL;
}
Expand Down Expand Up @@ -4253,6 +4313,7 @@ static void bnxt_free_mem(struct bnxt *bp, bool irq_re_init)
bnxt_free_tx_rings(bp);
bnxt_free_rx_rings(bp);
bnxt_free_cp_rings(bp);
bnxt_free_all_cp_arrays(bp);
bnxt_free_ntp_fltrs(bp, irq_re_init);
if (irq_re_init) {
bnxt_free_ring_stats(bp);
Expand Down Expand Up @@ -4373,6 +4434,10 @@ static int bnxt_alloc_mem(struct bnxt *bp, bool irq_re_init)
goto alloc_mem_err;
}

rc = bnxt_alloc_all_cp_arrays(bp);
if (rc)
goto alloc_mem_err;

bnxt_init_ring_struct(bp);

rc = bnxt_alloc_rx_rings(bp);
Expand Down
6 changes: 3 additions & 3 deletions drivers/net/ethernet/broadcom/bnxt/bnxt.h
Original file line number Diff line number Diff line change
Expand Up @@ -972,11 +972,11 @@ struct bnxt_cp_ring_info {
struct dim dim;

union {
struct tx_cmp *cp_desc_ring[MAX_CP_PAGES];
struct nqe_cn *nq_desc_ring[MAX_CP_PAGES];
struct tx_cmp **cp_desc_ring;
struct nqe_cn **nq_desc_ring;
};

dma_addr_t cp_desc_mapping[MAX_CP_PAGES];
dma_addr_t *cp_desc_mapping;

struct bnxt_stats_mem stats;
u32 hw_stats_ctx_id;
Expand Down

0 comments on commit 03c7448

Please sign in to comment.