Skip to content

Commit 482ec34

Browse files
LorenzoBianconiborkmann
authored andcommitted
net, xdp: Introduce xdp_prepare_buff utility routine
Introduce xdp_prepare_buff utility routine to initialize per-descriptor xdp_buff fields (e.g. xdp_buff pointers). Rely on xdp_prepare_buff() in all XDP capable drivers. Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Reviewed-by: Alexander Duyck <alexanderduyck@fb.com> Acked-by: Jesper Dangaard Brouer <brouer@redhat.com> Acked-by: John Fastabend <john.fastabend@gmail.com> Acked-by: Shay Agroskin <shayagr@amazon.com> Acked-by: Martin Habets <habetsm.xilinx@gmail.com> Acked-by: Camelia Groza <camelia.groza@nxp.com> Acked-by: Marcin Wojtas <mw@semihalf.com> Link: https://lore.kernel.org/bpf/45f46f12295972a97da8ca01990b3e71501e9d89.1608670965.git.lorenzo@kernel.org
1 parent 25e8470 commit 482ec34

File tree

28 files changed

+105
-152
lines changed

28 files changed

+105
-152
lines changed

drivers/net/ethernet/amazon/ena/ena_netdev.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1585,10 +1585,9 @@ static int ena_xdp_handle_buff(struct ena_ring *rx_ring, struct xdp_buff *xdp)
15851585
int ret;
15861586

15871587
rx_info = &rx_ring->rx_buffer_info[rx_ring->ena_bufs[0].req_id];
1588-
xdp->data = page_address(rx_info->page) + rx_info->page_offset;
1589-
xdp_set_data_meta_invalid(xdp);
1590-
xdp->data_hard_start = page_address(rx_info->page);
1591-
xdp->data_end = xdp->data + rx_ring->ena_bufs[0].len;
1588+
xdp_prepare_buff(xdp, page_address(rx_info->page),
1589+
rx_info->page_offset,
1590+
rx_ring->ena_bufs[0].len, false);
15921591
/* If for some reason we received a bigger packet than
15931592
* we expect, then we simply drop it
15941593
*/

drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -135,10 +135,7 @@ bool bnxt_rx_xdp(struct bnxt *bp, struct bnxt_rx_ring_info *rxr, u16 cons,
135135
txr = rxr->bnapi->tx_ring;
136136
/* BNXT_RX_PAGE_MODE(bp) when XDP enabled */
137137
xdp_init_buff(&xdp, PAGE_SIZE, &rxr->xdp_rxq);
138-
xdp.data_hard_start = *data_ptr - offset;
139-
xdp.data = *data_ptr;
140-
xdp_set_data_meta_invalid(&xdp);
141-
xdp.data_end = *data_ptr + *len;
138+
xdp_prepare_buff(&xdp, *data_ptr - offset, offset, *len, false);
142139
orig_data = xdp.data;
143140

144141
rcu_read_lock();

drivers/net/ethernet/cavium/thunder/nicvf_main.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -530,6 +530,7 @@ static inline bool nicvf_xdp_rx(struct nicvf *nic, struct bpf_prog *prog,
530530
struct cqe_rx_t *cqe_rx, struct snd_queue *sq,
531531
struct rcv_queue *rq, struct sk_buff **skb)
532532
{
533+
unsigned char *hard_start, *data;
533534
struct xdp_buff xdp;
534535
struct page *page;
535536
u32 action;
@@ -549,10 +550,9 @@ static inline bool nicvf_xdp_rx(struct nicvf *nic, struct bpf_prog *prog,
549550

550551
xdp_init_buff(&xdp, RCV_FRAG_LEN + XDP_PACKET_HEADROOM,
551552
&rq->xdp_rxq);
552-
xdp.data_hard_start = page_address(page);
553-
xdp.data = (void *)cpu_addr;
554-
xdp_set_data_meta_invalid(&xdp);
555-
xdp.data_end = xdp.data + len;
553+
hard_start = page_address(page);
554+
data = (unsigned char *)cpu_addr;
555+
xdp_prepare_buff(&xdp, hard_start, data - hard_start, len, false);
556556
orig_data = xdp.data;
557557

558558
rcu_read_lock();

drivers/net/ethernet/freescale/dpaa/dpaa_eth.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2534,10 +2534,8 @@ static u32 dpaa_run_xdp(struct dpaa_priv *priv, struct qm_fd *fd, void *vaddr,
25342534

25352535
xdp_init_buff(&xdp, DPAA_BP_RAW_SIZE - DPAA_TX_PRIV_DATA_SIZE,
25362536
&dpaa_fq->xdp_rxq);
2537-
xdp.data = vaddr + fd_off;
2538-
xdp.data_meta = xdp.data;
2539-
xdp.data_hard_start = xdp.data - XDP_PACKET_HEADROOM;
2540-
xdp.data_end = xdp.data + qm_fd_get_length(fd);
2537+
xdp_prepare_buff(&xdp, vaddr + fd_off - XDP_PACKET_HEADROOM,
2538+
XDP_PACKET_HEADROOM, qm_fd_get_length(fd), true);
25412539

25422540
/* We reserve a fixed headroom of 256 bytes under the erratum and we
25432541
* offer it all to XDP programs to use. If no room is left for the

drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -350,22 +350,18 @@ static u32 dpaa2_eth_run_xdp(struct dpaa2_eth_priv *priv,
350350
struct bpf_prog *xdp_prog;
351351
struct xdp_buff xdp;
352352
u32 xdp_act = XDP_PASS;
353-
int err;
353+
int err, offset;
354354

355355
rcu_read_lock();
356356

357357
xdp_prog = READ_ONCE(ch->xdp.prog);
358358
if (!xdp_prog)
359359
goto out;
360360

361-
xdp_init_buff(&xdp,
362-
DPAA2_ETH_RX_BUF_RAW_SIZE -
363-
(dpaa2_fd_get_offset(fd) - XDP_PACKET_HEADROOM),
364-
&ch->xdp_rxq);
365-
xdp.data = vaddr + dpaa2_fd_get_offset(fd);
366-
xdp.data_end = xdp.data + dpaa2_fd_get_len(fd);
367-
xdp.data_hard_start = xdp.data - XDP_PACKET_HEADROOM;
368-
xdp_set_data_meta_invalid(&xdp);
361+
offset = dpaa2_fd_get_offset(fd) - XDP_PACKET_HEADROOM;
362+
xdp_init_buff(&xdp, DPAA2_ETH_RX_BUF_RAW_SIZE - offset, &ch->xdp_rxq);
363+
xdp_prepare_buff(&xdp, vaddr + offset, XDP_PACKET_HEADROOM,
364+
dpaa2_fd_get_len(fd), false);
369365

370366
xdp_act = bpf_prog_run_xdp(xdp_prog, &xdp);
371367

drivers/net/ethernet/intel/i40e/i40e_txrx.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2406,12 +2406,12 @@ static int i40e_clean_rx_irq(struct i40e_ring *rx_ring, int budget)
24062406

24072407
/* retrieve a buffer from the ring */
24082408
if (!skb) {
2409-
xdp.data = page_address(rx_buffer->page) +
2410-
rx_buffer->page_offset;
2411-
xdp.data_meta = xdp.data;
2412-
xdp.data_hard_start = xdp.data -
2413-
i40e_rx_offset(rx_ring);
2414-
xdp.data_end = xdp.data + size;
2409+
unsigned int offset = i40e_rx_offset(rx_ring);
2410+
unsigned char *hard_start;
2411+
2412+
hard_start = page_address(rx_buffer->page) +
2413+
rx_buffer->page_offset - offset;
2414+
xdp_prepare_buff(&xdp, hard_start, offset, size, true);
24152415
#if (PAGE_SIZE > 4096)
24162416
/* At larger PAGE_SIZE, frame_sz depend on len size */
24172417
xdp.frame_sz = i40e_rx_frame_truesize(rx_ring, size);

drivers/net/ethernet/intel/ice/ice_txrx.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1104,8 +1104,10 @@ int ice_clean_rx_irq(struct ice_ring *rx_ring, int budget)
11041104

11051105
/* start the loop to process Rx packets bounded by 'budget' */
11061106
while (likely(total_rx_pkts < (unsigned int)budget)) {
1107+
unsigned int offset = ice_rx_offset(rx_ring);
11071108
union ice_32b_rx_flex_desc *rx_desc;
11081109
struct ice_rx_buf *rx_buf;
1110+
unsigned char *hard_start;
11091111
struct sk_buff *skb;
11101112
unsigned int size;
11111113
u16 stat_err_bits;
@@ -1151,10 +1153,9 @@ int ice_clean_rx_irq(struct ice_ring *rx_ring, int budget)
11511153
goto construct_skb;
11521154
}
11531155

1154-
xdp.data = page_address(rx_buf->page) + rx_buf->page_offset;
1155-
xdp.data_hard_start = xdp.data - ice_rx_offset(rx_ring);
1156-
xdp.data_meta = xdp.data;
1157-
xdp.data_end = xdp.data + size;
1156+
hard_start = page_address(rx_buf->page) + rx_buf->page_offset -
1157+
offset;
1158+
xdp_prepare_buff(&xdp, hard_start, offset, size, true);
11581159
#if (PAGE_SIZE > 4096)
11591160
/* At larger PAGE_SIZE, frame_sz depend on len size */
11601161
xdp.frame_sz = ice_rx_frame_truesize(rx_ring, size);

drivers/net/ethernet/intel/igb/igb_main.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8715,12 +8715,12 @@ static int igb_clean_rx_irq(struct igb_q_vector *q_vector, const int budget)
87158715

87168716
/* retrieve a buffer from the ring */
87178717
if (!skb) {
8718-
xdp.data = page_address(rx_buffer->page) +
8719-
rx_buffer->page_offset;
8720-
xdp.data_meta = xdp.data;
8721-
xdp.data_hard_start = xdp.data -
8722-
igb_rx_offset(rx_ring);
8723-
xdp.data_end = xdp.data + size;
8718+
unsigned int offset = igb_rx_offset(rx_ring);
8719+
unsigned char *hard_start;
8720+
8721+
hard_start = page_address(rx_buffer->page) +
8722+
rx_buffer->page_offset - offset;
8723+
xdp_prepare_buff(&xdp, hard_start, offset, size, true);
87248724
#if (PAGE_SIZE > 4096)
87258725
/* At larger PAGE_SIZE, frame_sz depend on len size */
87268726
xdp.frame_sz = igb_rx_frame_truesize(rx_ring, size);

drivers/net/ethernet/intel/ixgbe/ixgbe_main.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2335,12 +2335,12 @@ static int ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
23352335

23362336
/* retrieve a buffer from the ring */
23372337
if (!skb) {
2338-
xdp.data = page_address(rx_buffer->page) +
2339-
rx_buffer->page_offset;
2340-
xdp.data_meta = xdp.data;
2341-
xdp.data_hard_start = xdp.data -
2342-
ixgbe_rx_offset(rx_ring);
2343-
xdp.data_end = xdp.data + size;
2338+
unsigned int offset = ixgbe_rx_offset(rx_ring);
2339+
unsigned char *hard_start;
2340+
2341+
hard_start = page_address(rx_buffer->page) +
2342+
rx_buffer->page_offset - offset;
2343+
xdp_prepare_buff(&xdp, hard_start, offset, size, true);
23442344
#if (PAGE_SIZE > 4096)
23452345
/* At larger PAGE_SIZE, frame_sz depend on len size */
23462346
xdp.frame_sz = ixgbe_rx_frame_truesize(rx_ring, size);

drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1160,12 +1160,12 @@ static int ixgbevf_clean_rx_irq(struct ixgbevf_q_vector *q_vector,
11601160

11611161
/* retrieve a buffer from the ring */
11621162
if (!skb) {
1163-
xdp.data = page_address(rx_buffer->page) +
1164-
rx_buffer->page_offset;
1165-
xdp.data_meta = xdp.data;
1166-
xdp.data_hard_start = xdp.data -
1167-
ixgbevf_rx_offset(rx_ring);
1168-
xdp.data_end = xdp.data + size;
1163+
unsigned int offset = ixgbevf_rx_offset(rx_ring);
1164+
unsigned char *hard_start;
1165+
1166+
hard_start = page_address(rx_buffer->page) +
1167+
rx_buffer->page_offset - offset;
1168+
xdp_prepare_buff(&xdp, hard_start, offset, size, true);
11691169
#if (PAGE_SIZE > 4096)
11701170
/* At larger PAGE_SIZE, frame_sz depend on len size */
11711171
xdp.frame_sz = ixgbevf_rx_frame_truesize(rx_ring, size);

0 commit comments

Comments
 (0)