@@ -1718,24 +1718,26 @@ static void igc_add_rx_frag(struct igc_ring *rx_ring,
1718
1718
1719
1719
static struct sk_buff * igc_build_skb (struct igc_ring * rx_ring ,
1720
1720
struct igc_rx_buffer * rx_buffer ,
1721
- union igc_adv_rx_desc * rx_desc ,
1722
- unsigned int size )
1721
+ struct xdp_buff * xdp )
1723
1722
{
1724
- void * va = page_address ( rx_buffer -> page ) + rx_buffer -> page_offset ;
1723
+ unsigned int size = xdp -> data_end - xdp -> data ;
1725
1724
unsigned int truesize = igc_get_rx_frame_truesize (rx_ring , size );
1725
+ unsigned int metasize = xdp -> data - xdp -> data_meta ;
1726
1726
struct sk_buff * skb ;
1727
1727
1728
1728
/* prefetch first cache line of first page */
1729
- net_prefetch (va );
1729
+ net_prefetch (xdp -> data_meta );
1730
1730
1731
1731
/* 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 );
1733
1733
if (unlikely (!skb ))
1734
1734
return NULL ;
1735
1735
1736
1736
/* 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 );
1738
1738
__skb_put (skb , size );
1739
+ if (metasize )
1740
+ skb_metadata_set (skb , metasize );
1739
1741
1740
1742
igc_rx_buffer_flip (rx_buffer , truesize );
1741
1743
return skb ;
@@ -1746,17 +1748,19 @@ static struct sk_buff *igc_construct_skb(struct igc_ring *rx_ring,
1746
1748
struct xdp_buff * xdp ,
1747
1749
ktime_t timestamp )
1748
1750
{
1751
+ unsigned int metasize = xdp -> data - xdp -> data_meta ;
1749
1752
unsigned int size = xdp -> data_end - xdp -> data ;
1750
1753
unsigned int truesize = igc_get_rx_frame_truesize (rx_ring , size );
1751
1754
void * va = xdp -> data ;
1752
1755
unsigned int headlen ;
1753
1756
struct sk_buff * skb ;
1754
1757
1755
1758
/* prefetch first cache line of first page */
1756
- net_prefetch (va );
1759
+ net_prefetch (xdp -> data_meta );
1757
1760
1758
1761
/* 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 );
1760
1764
if (unlikely (!skb ))
1761
1765
return NULL ;
1762
1766
@@ -1769,7 +1773,13 @@ static struct sk_buff *igc_construct_skb(struct igc_ring *rx_ring,
1769
1773
headlen = eth_get_headlen (skb -> dev , va , IGC_RX_HDR_LEN );
1770
1774
1771
1775
/* 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
+ }
1773
1783
1774
1784
/* update all of the pointers */
1775
1785
size -= headlen ;
@@ -2354,7 +2364,8 @@ static int igc_clean_rx_irq(struct igc_q_vector *q_vector, const int budget)
2354
2364
if (!skb ) {
2355
2365
xdp_init_buff (& xdp , truesize , & rx_ring -> xdp_rxq );
2356
2366
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);
2358
2369
2359
2370
skb = igc_xdp_run_prog (adapter , & xdp );
2360
2371
}
@@ -2378,7 +2389,7 @@ static int igc_clean_rx_irq(struct igc_q_vector *q_vector, const int budget)
2378
2389
} else if (skb )
2379
2390
igc_add_rx_frag (rx_ring , rx_buffer , skb , size );
2380
2391
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 );
2382
2393
else
2383
2394
skb = igc_construct_skb (rx_ring , rx_buffer , & xdp ,
2384
2395
timestamp );
@@ -2448,8 +2459,10 @@ static struct sk_buff *igc_construct_skb_zc(struct igc_ring *ring,
2448
2459
2449
2460
skb_reserve (skb , xdp -> data_meta - xdp -> data_hard_start );
2450
2461
memcpy (__skb_put (skb , totalsize ), xdp -> data_meta , totalsize );
2451
- if (metasize )
2462
+ if (metasize ) {
2452
2463
skb_metadata_set (skb , metasize );
2464
+ __skb_pull (skb , metasize );
2465
+ }
2453
2466
2454
2467
return skb ;
2455
2468
}
0 commit comments