Skip to content

Commit f51b5e2

Browse files
netoptimizeranguy11
authored andcommitted
igc: enable XDP metadata in driver
Enabling the XDP bpf_prog access to data_meta area is a very small change. Hint passing 'true' to xdp_prepare_buff(). The SKB layers can also access data_meta area, which required more driver changes to support. Reviewers, notice the igc driver have two different functions that can create SKBs, depending on driver config. Hint for testers, ethtool priv-flags legacy-rx enables the function igc_construct_skb() ethtool --set-priv-flags DEV legacy-rx on Signed-off-by: Jesper Dangaard Brouer <[email protected]> Tested-by: Nechama Kraus <[email protected]> Reviewed-by: Alexander Lobakin <[email protected]> Signed-off-by: Tony Nguyen <[email protected]>
1 parent 4fa8fcd commit f51b5e2

File tree

1 file changed

+22
-11
lines changed

1 file changed

+22
-11
lines changed

drivers/net/ethernet/intel/igc/igc_main.c

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1718,24 +1718,26 @@ static void igc_add_rx_frag(struct igc_ring *rx_ring,
17181718

17191719
static struct sk_buff *igc_build_skb(struct igc_ring *rx_ring,
17201720
struct igc_rx_buffer *rx_buffer,
1721-
union igc_adv_rx_desc *rx_desc,
1722-
unsigned int size)
1721+
struct xdp_buff *xdp)
17231722
{
1724-
void *va = page_address(rx_buffer->page) + rx_buffer->page_offset;
1723+
unsigned int size = xdp->data_end - xdp->data;
17251724
unsigned int truesize = igc_get_rx_frame_truesize(rx_ring, size);
1725+
unsigned int metasize = xdp->data - xdp->data_meta;
17261726
struct sk_buff *skb;
17271727

17281728
/* prefetch first cache line of first page */
1729-
net_prefetch(va);
1729+
net_prefetch(xdp->data_meta);
17301730

17311731
/* build an skb around the page buffer */
1732-
skb = build_skb(va - IGC_SKB_PAD, truesize);
1732+
skb = build_skb(xdp->data_hard_start, truesize);
17331733
if (unlikely(!skb))
17341734
return NULL;
17351735

17361736
/* update pointers within the skb to store the data */
1737-
skb_reserve(skb, IGC_SKB_PAD);
1737+
skb_reserve(skb, xdp->data - xdp->data_hard_start);
17381738
__skb_put(skb, size);
1739+
if (metasize)
1740+
skb_metadata_set(skb, metasize);
17391741

17401742
igc_rx_buffer_flip(rx_buffer, truesize);
17411743
return skb;
@@ -1746,17 +1748,19 @@ static struct sk_buff *igc_construct_skb(struct igc_ring *rx_ring,
17461748
struct xdp_buff *xdp,
17471749
ktime_t timestamp)
17481750
{
1751+
unsigned int metasize = xdp->data - xdp->data_meta;
17491752
unsigned int size = xdp->data_end - xdp->data;
17501753
unsigned int truesize = igc_get_rx_frame_truesize(rx_ring, size);
17511754
void *va = xdp->data;
17521755
unsigned int headlen;
17531756
struct sk_buff *skb;
17541757

17551758
/* prefetch first cache line of first page */
1756-
net_prefetch(va);
1759+
net_prefetch(xdp->data_meta);
17571760

17581761
/* allocate a skb to store the frags */
1759-
skb = napi_alloc_skb(&rx_ring->q_vector->napi, IGC_RX_HDR_LEN);
1762+
skb = napi_alloc_skb(&rx_ring->q_vector->napi,
1763+
IGC_RX_HDR_LEN + metasize);
17601764
if (unlikely(!skb))
17611765
return NULL;
17621766

@@ -1769,7 +1773,13 @@ static struct sk_buff *igc_construct_skb(struct igc_ring *rx_ring,
17691773
headlen = eth_get_headlen(skb->dev, va, IGC_RX_HDR_LEN);
17701774

17711775
/* align pull length to size of long to optimize memcpy performance */
1772-
memcpy(__skb_put(skb, headlen), va, ALIGN(headlen, sizeof(long)));
1776+
memcpy(__skb_put(skb, headlen + metasize), xdp->data_meta,
1777+
ALIGN(headlen + metasize, sizeof(long)));
1778+
1779+
if (metasize) {
1780+
skb_metadata_set(skb, metasize);
1781+
__skb_pull(skb, metasize);
1782+
}
17731783

17741784
/* update all of the pointers */
17751785
size -= headlen;
@@ -2354,7 +2364,8 @@ static int igc_clean_rx_irq(struct igc_q_vector *q_vector, const int budget)
23542364
if (!skb) {
23552365
xdp_init_buff(&xdp, truesize, &rx_ring->xdp_rxq);
23562366
xdp_prepare_buff(&xdp, pktbuf - igc_rx_offset(rx_ring),
2357-
igc_rx_offset(rx_ring) + pkt_offset, size, false);
2367+
igc_rx_offset(rx_ring) + pkt_offset,
2368+
size, true);
23582369

23592370
skb = igc_xdp_run_prog(adapter, &xdp);
23602371
}
@@ -2378,7 +2389,7 @@ static int igc_clean_rx_irq(struct igc_q_vector *q_vector, const int budget)
23782389
} else if (skb)
23792390
igc_add_rx_frag(rx_ring, rx_buffer, skb, size);
23802391
else if (ring_uses_build_skb(rx_ring))
2381-
skb = igc_build_skb(rx_ring, rx_buffer, rx_desc, size);
2392+
skb = igc_build_skb(rx_ring, rx_buffer, &xdp);
23822393
else
23832394
skb = igc_construct_skb(rx_ring, rx_buffer, &xdp,
23842395
timestamp);

0 commit comments

Comments
 (0)