@@ -64,6 +64,7 @@ struct mlx5e_cq_param {
64
64
struct mlx5e_channel_param {
65
65
struct mlx5e_rq_param rq ;
66
66
struct mlx5e_sq_param sq ;
67
+ struct mlx5e_sq_param xdp_sq ;
67
68
struct mlx5e_sq_param icosq ;
68
69
struct mlx5e_cq_param rx_cq ;
69
70
struct mlx5e_cq_param tx_cq ;
@@ -180,6 +181,8 @@ static void mlx5e_update_sw_counters(struct mlx5e_priv *priv)
180
181
s -> rx_csum_complete += rq_stats -> csum_complete ;
181
182
s -> rx_csum_unnecessary_inner += rq_stats -> csum_unnecessary_inner ;
182
183
s -> rx_xdp_drop += rq_stats -> xdp_drop ;
184
+ s -> rx_xdp_tx += rq_stats -> xdp_tx ;
185
+ s -> rx_xdp_tx_full += rq_stats -> xdp_tx_full ;
183
186
s -> rx_wqe_err += rq_stats -> wqe_err ;
184
187
s -> rx_mpwqe_filler += rq_stats -> mpwqe_filler ;
185
188
s -> rx_buff_alloc_err += rq_stats -> buff_alloc_err ;
@@ -478,6 +481,10 @@ static int mlx5e_create_rq(struct mlx5e_channel *c,
478
481
rq -> priv = c -> priv ;
479
482
rq -> xdp_prog = priv -> xdp_prog ;
480
483
484
+ rq -> buff .map_dir = DMA_FROM_DEVICE ;
485
+ if (rq -> xdp_prog )
486
+ rq -> buff .map_dir = DMA_BIDIRECTIONAL ;
487
+
481
488
switch (priv -> params .rq_wq_type ) {
482
489
case MLX5_WQ_TYPE_LINKED_LIST_STRIDING_RQ :
483
490
rq -> handle_rx_cqe = mlx5e_handle_rx_cqe_mpwrq ;
@@ -765,6 +772,28 @@ static void mlx5e_close_rq(struct mlx5e_rq *rq)
765
772
mlx5e_destroy_rq (rq );
766
773
}
767
774
775
+ static void mlx5e_free_sq_xdp_db (struct mlx5e_sq * sq )
776
+ {
777
+ kfree (sq -> db .xdp .di );
778
+ kfree (sq -> db .xdp .wqe_info );
779
+ }
780
+
781
+ static int mlx5e_alloc_sq_xdp_db (struct mlx5e_sq * sq , int numa )
782
+ {
783
+ int wq_sz = mlx5_wq_cyc_get_size (& sq -> wq );
784
+
785
+ sq -> db .xdp .di = kzalloc_node (sizeof (* sq -> db .xdp .di ) * wq_sz ,
786
+ GFP_KERNEL , numa );
787
+ sq -> db .xdp .wqe_info = kzalloc_node (sizeof (* sq -> db .xdp .wqe_info ) * wq_sz ,
788
+ GFP_KERNEL , numa );
789
+ if (!sq -> db .xdp .di || !sq -> db .xdp .wqe_info ) {
790
+ mlx5e_free_sq_xdp_db (sq );
791
+ return - ENOMEM ;
792
+ }
793
+
794
+ return 0 ;
795
+ }
796
+
768
797
static void mlx5e_free_sq_ico_db (struct mlx5e_sq * sq )
769
798
{
770
799
kfree (sq -> db .ico_wqe );
@@ -819,6 +848,9 @@ static void mlx5e_free_sq_db(struct mlx5e_sq *sq)
819
848
case MLX5E_SQ_ICO :
820
849
mlx5e_free_sq_ico_db (sq );
821
850
break ;
851
+ case MLX5E_SQ_XDP :
852
+ mlx5e_free_sq_xdp_db (sq );
853
+ break ;
822
854
}
823
855
}
824
856
@@ -829,11 +861,24 @@ static int mlx5e_alloc_sq_db(struct mlx5e_sq *sq, int numa)
829
861
return mlx5e_alloc_sq_txq_db (sq , numa );
830
862
case MLX5E_SQ_ICO :
831
863
return mlx5e_alloc_sq_ico_db (sq , numa );
864
+ case MLX5E_SQ_XDP :
865
+ return mlx5e_alloc_sq_xdp_db (sq , numa );
832
866
}
833
867
834
868
return 0 ;
835
869
}
836
870
871
+ static int mlx5e_sq_get_max_wqebbs (u8 sq_type )
872
+ {
873
+ switch (sq_type ) {
874
+ case MLX5E_SQ_ICO :
875
+ return MLX5E_ICOSQ_MAX_WQEBBS ;
876
+ case MLX5E_SQ_XDP :
877
+ return MLX5E_XDP_TX_WQEBBS ;
878
+ }
879
+ return MLX5_SEND_WQE_MAX_WQEBBS ;
880
+ }
881
+
837
882
static int mlx5e_create_sq (struct mlx5e_channel * c ,
838
883
int tc ,
839
884
struct mlx5e_sq_param * param ,
@@ -844,7 +889,6 @@ static int mlx5e_create_sq(struct mlx5e_channel *c,
844
889
845
890
void * sqc = param -> sqc ;
846
891
void * sqc_wq = MLX5_ADDR_OF (sqc , sqc , wq );
847
- u16 sq_max_wqebbs ;
848
892
int err ;
849
893
850
894
sq -> type = param -> type ;
@@ -882,7 +926,6 @@ static int mlx5e_create_sq(struct mlx5e_channel *c,
882
926
if (err )
883
927
goto err_sq_wq_destroy ;
884
928
885
- sq_max_wqebbs = MLX5_SEND_WQE_MAX_WQEBBS ;
886
929
if (sq -> type == MLX5E_SQ_TXQ ) {
887
930
int txq_ix ;
888
931
@@ -891,10 +934,7 @@ static int mlx5e_create_sq(struct mlx5e_channel *c,
891
934
priv -> txq_to_sq_map [txq_ix ] = sq ;
892
935
}
893
936
894
- if (sq -> type == MLX5E_SQ_ICO )
895
- sq_max_wqebbs = MLX5E_ICOSQ_MAX_WQEBBS ;
896
-
897
- sq -> edge = (sq -> wq .sz_m1 + 1 ) - sq_max_wqebbs ;
937
+ sq -> edge = (sq -> wq .sz_m1 + 1 ) - mlx5e_sq_get_max_wqebbs (sq -> type );
898
938
sq -> bf_budget = MLX5E_SQ_BF_BUDGET ;
899
939
900
940
return 0 ;
@@ -1068,7 +1108,7 @@ static void mlx5e_close_sq(struct mlx5e_sq *sq)
1068
1108
}
1069
1109
1070
1110
mlx5e_disable_sq (sq );
1071
- mlx5e_free_tx_descs (sq );
1111
+ mlx5e_free_sq_descs (sq );
1072
1112
mlx5e_destroy_sq (sq );
1073
1113
}
1074
1114
@@ -1429,14 +1469,31 @@ static int mlx5e_open_channel(struct mlx5e_priv *priv, int ix,
1429
1469
}
1430
1470
}
1431
1471
1472
+ if (priv -> xdp_prog ) {
1473
+ /* XDP SQ CQ params are same as normal TXQ sq CQ params */
1474
+ err = mlx5e_open_cq (c , & cparam -> tx_cq , & c -> xdp_sq .cq ,
1475
+ priv -> params .tx_cq_moderation );
1476
+ if (err )
1477
+ goto err_close_sqs ;
1478
+
1479
+ err = mlx5e_open_sq (c , 0 , & cparam -> xdp_sq , & c -> xdp_sq );
1480
+ if (err ) {
1481
+ mlx5e_close_cq (& c -> xdp_sq .cq );
1482
+ goto err_close_sqs ;
1483
+ }
1484
+ }
1485
+
1486
+ c -> xdp = !!priv -> xdp_prog ;
1432
1487
err = mlx5e_open_rq (c , & cparam -> rq , & c -> rq );
1433
1488
if (err )
1434
- goto err_close_sqs ;
1489
+ goto err_close_xdp_sq ;
1435
1490
1436
1491
netif_set_xps_queue (netdev , get_cpu_mask (c -> cpu ), ix );
1437
1492
* cp = c ;
1438
1493
1439
1494
return 0 ;
1495
+ err_close_xdp_sq :
1496
+ mlx5e_close_sq (& c -> xdp_sq );
1440
1497
1441
1498
err_close_sqs :
1442
1499
mlx5e_close_sqs (c );
@@ -1465,9 +1522,13 @@ static int mlx5e_open_channel(struct mlx5e_priv *priv, int ix,
1465
1522
static void mlx5e_close_channel (struct mlx5e_channel * c )
1466
1523
{
1467
1524
mlx5e_close_rq (& c -> rq );
1525
+ if (c -> xdp )
1526
+ mlx5e_close_sq (& c -> xdp_sq );
1468
1527
mlx5e_close_sqs (c );
1469
1528
mlx5e_close_sq (& c -> icosq );
1470
1529
napi_disable (& c -> napi );
1530
+ if (c -> xdp )
1531
+ mlx5e_close_cq (& c -> xdp_sq .cq );
1471
1532
mlx5e_close_cq (& c -> rq .cq );
1472
1533
mlx5e_close_tx_cqs (c );
1473
1534
mlx5e_close_cq (& c -> icosq .cq );
@@ -1618,12 +1679,28 @@ static void mlx5e_build_icosq_param(struct mlx5e_priv *priv,
1618
1679
param -> type = MLX5E_SQ_ICO ;
1619
1680
}
1620
1681
1682
+ static void mlx5e_build_xdpsq_param (struct mlx5e_priv * priv ,
1683
+ struct mlx5e_sq_param * param )
1684
+ {
1685
+ void * sqc = param -> sqc ;
1686
+ void * wq = MLX5_ADDR_OF (sqc , sqc , wq );
1687
+
1688
+ mlx5e_build_sq_param_common (priv , param );
1689
+ MLX5_SET (wq , wq , log_wq_sz , priv -> params .log_sq_size );
1690
+
1691
+ param -> max_inline = priv -> params .tx_max_inline ;
1692
+ /* FOR XDP SQs will support only L2 inline mode */
1693
+ param -> min_inline_mode = MLX5_INLINE_MODE_NONE ;
1694
+ param -> type = MLX5E_SQ_XDP ;
1695
+ }
1696
+
1621
1697
static void mlx5e_build_channel_param (struct mlx5e_priv * priv , struct mlx5e_channel_param * cparam )
1622
1698
{
1623
1699
u8 icosq_log_wq_sz = MLX5E_PARAMS_MINIMUM_LOG_SQ_SIZE ;
1624
1700
1625
1701
mlx5e_build_rq_param (priv , & cparam -> rq );
1626
1702
mlx5e_build_sq_param (priv , & cparam -> sq );
1703
+ mlx5e_build_xdpsq_param (priv , & cparam -> xdp_sq );
1627
1704
mlx5e_build_icosq_param (priv , & cparam -> icosq , icosq_log_wq_sz );
1628
1705
mlx5e_build_rx_cq_param (priv , & cparam -> rx_cq );
1629
1706
mlx5e_build_tx_cq_param (priv , & cparam -> tx_cq );
0 commit comments