Skip to content

Commit 6d6c793

Browse files
rogerqdavem330
authored andcommitted
net: ethernet: ti: am65_cpsw: move am65_cpsw_put_page() out of am65_cpsw_run_xdp()
This allows us to re-use am65_cpsw_run_xdp() for zero copy case. Add AM65_CPSW_XDP_TX case for successful XDP_TX so we don't free the page while in flight. Signed-off-by: Roger Quadros <[email protected]> Reviewed-by: Simon Horman <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 09057ce commit 6d6c793

File tree

1 file changed

+8
-5
lines changed

1 file changed

+8
-5
lines changed

drivers/net/ethernet/ti/am65-cpsw-nuss.c

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@
164164
#define AM65_CPSW_CPPI_TX_PKT_TYPE 0x7
165165

166166
/* XDP */
167+
#define AM65_CPSW_XDP_TX BIT(2)
167168
#define AM65_CPSW_XDP_CONSUMED BIT(1)
168169
#define AM65_CPSW_XDP_REDIRECT BIT(0)
169170
#define AM65_CPSW_XDP_PASS 0
@@ -1177,7 +1178,6 @@ static int am65_cpsw_run_xdp(struct am65_cpsw_rx_flow *flow,
11771178
int cpu = smp_processor_id();
11781179
struct xdp_frame *xdpf;
11791180
struct bpf_prog *prog;
1180-
struct page *page;
11811181
int pkt_len;
11821182
u32 act;
11831183
int err;
@@ -1212,7 +1212,7 @@ static int am65_cpsw_run_xdp(struct am65_cpsw_rx_flow *flow,
12121212
goto drop;
12131213

12141214
dev_sw_netstats_rx_add(ndev, pkt_len);
1215-
return AM65_CPSW_XDP_CONSUMED;
1215+
return AM65_CPSW_XDP_TX;
12161216
case XDP_REDIRECT:
12171217
if (unlikely(xdp_do_redirect(ndev, xdp, prog)))
12181218
goto drop;
@@ -1230,9 +1230,6 @@ static int am65_cpsw_run_xdp(struct am65_cpsw_rx_flow *flow,
12301230
ndev->stats.rx_dropped++;
12311231
}
12321232

1233-
page = virt_to_head_page(xdp->data);
1234-
am65_cpsw_put_page(flow, page, true);
1235-
12361233
return ret;
12371234
}
12381235

@@ -1331,6 +1328,12 @@ static int am65_cpsw_nuss_rx_packets(struct am65_cpsw_rx_flow *flow,
13311328
xdp_prepare_buff(&xdp, page_addr, AM65_CPSW_HEADROOM,
13321329
pkt_len, false);
13331330
*xdp_state = am65_cpsw_run_xdp(flow, port, &xdp, &pkt_len);
1331+
if (*xdp_state == AM65_CPSW_XDP_CONSUMED) {
1332+
page = virt_to_head_page(xdp.data);
1333+
am65_cpsw_put_page(flow, page, true);
1334+
goto allocate;
1335+
}
1336+
13341337
if (*xdp_state != AM65_CPSW_XDP_PASS)
13351338
goto allocate;
13361339

0 commit comments

Comments
 (0)