@@ -262,7 +262,7 @@ void mlx4_en_set_num_rx_rings(struct mlx4_en_dev *mdev)
262
262
263
263
int mlx4_en_create_rx_ring (struct mlx4_en_priv * priv ,
264
264
struct mlx4_en_rx_ring * * pring ,
265
- u32 size , u16 stride , int node )
265
+ u32 size , u16 stride , int node , int queue_index )
266
266
{
267
267
struct mlx4_en_dev * mdev = priv -> mdev ;
268
268
struct mlx4_en_rx_ring * ring ;
@@ -286,14 +286,17 @@ int mlx4_en_create_rx_ring(struct mlx4_en_priv *priv,
286
286
ring -> log_stride = ffs (ring -> stride ) - 1 ;
287
287
ring -> buf_size = ring -> size * ring -> stride + TXBB_SIZE ;
288
288
289
+ if (xdp_rxq_info_reg (& ring -> xdp_rxq , priv -> dev , queue_index ) < 0 )
290
+ goto err_ring ;
291
+
289
292
tmp = size * roundup_pow_of_two (MLX4_EN_MAX_RX_FRAGS *
290
293
sizeof (struct mlx4_en_rx_alloc ));
291
294
ring -> rx_info = vzalloc_node (tmp , node );
292
295
if (!ring -> rx_info ) {
293
296
ring -> rx_info = vzalloc (tmp );
294
297
if (!ring -> rx_info ) {
295
298
err = - ENOMEM ;
296
- goto err_ring ;
299
+ goto err_xdp_info ;
297
300
}
298
301
}
299
302
@@ -317,6 +320,8 @@ int mlx4_en_create_rx_ring(struct mlx4_en_priv *priv,
317
320
err_info :
318
321
vfree (ring -> rx_info );
319
322
ring -> rx_info = NULL ;
323
+ err_xdp_info :
324
+ xdp_rxq_info_unreg (& ring -> xdp_rxq );
320
325
err_ring :
321
326
kfree (ring );
322
327
* pring = NULL ;
@@ -440,6 +445,7 @@ void mlx4_en_destroy_rx_ring(struct mlx4_en_priv *priv,
440
445
lockdep_is_held (& mdev -> state_lock ));
441
446
if (old_prog )
442
447
bpf_prog_put (old_prog );
448
+ xdp_rxq_info_unreg (& ring -> xdp_rxq );
443
449
mlx4_free_hwq_res (mdev -> dev , & ring -> wqres , size * stride + TXBB_SIZE );
444
450
vfree (ring -> rx_info );
445
451
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
652
658
int cq_ring = cq -> ring ;
653
659
bool doorbell_pending ;
654
660
struct mlx4_cqe * cqe ;
661
+ struct xdp_buff xdp ;
655
662
int polled = 0 ;
656
663
int index ;
657
664
@@ -666,6 +673,7 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud
666
673
/* Protect accesses to: ring->xdp_prog, priv->mac_hash list */
667
674
rcu_read_lock ();
668
675
xdp_prog = rcu_dereference (ring -> xdp_prog );
676
+ xdp .rxq = & ring -> xdp_rxq ;
669
677
doorbell_pending = 0 ;
670
678
671
679
/* 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
750
758
* read bytes but not past the end of the frag.
751
759
*/
752
760
if (xdp_prog ) {
753
- struct xdp_buff xdp ;
754
761
dma_addr_t dma ;
755
762
void * orig_data ;
756
763
u32 act ;
0 commit comments