Skip to content

Commit 7f0b800

Browse files
committed
Merge git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next
Daniel Borkmann says: ==================== pull-request: bpf-next 2018-01-07 The following pull-request contains BPF updates for your *net-next* tree. The main changes are: 1) Add a start of a framework for extending struct xdp_buff without having the overhead of populating every data at runtime. Idea is to have a new per-queue struct xdp_rxq_info that holds read mostly data (currently that is, queue number and a pointer to the corresponding netdev) which is set up during rxqueue config time. When a XDP program is invoked, struct xdp_buff holds a pointer to struct xdp_rxq_info that the BPF program can then walk. The user facing BPF program that uses struct xdp_md for context can use these members directly, and the verifier rewrites context access transparently by walking the xdp_rxq_info and net_device pointers to load the data, from Jesper. 2) Redo the reporting of offload device information to user space such that it works in combination with network namespaces. The latter is reported through a device/inode tuple as similarly done in other subsystems as well (e.g. perf) in order to identify the namespace. For this to work, ns_get_path() has been generalized such that the namespace can be retrieved not only from a specific task (perf case), but also from a callback where we deduce the netns (ns_common) from a netdevice. bpftool support using the new uapi info and extensive test cases for test_offload.py in BPF selftests have been added as well, from Jakub. 3) Add two bpftool improvements: i) properly report the bpftool version such that it corresponds to the version from the kernel source tree. So pick the right linux/version.h from the source tree instead of the installed one. ii) fix bpftool and also bpf_jit_disasm build with bintutils >= 2.9. The reason for the build breakage is that binutils library changed the function signature to select the disassembler. Given this is needed in multiple tools, add a proper feature detection to the tools/build/features infrastructure, from Roman. 4) Implement the BPF syscall command BPF_MAP_GET_NEXT_KEY for the stacktrace map. It is currently unimplemented, but there are use cases where user space needs to walk all stacktrace map entries e.g. for dumping or deleting map entries w/o having to close and recreate the map. Add BPF selftests along with it, from Yonghong. 5) Few follow-up cleanups for the bpftool cgroup code: i) rename the cgroup 'list' command into 'show' as we have it for other subcommands as well, ii) then alias the 'show' command such that 'list' is accepted which is also common practice in iproute2, and iii) remove couple of newlines from error messages using p_err(), from Jakub. 6) Two follow-up cleanups to sockmap code: i) remove the unused bpf_compute_data_end_sk_skb() function and ii) only build the sockmap infrastructure when CONFIG_INET is enabled since it's only aware of TCP sockets at this time, from John. ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents d0adb51 + 9be99ba commit 7f0b800

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

72 files changed

+1687
-178
lines changed

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2247,6 +2247,9 @@ static void bnxt_free_rx_rings(struct bnxt *bp)
22472247
if (rxr->xdp_prog)
22482248
bpf_prog_put(rxr->xdp_prog);
22492249

2250+
if (xdp_rxq_info_is_reg(&rxr->xdp_rxq))
2251+
xdp_rxq_info_unreg(&rxr->xdp_rxq);
2252+
22502253
kfree(rxr->rx_tpa);
22512254
rxr->rx_tpa = NULL;
22522255

@@ -2280,6 +2283,10 @@ static int bnxt_alloc_rx_rings(struct bnxt *bp)
22802283

22812284
ring = &rxr->rx_ring_struct;
22822285

2286+
rc = xdp_rxq_info_reg(&rxr->xdp_rxq, bp->dev, i);
2287+
if (rc < 0)
2288+
return rc;
2289+
22832290
rc = bnxt_alloc_ring(bp, ring);
22842291
if (rc)
22852292
return rc;
@@ -2834,6 +2841,9 @@ void bnxt_set_ring_params(struct bnxt *bp)
28342841
bp->cp_ring_mask = bp->cp_bit - 1;
28352842
}
28362843

