Skip to content

Commit

Permalink
bnxt_en: Refactor bnxt_free_tx_rings() to free per TX ring
Browse files Browse the repository at this point in the history
Modify bnxt_free_tx_rings() to free the skbs per TX ring.
This will be useful later in the series.

Reviewed-by: Michal Swiatkowski <michal.swiatkowski@linux.intel.com>
Signed-off-by: Somnath Kotur <somnath.kotur@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Link: https://patch.msgid.link/20250213011240.1640031-6-michael.chan@broadcom.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
  • Loading branch information
Somnath Kotur authored and Jakub Kicinski committed Feb 15, 2025
1 parent f33a508 commit 09cc58d
Showing 1 changed file with 61 additions and 54 deletions.
115 changes: 61 additions & 54 deletions drivers/net/ethernet/broadcom/bnxt/bnxt.c
Original file line number Diff line number Diff line change
Expand Up @@ -3314,74 +3314,81 @@ static int bnxt_poll_p5(struct napi_struct *napi, int budget)
return work_done;
}

static void bnxt_free_tx_skbs(struct bnxt *bp)
static void bnxt_free_one_tx_ring_skbs(struct bnxt *bp,
struct bnxt_tx_ring_info *txr, int idx)
{
int i, max_idx;
struct pci_dev *pdev = bp->pdev;

if (!bp->tx_ring)
return;

max_idx = bp->tx_nr_pages * TX_DESC_CNT;
for (i = 0; i < bp->tx_nr_rings; i++) {
struct bnxt_tx_ring_info *txr = &bp->tx_ring[i];
int j;

if (!txr->tx_buf_ring)
for (i = 0; i < max_idx;) {
struct bnxt_sw_tx_bd *tx_buf = &txr->tx_buf_ring[i];
struct sk_buff *skb;
int j, last;

if (idx < bp->tx_nr_rings_xdp &&
tx_buf->action == XDP_REDIRECT) {
dma_unmap_single(&pdev->dev,
dma_unmap_addr(tx_buf, mapping),
dma_unmap_len(tx_buf, len),
DMA_TO_DEVICE);
xdp_return_frame(tx_buf->xdpf);
tx_buf->action = 0;
tx_buf->xdpf = NULL;
i++;
continue;
}

for (j = 0; j < max_idx;) {
struct bnxt_sw_tx_bd *tx_buf = &txr->tx_buf_ring[j];
struct sk_buff *skb;
int k, last;

if (i < bp->tx_nr_rings_xdp &&
tx_buf->action == XDP_REDIRECT) {
dma_unmap_single(&pdev->dev,
dma_unmap_addr(tx_buf, mapping),
dma_unmap_len(tx_buf, len),
DMA_TO_DEVICE);
xdp_return_frame(tx_buf->xdpf);
tx_buf->action = 0;
tx_buf->xdpf = NULL;
j++;
continue;
}
skb = tx_buf->skb;
if (!skb) {
i++;
continue;
}

skb = tx_buf->skb;
if (!skb) {
j++;
continue;
}
tx_buf->skb = NULL;

tx_buf->skb = NULL;
if (tx_buf->is_push) {
dev_kfree_skb(skb);
i += 2;
continue;
}

if (tx_buf->is_push) {
dev_kfree_skb(skb);
j += 2;
continue;
}
dma_unmap_single(&pdev->dev,
dma_unmap_addr(tx_buf, mapping),
skb_headlen(skb),
DMA_TO_DEVICE);

dma_unmap_single(&pdev->dev,
dma_unmap_addr(tx_buf, mapping),
skb_headlen(skb),
DMA_TO_DEVICE);
last = tx_buf->nr_frags;
i += 2;
for (j = 0; j < last; j++, i++) {
int ring_idx = i & bp->tx_ring_mask;
skb_frag_t *frag = &skb_shinfo(skb)->frags[j];

last = tx_buf->nr_frags;
j += 2;
for (k = 0; k < last; k++, j++) {
int ring_idx = j & bp->tx_ring_mask;
skb_frag_t *frag = &skb_shinfo(skb)->frags[k];

tx_buf = &txr->tx_buf_ring[ring_idx];
dma_unmap_page(
&pdev->dev,
dma_unmap_addr(tx_buf, mapping),
skb_frag_size(frag), DMA_TO_DEVICE);
}
dev_kfree_skb(skb);
tx_buf = &txr->tx_buf_ring[ring_idx];
dma_unmap_page(&pdev->dev,
dma_unmap_addr(tx_buf, mapping),
skb_frag_size(frag), DMA_TO_DEVICE);
}
netdev_tx_reset_queue(netdev_get_tx_queue(bp->dev, i));
dev_kfree_skb(skb);
}
netdev_tx_reset_queue(netdev_get_tx_queue(bp->dev, idx));
}

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

if (!bp->tx_ring)
return;

for (i = 0; i < bp->tx_nr_rings; i++) {
struct bnxt_tx_ring_info *txr = &bp->tx_ring[i];

if (!txr->tx_buf_ring)
continue;

bnxt_free_one_tx_ring_skbs(bp, txr, i);
}
}

Expand Down

0 comments on commit 09cc58d

Please sign in to comment.