49
49
#include <linux/if_macvlan.h>
50
50
#include <linux/if_bridge.h>
51
51
#include <linux/prefetch.h>
52
+ #include <linux/bpf.h>
53
+ #include <linux/bpf_trace.h>
54
+ #include <linux/atomic.h>
52
55
#include <scsi/fc/fc_fcoe.h>
53
56
#include <net/udp_tunnel.h>
54
57
#include <net/pkt_cls.h>
@@ -1855,6 +1858,10 @@ static void ixgbe_dma_sync_frag(struct ixgbe_ring *rx_ring,
1855
1858
* @rx_desc: pointer to the EOP Rx descriptor
1856
1859
* @skb: pointer to current skb being fixed
1857
1860
*
1861
+ * Check if the skb is valid in the XDP case it will be an error pointer.
1862
+ * Return true in this case to abort processing and advance to next
1863
+ * descriptor.
1864
+ *
1858
1865
* Check for corrupted packet headers caused by senders on the local L2
1859
1866
* embedded NIC switch not setting up their Tx Descriptors right. These
1860
1867
* should be very rare.
@@ -1873,6 +1880,10 @@ static bool ixgbe_cleanup_headers(struct ixgbe_ring *rx_ring,
1873
1880
{
1874
1881
struct net_device * netdev = rx_ring -> netdev ;
1875
1882
1883
+ /* XDP packets use error pointer so abort at this point */
1884
+ if (IS_ERR (skb ))
1885
+ return true;
1886
+
1876
1887
/* verify that the packet does not have any known errors */
1877
1888
if (unlikely (ixgbe_test_staterr (rx_desc ,
1878
1889
IXGBE_RXDADV_ERR_FRAME_ERR_MASK ) &&
@@ -2048,7 +2059,7 @@ static void ixgbe_put_rx_buffer(struct ixgbe_ring *rx_ring,
2048
2059
/* hand second half of page back to the ring */
2049
2060
ixgbe_reuse_rx_page (rx_ring , rx_buffer );
2050
2061
} else {
2051
- if (IXGBE_CB (skb )-> dma == rx_buffer -> dma ) {
2062
+ if (! IS_ERR ( skb ) && IXGBE_CB (skb )-> dma == rx_buffer -> dma ) {
2052
2063
/* the page has been released from the ring */
2053
2064
IXGBE_CB (skb )-> page_released = true;
2054
2065
} else {
@@ -2069,21 +2080,22 @@ static void ixgbe_put_rx_buffer(struct ixgbe_ring *rx_ring,
2069
2080
2070
2081
static struct sk_buff * ixgbe_construct_skb (struct ixgbe_ring * rx_ring ,
2071
2082
struct ixgbe_rx_buffer * rx_buffer ,
2072
- union ixgbe_adv_rx_desc * rx_desc ,
2073
- unsigned int size )
2083
+ struct xdp_buff * xdp ,
2084
+ union ixgbe_adv_rx_desc * rx_desc )
2074
2085
{
2075
- void * va = page_address ( rx_buffer -> page ) + rx_buffer -> page_offset ;
2086
+ unsigned int size = xdp -> data_end - xdp -> data ;
2076
2087
#if (PAGE_SIZE < 8192 )
2077
2088
unsigned int truesize = ixgbe_rx_pg_size (rx_ring ) / 2 ;
2078
2089
#else
2079
- unsigned int truesize = SKB_DATA_ALIGN (size );
2090
+ unsigned int truesize = SKB_DATA_ALIGN (xdp -> data_end -
2091
+ xdp -> data_hard_start );
2080
2092
#endif
2081
2093
struct sk_buff * skb ;
2082
2094
2083
2095
/* prefetch first cache line of first page */
2084
- prefetch (va );
2096
+ prefetch (xdp -> data );
2085
2097
#if L1_CACHE_BYTES < 128
2086
- prefetch (va + L1_CACHE_BYTES );
2098
+ prefetch (xdp -> data + L1_CACHE_BYTES );
2087
2099
#endif
2088
2100
2089
2101
/* allocate a skb to store the frags */
@@ -2096,15 +2108,16 @@ static struct sk_buff *ixgbe_construct_skb(struct ixgbe_ring *rx_ring,
2096
2108
IXGBE_CB (skb )-> dma = rx_buffer -> dma ;
2097
2109
2098
2110
skb_add_rx_frag (skb , 0 , rx_buffer -> page ,
2099
- rx_buffer -> page_offset ,
2111
+ xdp -> data - page_address ( rx_buffer -> page ) ,
2100
2112
size , truesize );
2101
2113
#if (PAGE_SIZE < 8192 )
2102
2114
rx_buffer -> page_offset ^= truesize ;
2103
2115
#else
2104
2116
rx_buffer -> page_offset += truesize ;
2105
2117
#endif
2106
2118
} else {
2107
- memcpy (__skb_put (skb , size ), va , ALIGN (size , sizeof (long )));
2119
+ memcpy (__skb_put (skb , size ),
2120
+ xdp -> data , ALIGN (size , sizeof (long )));
2108
2121
rx_buffer -> pagecnt_bias ++ ;
2109
2122
}
2110
2123
@@ -2113,32 +2126,32 @@ static struct sk_buff *ixgbe_construct_skb(struct ixgbe_ring *rx_ring,
2113
2126
2114
2127
static struct sk_buff * ixgbe_build_skb (struct ixgbe_ring * rx_ring ,
2115
2128
struct ixgbe_rx_buffer * rx_buffer ,
2116
- union ixgbe_adv_rx_desc * rx_desc ,
2117
- unsigned int size )
2129
+ struct xdp_buff * xdp ,
2130
+ union ixgbe_adv_rx_desc * rx_desc )
2118
2131
{
2119
- void * va = page_address (rx_buffer -> page ) + rx_buffer -> page_offset ;
2120
2132
#if (PAGE_SIZE < 8192 )
2121
2133
unsigned int truesize = ixgbe_rx_pg_size (rx_ring ) / 2 ;
2122
2134
#else
2123
2135
unsigned int truesize = SKB_DATA_ALIGN (sizeof (struct skb_shared_info )) +
2124
- SKB_DATA_ALIGN (IXGBE_SKB_PAD + size );
2136
+ SKB_DATA_ALIGN (xdp -> data_end -
2137
+ xdp -> data_hard_start );
2125
2138
#endif
2126
2139
struct sk_buff * skb ;
2127
2140
2128
2141
/* prefetch first cache line of first page */
2129
- prefetch (va );
2142
+ prefetch (xdp -> data );
2130
2143
#if L1_CACHE_BYTES < 128
2131
- prefetch (va + L1_CACHE_BYTES );
2144
+ prefetch (xdp -> data + L1_CACHE_BYTES );
2132
2145
#endif
2133
2146
2134
- /* build an skb around the page buffer */
2135
- skb = build_skb (va - IXGBE_SKB_PAD , truesize );
2147
+ /* build an skb to around the page buffer */
2148
+ skb = build_skb (xdp -> data_hard_start , truesize );
2136
2149
if (unlikely (!skb ))
2137
2150
return NULL ;
2138
2151
2139
2152
/* update pointers within the skb to store the data */
2140
- skb_reserve (skb , IXGBE_SKB_PAD );
2141
- __skb_put (skb , size );
2153
+ skb_reserve (skb , xdp -> data - xdp -> data_hard_start );
2154
+ __skb_put (skb , xdp -> data_end - xdp -> data );
2142
2155
2143
2156
/* record DMA address if this is the start of a chain of buffers */
2144
2157
if (!ixgbe_test_staterr (rx_desc , IXGBE_RXD_STAT_EOP ))
@@ -2154,6 +2167,41 @@ static struct sk_buff *ixgbe_build_skb(struct ixgbe_ring *rx_ring,
2154
2167
return skb ;
2155
2168
}
2156
2169
2170
+ #define IXGBE_XDP_PASS 0
2171
+ #define IXGBE_XDP_CONSUMED 1
2172
+
2173
+ static struct sk_buff * ixgbe_run_xdp (struct ixgbe_ring * rx_ring ,
2174
+ struct xdp_buff * xdp )
2175
+ {
2176
+ int result = IXGBE_XDP_PASS ;
2177
+ struct bpf_prog * xdp_prog ;
2178
+ u32 act ;
2179
+
2180
+ rcu_read_lock ();
2181
+ xdp_prog = READ_ONCE (rx_ring -> xdp_prog );
2182
+
2183
+ if (!xdp_prog )
2184
+ goto xdp_out ;
2185
+
2186
+ act = bpf_prog_run_xdp (xdp_prog , xdp );
2187
+ switch (act ) {
2188
+ case XDP_PASS :
2189
+ break ;
2190
+ default :
2191
+ bpf_warn_invalid_xdp_action (act );
2192
+ case XDP_TX :
2193
+ case XDP_ABORTED :
2194
+ trace_xdp_exception (rx_ring -> netdev , xdp_prog , act );
2195
+ /* fallthrough -- handle aborts by dropping packet */
2196
+ case XDP_DROP :
2197
+ result = IXGBE_XDP_CONSUMED ;
2198
+ break ;
2199
+ }
2200
+ xdp_out :
2201
+ rcu_read_unlock ();
2202
+ return ERR_PTR (- result );
2203
+ }
2204
+
2157
2205
/**
2158
2206
* ixgbe_clean_rx_irq - Clean completed descriptors from Rx ring - bounce buf
2159
2207
* @q_vector: structure containing interrupt and ring information
@@ -2183,6 +2231,7 @@ static int ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
2183
2231
union ixgbe_adv_rx_desc * rx_desc ;
2184
2232
struct ixgbe_rx_buffer * rx_buffer ;
2185
2233
struct sk_buff * skb ;
2234
+ struct xdp_buff xdp ;
2186
2235
unsigned int size ;
2187
2236
2188
2237
/* return some buffers to hardware, one at a time is too slow */
@@ -2205,14 +2254,29 @@ static int ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
2205
2254
rx_buffer = ixgbe_get_rx_buffer (rx_ring , rx_desc , & skb , size );
2206
2255
2207
2256
/* retrieve a buffer from the ring */
2208
- if (skb )
2257
+ if (!skb ) {
2258
+ xdp .data = page_address (rx_buffer -> page ) +
2259
+ rx_buffer -> page_offset ;
2260
+ xdp .data_hard_start = xdp .data -
2261
+ ixgbe_rx_offset (rx_ring );
2262
+ xdp .data_end = xdp .data + size ;
2263
+
2264
+ skb = ixgbe_run_xdp (rx_ring , & xdp );
2265
+ }
2266
+
2267
+ if (IS_ERR (skb )) {
2268
+ total_rx_packets ++ ;
2269
+ total_rx_bytes += size ;
2270
+ rx_buffer -> pagecnt_bias ++ ;
2271
+ } else if (skb ) {
2209
2272
ixgbe_add_rx_frag (rx_ring , rx_buffer , skb , size );
2210
- else if (ring_uses_build_skb (rx_ring ))
2273
+ } else if (ring_uses_build_skb (rx_ring )) {
2211
2274
skb = ixgbe_build_skb (rx_ring , rx_buffer ,
2212
- rx_desc , size );
2213
- else
2275
+ & xdp , rx_desc );
2276
+ } else {
2214
2277
skb = ixgbe_construct_skb (rx_ring , rx_buffer ,
2215
- rx_desc , size );
2278
+ & xdp , rx_desc );
2279
+ }
2216
2280
2217
2281
/* exit if we failed to retrieve a buffer */
2218
2282
if (!skb ) {
@@ -6073,7 +6137,8 @@ static int ixgbe_setup_all_tx_resources(struct ixgbe_adapter *adapter)
6073
6137
*
6074
6138
* Returns 0 on success, negative on failure
6075
6139
**/
6076
- int ixgbe_setup_rx_resources (struct ixgbe_ring * rx_ring )
6140
+ int ixgbe_setup_rx_resources (struct ixgbe_adapter * adapter ,
6141
+ struct ixgbe_ring * rx_ring )
6077
6142
{
6078
6143
struct device * dev = rx_ring -> dev ;
6079
6144
int orig_node = dev_to_node (dev );
@@ -6112,6 +6177,8 @@ int ixgbe_setup_rx_resources(struct ixgbe_ring *rx_ring)
6112
6177
rx_ring -> next_to_clean = 0 ;
6113
6178
rx_ring -> next_to_use = 0 ;
6114
6179
6180
+ rx_ring -> xdp_prog = adapter -> xdp_prog ;
6181
+
6115
6182
return 0 ;
6116
6183
err :
6117
6184
vfree (rx_ring -> rx_buffer_info );
@@ -6135,7 +6202,7 @@ static int ixgbe_setup_all_rx_resources(struct ixgbe_adapter *adapter)
6135
6202
int i , err = 0 ;
6136
6203
6137
6204
for (i = 0 ; i < adapter -> num_rx_queues ; i ++ ) {
6138
- err = ixgbe_setup_rx_resources (adapter -> rx_ring [i ]);
6205
+ err = ixgbe_setup_rx_resources (adapter , adapter -> rx_ring [i ]);
6139
6206
if (!err )
6140
6207
continue ;
6141
6208
@@ -6203,6 +6270,7 @@ void ixgbe_free_rx_resources(struct ixgbe_ring *rx_ring)
6203
6270
{
6204
6271
ixgbe_clean_rx_ring (rx_ring );
6205
6272
6273
+ rx_ring -> xdp_prog = NULL ;
6206
6274
vfree (rx_ring -> rx_buffer_info );
6207
6275
rx_ring -> rx_buffer_info = NULL ;
6208
6276
@@ -9468,6 +9536,54 @@ ixgbe_features_check(struct sk_buff *skb, struct net_device *dev,
9468
9536
return features ;
9469
9537
}
9470
9538
9539
+ static int ixgbe_xdp_setup (struct net_device * dev , struct bpf_prog * prog )
9540
+ {
9541
+ int i , frame_size = dev -> mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN ;
9542
+ struct ixgbe_adapter * adapter = netdev_priv (dev );
9543
+ struct bpf_prog * old_prog ;
9544
+
9545
+ if (adapter -> flags & IXGBE_FLAG_SRIOV_ENABLED )
9546
+ return - EINVAL ;
9547
+
9548
+ if (adapter -> flags & IXGBE_FLAG_DCB_ENABLED )
9549
+ return - EINVAL ;
9550
+
9551
+ /* verify ixgbe ring attributes are sufficient for XDP */
9552
+ for (i = 0 ; i < adapter -> num_rx_queues ; i ++ ) {
9553
+ struct ixgbe_ring * ring = adapter -> rx_ring [i ];
9554
+
9555
+ if (ring_is_rsc_enabled (ring ))
9556
+ return - EINVAL ;
9557
+
9558
+ if (frame_size > ixgbe_rx_bufsz (ring ))
9559
+ return - EINVAL ;
9560
+ }
9561
+
9562
+ old_prog = xchg (& adapter -> xdp_prog , prog );
9563
+ for (i = 0 ; i < adapter -> num_rx_queues ; i ++ )
9564
+ xchg (& adapter -> rx_ring [i ]-> xdp_prog , adapter -> xdp_prog );
9565
+
9566
+ if (old_prog )
9567
+ bpf_prog_put (old_prog );
9568
+
9569
+ return 0 ;
9570
+ }
9571
+
9572
+ static int ixgbe_xdp (struct net_device * dev , struct netdev_xdp * xdp )
9573
+ {
9574
+ struct ixgbe_adapter * adapter = netdev_priv (dev );
9575
+
9576
+ switch (xdp -> command ) {
9577
+ case XDP_SETUP_PROG :
9578
+ return ixgbe_xdp_setup (dev , xdp -> prog );
9579
+ case XDP_QUERY_PROG :
9580
+ xdp -> prog_attached = !!(adapter -> xdp_prog );
9581
+ return 0 ;
9582
+ default :
9583
+ return - EINVAL ;
9584
+ }
9585
+ }
9586
+
9471
9587
static const struct net_device_ops ixgbe_netdev_ops = {
9472
9588
.ndo_open = ixgbe_open ,
9473
9589
.ndo_stop = ixgbe_close ,
@@ -9513,6 +9629,7 @@ static const struct net_device_ops ixgbe_netdev_ops = {
9513
9629
.ndo_udp_tunnel_add = ixgbe_add_udp_tunnel_port ,
9514
9630
.ndo_udp_tunnel_del = ixgbe_del_udp_tunnel_port ,
9515
9631
.ndo_features_check = ixgbe_features_check ,
9632
+ .ndo_xdp = ixgbe_xdp ,
9516
9633
};
9517
9634
9518
9635
/**
0 commit comments