2844+
/* Changing allocation mode of RX rings.
2845+
* TODO: Update when extending xdp_rxq_info to support allocation modes.
2846+
*/
28372847
int bnxt_set_rx_skb_mode(struct bnxt *bp, bool page_mode)
28382848
{
28392849
if (page_mode) {

drivers/net/ethernet/broadcom/bnxt/bnxt.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include <net/devlink.h>
2424
#include <net/dst_metadata.h>
2525
#include <net/switchdev.h>
26+
#include <net/xdp.h>
2627

2728
struct tx_bd {
2829
__le32 tx_bd_len_flags_type;
@@ -664,6 +665,7 @@ struct bnxt_rx_ring_info {
664665

665666
struct bnxt_ring_struct rx_ring_struct;
666667
struct bnxt_ring_struct rx_agg_ring_struct;
668+
struct xdp_rxq_info xdp_rxq;
667669
};
668670

669671
struct bnxt_cp_ring_info {

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ bool bnxt_rx_xdp(struct bnxt *bp, struct bnxt_rx_ring_info *rxr, u16 cons,
9696
xdp.data = *data_ptr;
9797
xdp_set_data_meta_invalid(&xdp);
9898
xdp.data_end = *data_ptr + *len;
99+
xdp.rxq = &rxr->xdp_rxq;
99100
orig_data = xdp.data;
100101
mapping = rx_buf->mapping - bp->rx_dma_offset;
101102

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -521,7 +521,7 @@ static void nicvf_unmap_page(struct nicvf *nic, struct page *page, u64 dma_addr)
521521

522522
static inline bool nicvf_xdp_rx(struct nicvf *nic, struct bpf_prog *prog,
523523
struct cqe_rx_t *cqe_rx, struct snd_queue *sq,
524-
struct sk_buff **skb)
524+
struct rcv_queue *rq, struct sk_buff **skb)
525525
{
526526
struct xdp_buff xdp;
527527
struct page *page;
@@ -545,6 +545,7 @@ static inline bool nicvf_xdp_rx(struct nicvf *nic, struct bpf_prog *prog,
545545
xdp.data = (void *)cpu_addr;
546546
xdp_set_data_meta_invalid(&xdp);
547547
xdp.data_end = xdp.data + len;
548+
xdp.rxq = &rq->xdp_rxq;
548549
orig_data = xdp.data;
549550

550551
rcu_read_lock();
@@ -698,7 +699,8 @@ static inline void nicvf_set_rxhash(struct net_device *netdev,
698699

699700
static void nicvf_rcv_pkt_handler(struct net_device *netdev,
700701
struct napi_struct *napi,
701-
struct cqe_rx_t *cqe_rx, struct snd_queue *sq)
702+
struct cqe_rx_t *cqe_rx,
703+
struct snd_queue *sq, struct rcv_queue *rq)
702704
{
703705
struct sk_buff *skb = NULL;
704706
struct nicvf *nic = netdev_priv(netdev);
@@ -724,7 +726,7 @@ static void nicvf_rcv_pkt_handler(struct net_device *netdev,
724726
/* For XDP, ignore pkts spanning multiple pages */
725727
if (nic->xdp_prog && (cqe_rx->rb_cnt == 1)) {
726728
/* Packet consumed by XDP */
727-
if (nicvf_xdp_rx(snic, nic->xdp_prog, cqe_rx, sq, &skb))
729+
if (nicvf_xdp_rx(snic, nic->xdp_prog, cqe_rx, sq, rq, &skb))
728730
return;
729731
} else {
730732
skb = nicvf_get_rcv_skb(snic, cqe_rx,
@@ -781,6 +783,7 @@ static int nicvf_cq_intr_handler(struct net_device *netdev, u8 cq_idx,
781783
struct cqe_rx_t *cq_desc;
782784
struct netdev_queue *txq;
783785
struct snd_queue *sq = &qs->sq[cq_idx];
786+
struct rcv_queue *rq = &qs->rq[cq_idx];
784787
unsigned int tx_pkts = 0, tx_bytes = 0, txq_idx;
785788

786789
spin_lock_bh(&cq->lock);
@@ -811,7 +814,7 @@ static int nicvf_cq_intr_handler(struct net_device *netdev, u8 cq_idx,
811814

812815
switch (cq_desc->cqe_type) {
813816
case CQE_TYPE_RX:
814-
nicvf_rcv_pkt_handler(netdev, napi, cq_desc, sq);
817+
nicvf_rcv_pkt_handler(netdev, napi, cq_desc, sq, rq);
815818
work_done++;
816819
break;
817820
case CQE_TYPE_SEND:

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -760,6 +760,7 @@ static void nicvf_rcv_queue_config(struct nicvf *nic, struct queue_set *qs,
760760

761761
if (!rq->enable) {
762762
nicvf_reclaim_rcv_queue(nic, qs, qidx);
763+
xdp_rxq_info_unreg(&rq->xdp_rxq);
763764
return;
764765
}
765766

@@ -772,6 +773,9 @@ static void nicvf_rcv_queue_config(struct nicvf *nic, struct queue_set *qs,
772773
/* all writes of RBDR data to be loaded into L2 Cache as well*/
773774
rq->caching = 1;
774775

776+
/* Driver have no proper error path for failed XDP RX-queue info reg */
777+
WARN_ON(xdp_rxq_info_reg(&rq->xdp_rxq, nic->netdev, qidx) < 0);
778+
775779
/* Send a mailbox msg to PF to config RQ */
776780
mbx.rq.msg = NIC_MBOX_MSG_RQ_CFG;
777781
mbx.rq.qs_num = qs->vnic_id;

drivers/net/ethernet/cavium/thunder/nicvf_queues.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include <linux/netdevice.h>
1313
#include <linux/iommu.h>
1414
#include <linux/bpf.h>
15+
#include <net/xdp.h>
1516
#include "q_struct.h"
1617

1718
#define MAX_QUEUE_SET 128
@@ -255,6 +256,7 @@ struct rcv_queue {
255256
u8 start_qs_rbdr_idx; /* RBDR idx in the above QS */
256257
u8 caching;
257258
struct rx_tx_queue_stats stats;
259+
struct xdp_rxq_info xdp_rxq;
258260
} ____cacheline_aligned_in_smp;
259261

260262
struct cmp_queue {

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1585,6 +1585,8 @@ static int i40e_set_ringparam(struct net_device *netdev,
15851585
*/
15861586
rx_rings[i].desc = NULL;
15871587
rx_rings[i].rx_bi = NULL;
1588+
/* Clear cloned XDP RX-queue info before setup call */
1589+
memset(&rx_rings[i].xdp_rxq, 0, sizeof(rx_rings[i].xdp_rxq));
15881590
/* this is to allow wr32 to have something to write to
15891591
* during early allocation of Rx buffers
15901592
*/

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

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include <linux/prefetch.h>
2828
#include <net/busy_poll.h>
2929
#include <linux/bpf_trace.h>
30+
#include <net/xdp.h>
3031
#include "i40e.h"
3132
#include "i40e_trace.h"
3233
#include "i40e_prototype.h"
@@ -1236,6 +1237,8 @@ void i40e_clean_rx_ring(struct i40e_ring *rx_ring)
12361237
void i40e_free_rx_resources(struct i40e_ring *rx_ring)
12371238
{
12381239
i40e_clean_rx_ring(rx_ring);
1240+
if (rx_ring->vsi->type == I40E_VSI_MAIN)
1241+
xdp_rxq_info_unreg(&rx_ring->xdp_rxq);
12391242
rx_ring->xdp_prog = NULL;
12401243
kfree(rx_ring->rx_bi);
12411244
rx_ring->rx_bi = NULL;
@@ -1256,6 +1259,7 @@ void i40e_free_rx_resources(struct i40e_ring *rx_ring)
12561259
int i40e_setup_rx_descriptors(struct i40e_ring *rx_ring)
12571260
{
12581261
struct device *dev = rx_ring->dev;
1262+
int err = -ENOMEM;
12591263
int bi_size;
12601264

12611265
/* warn if we are about to overwrite the pointer */
@@ -1283,13 +1287,21 @@ int i40e_setup_rx_descriptors(struct i40e_ring *rx_ring)
12831287
rx_ring->next_to_clean = 0;
12841288
rx_ring->next_to_use = 0;
12851289

1290+
/* XDP RX-queue info only needed for RX rings exposed to XDP */
1291+
if (rx_ring->vsi->type == I40E_VSI_MAIN) {
1292+
err = xdp_rxq_info_reg(&rx_ring->xdp_rxq, rx_ring->netdev,
1293+
rx_ring->queue_index);
1294+
if (err < 0)
1295+
goto err;
1296+
}
1297+
12861298
rx_ring->xdp_prog = rx_ring->vsi->xdp_prog;
12871299

12881300
return 0;
12891301
err:
12901302
kfree(rx_ring->rx_bi);
12911303
rx_ring->rx_bi = NULL;
1292-
return -ENOMEM;
1304+
return err;
12931305
}
12941306

12951307
/**
@@ -2068,11 +2080,13 @@ static int i40e_clean_rx_irq(struct i40e_ring *rx_ring, int budget)
20682080
struct sk_buff *skb = rx_ring->skb;
20692081
u16 cleaned_count = I40E_DESC_UNUSED(rx_ring);
20702082
bool failure = false, xdp_xmit = false;
2083+
struct xdp_buff xdp;
2084+
2085+
xdp.rxq = &rx_ring->xdp_rxq;
20712086

20722087
while (likely(total_rx_packets < (unsigned int)budget)) {
20732088
struct i40e_rx_buffer *rx_buffer;
20742089
union i40e_rx_desc *rx_desc;
2075-
struct xdp_buff xdp;
20762090
unsigned int size;
20772091
u16 vlan_tag;
20782092
u8 rx_ptype;

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
#ifndef _I40E_TXRX_H_
2828
#define _I40E_TXRX_H_
2929

30+
#include <net/xdp.h>
31+
3032
/* Interrupt Throttling and Rate Limiting Goodies */
3133

3234
#define I40E_MAX_ITR 0x0FF0 /* reg uses 2 usec resolution */
@@ -428,6 +430,7 @@ struct i40e_ring {
428430
*/
429431

430432
struct i40e_channel *ch;
433+
struct xdp_rxq_info xdp_rxq;
431434
} ____cacheline_internodealigned_in_smp;
432435

433436
static inline bool ring_uses_build_skb(struct i40e_ring *ring)

drivers/net/ethernet/intel/ixgbe/ixgbe.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
#include <linux/dca.h>
5454
#endif
5555

56+
#include <net/xdp.h>
5657
#include <net/busy_poll.h>
5758

5859
/* common prefix used by pr_<> macros */
@@ -371,6 +372,7 @@ struct ixgbe_ring {
371372
struct ixgbe_tx_queue_stats tx_stats;
372373
struct ixgbe_rx_queue_stats rx_stats;
373374
};
375+
struct xdp_rxq_info xdp_rxq;
374376
} ____cacheline_internodealigned_in_smp;
375377

376378
enum ixgbe_ring_f_enum {

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1156,6 +1156,10 @@ static int ixgbe_set_ringparam(struct net_device *netdev,
11561156
memcpy(&temp_ring[i], adapter->rx_ring[i],
11571157
sizeof(struct ixgbe_ring));
11581158

1159+
/* Clear copied XDP RX-queue info */
1160+
memset(&temp_ring[i].xdp_rxq, 0,
1161+
sizeof(temp_ring[i].xdp_rxq));
1162+
11591163
temp_ring[i].count = new_rx_count;
11601164
err = ixgbe_setup_rx_resources(adapter, &temp_ring[i]);
11611165
if (err) {

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2318,12 +2318,14 @@ static int ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
23182318
#endif /* IXGBE_FCOE */
23192319
u16 cleaned_count = ixgbe_desc_unused(rx_ring);
23202320
bool xdp_xmit = false;
2321+
struct xdp_buff xdp;
2322+
2323+
xdp.rxq = &rx_ring->xdp_rxq;
23212324

23222325
while (likely(total_rx_packets < budget)) {
23232326
union ixgbe_adv_rx_desc *rx_desc;
23242327
struct ixgbe_rx_buffer *rx_buffer;
23252328
struct sk_buff *skb;
2326-
struct xdp_buff xdp;
23272329
unsigned int size;
23282330

23292331
/* return some buffers to hardware, one at a time is too slow */
@@ -6444,6 +6446,11 @@ int ixgbe_setup_rx_resources(struct ixgbe_adapter *adapter,
64446446
rx_ring->next_to_clean = 0;
64456447
rx_ring->next_to_use = 0;
64466448

6449+
/* XDP RX-queue info */
6450+
if (xdp_rxq_info_reg(&rx_ring->xdp_rxq, adapter->netdev,
6451+
rx_ring->queue_index) < 0)
6452+
goto err;
6453+
64476454
rx_ring->xdp_prog = adapter->xdp_prog;
64486455

64496456
return 0;
@@ -6541,6 +6548,7 @@ void ixgbe_free_rx_resources(struct ixgbe_ring *rx_ring)
65416548
ixgbe_clean_rx_ring(rx_ring);
65426549

65436550
rx_ring->xdp_prog = NULL;
6551+
xdp_rxq_info_unreg(&rx_ring->xdp_rxq);
65446552
vfree(rx_ring->rx_buffer_info);
65456553
rx_ring->rx_buffer_info = NULL;
65466554

drivers/net/ethernet/mellanox/mlx4/en_netdev.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2172,8 +2172,9 @@ static int mlx4_en_alloc_resources(struct mlx4_en_priv *priv)
21722172

21732173
if (mlx4_en_create_rx_ring(priv, &priv->rx_ring[i],
21742174
prof->rx_ring_size, priv->stride,
2175-
node))
2175+
node, i))
21762176
goto err;
2177+
21772178
}
21782179

21792180
#ifdef CONFIG_RFS_ACCEL

drivers/net/ethernet/mellanox/mlx4/en_rx.c

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ void mlx4_en_set_num_rx_rings(struct mlx4_en_dev *mdev)
262262

263263
int mlx4_en_create_rx_ring(struct mlx4_en_priv *priv,
264264
struct mlx4_en_rx_ring **pring,
265-
u32 size, u16 stride, int node)
265+
u32 size, u16 stride, int node, int queue_index)
266266
{
267267
struct mlx4_en_dev *mdev = priv->mdev;
268268
struct mlx4_en_rx_ring *ring;
@@ -286,14 +286,17 @@ int mlx4_en_create_rx_ring(struct mlx4_en_priv *priv,
286286
ring->log_stride = ffs(ring->stride) - 1;
287287
ring->buf_size = ring->size * ring->stride + TXBB_SIZE;
288288

289+
if (xdp_rxq_info_reg(&ring->xdp_rxq, priv->dev, queue_index) < 0)
290+
goto err_ring;
291+
289292
tmp = size * roundup_pow_of_two(MLX4_EN_MAX_RX_FRAGS *
290293
sizeof(struct mlx4_en_rx_alloc));
291294
ring->rx_info = vzalloc_node(tmp, node);
292295
if (!ring->rx_info) {
293296
ring->rx_info = vzalloc(tmp);
294297
if (!ring->rx_info) {
295298
err = -ENOMEM;
296-
goto err_ring;
299+
goto err_xdp_info;
297300
}
298301
}
299302

@@ -317,6 +320,8 @@ int mlx4_en_create_rx_ring(struct mlx4_en_priv *priv,
317320
err_info:
318321
vfree(ring->rx_info);
319322
ring->rx_info = NULL;
323+
err_xdp_info:
324+
xdp_rxq_info_unreg(&ring->xdp_rxq);
320325
err_ring:
321326
kfree(ring);
322327
*pring = NULL;
@@ -440,6 +445,7 @@ void mlx4_en_destroy_rx_ring(struct mlx4_en_priv *priv,
440445
lockdep_is_held(&mdev->state_lock));
441446
if (old_prog)
442447
bpf_prog_put(old_prog);
448+
xdp_rxq_info_unreg(&ring->xdp_rxq);
443449
mlx4_free_hwq_res(mdev->dev, &ring->wqres, size * stride + TXBB_SIZE);
444450
vfree(ring->rx_info);
445451
ring->rx_info = NULL;
@@ -652,6 +658,7 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud
652658
int cq_ring = cq->ring;
653659
bool doorbell_pending;
654660
struct mlx4_cqe *cqe;
661+
struct xdp_buff xdp;
655662
int polled = 0;
656663
int index;
657664

@@ -666,6 +673,7 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud
666673
/* Protect accesses to: ring->xdp_prog, priv->mac_hash list */
667674
rcu_read_lock();
668675
xdp_prog = rcu_dereference(ring->xdp_prog);
676+
xdp.rxq = &ring->xdp_rxq;
669677
doorbell_pending = 0;
670678

671679
/* We assume a 1:1 mapping between CQEs and Rx descriptors, so Rx
@@ -750,7 +758,6 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud
750758
* read bytes but not past the end of the frag.
751759
*/
752760
if (xdp_prog) {
753-
struct xdp_buff xdp;
754761
dma_addr_t dma;
755762
void *orig_data;
756763
u32 act;

drivers/net/ethernet/mellanox/mlx4/mlx4_en.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
#endif
4747
#include <linux/cpu_rmap.h>
4848
#include <linux/ptp_clock_kernel.h>
49+
#include <net/xdp.h>
4950

5051
#include <linux/mlx4/device.h>
5152
#include <linux/mlx4/qp.h>
@@ -356,6 +357,7 @@ struct mlx4_en_rx_ring {
356357
unsigned long dropped;
357358
int hwtstamp_rx_filter;
358359
cpumask_var_t affinity_mask;
360+
struct xdp_rxq_info xdp_rxq;
359361
};
360362

361363
struct mlx4_en_cq {
@@ -720,7 +722,7 @@ void mlx4_en_set_num_rx_rings(struct mlx4_en_dev *mdev);
720722
void mlx4_en_recover_from_oom(struct mlx4_en_priv *priv);
721723
int mlx4_en_create_rx_ring(struct mlx4_en_priv *priv,
722724
struct mlx4_en_rx_ring **pring,
723-
u32 size, u16 stride, int node);
725+
u32 size, u16 stride, int node, int queue_index);
724726
void mlx4_en_destroy_rx_ring(struct mlx4_en_priv *priv,
725727
struct mlx4_en_rx_ring **pring,
726728
u32 size, u16 stride);

0 commit comments

Comments
 (0)