@@ -267,12 +267,14 @@ static bool ixgbe_cache_ring_sriov(struct ixgbe_adapter *adapter)
267
267
**/
268
268
static bool ixgbe_cache_ring_rss (struct ixgbe_adapter * adapter )
269
269
{
270
- int i ;
270
+ int i , reg_idx ;
271
271
272
272
for (i = 0 ; i < adapter -> num_rx_queues ; i ++ )
273
273
adapter -> rx_ring [i ]-> reg_idx = i ;
274
- for (i = 0 ; i < adapter -> num_tx_queues ; i ++ )
275
- adapter -> tx_ring [i ]-> reg_idx = i ;
274
+ for (i = 0 , reg_idx = 0 ; i < adapter -> num_tx_queues ; i ++ , reg_idx ++ )
275
+ adapter -> tx_ring [i ]-> reg_idx = reg_idx ;
276
+ for (i = 0 ; i < adapter -> num_xdp_queues ; i ++ , reg_idx ++ )
277
+ adapter -> xdp_ring [i ]-> reg_idx = reg_idx ;
276
278
277
279
return true;
278
280
}
@@ -308,6 +310,11 @@ static void ixgbe_cache_ring_register(struct ixgbe_adapter *adapter)
308
310
ixgbe_cache_ring_rss (adapter );
309
311
}
310
312
313
+ static int ixgbe_xdp_queues (struct ixgbe_adapter * adapter )
314
+ {
315
+ return adapter -> xdp_prog ? nr_cpu_ids : 0 ;
316
+ }
317
+
311
318
#define IXGBE_RSS_64Q_MASK 0x3F
312
319
#define IXGBE_RSS_16Q_MASK 0xF
313
320
#define IXGBE_RSS_8Q_MASK 0x7
@@ -382,6 +389,7 @@ static bool ixgbe_set_dcb_sriov_queues(struct ixgbe_adapter *adapter)
382
389
adapter -> num_rx_queues_per_pool = tcs ;
383
390
384
391
adapter -> num_tx_queues = vmdq_i * tcs ;
392
+ adapter -> num_xdp_queues = 0 ;
385
393
adapter -> num_rx_queues = vmdq_i * tcs ;
386
394
387
395
#ifdef IXGBE_FCOE
@@ -479,6 +487,7 @@ static bool ixgbe_set_dcb_queues(struct ixgbe_adapter *adapter)
479
487
netdev_set_tc_queue (dev , i , rss_i , rss_i * i );
480
488
481
489
adapter -> num_tx_queues = rss_i * tcs ;
490
+ adapter -> num_xdp_queues = 0 ;
482
491
adapter -> num_rx_queues = rss_i * tcs ;
483
492
484
493
return true;
@@ -549,6 +558,7 @@ static bool ixgbe_set_sriov_queues(struct ixgbe_adapter *adapter)
549
558
550
559
adapter -> num_rx_queues = vmdq_i * rss_i ;
551
560
adapter -> num_tx_queues = vmdq_i * rss_i ;
561
+ adapter -> num_xdp_queues = 0 ;
552
562
553
563
/* disable ATR as it is not supported when VMDq is enabled */
554
564
adapter -> flags &= ~IXGBE_FLAG_FDIR_HASH_CAPABLE ;
@@ -669,6 +679,7 @@ static bool ixgbe_set_rss_queues(struct ixgbe_adapter *adapter)
669
679
#endif /* IXGBE_FCOE */
670
680
adapter -> num_rx_queues = rss_i ;
671
681
adapter -> num_tx_queues = rss_i ;
682
+ adapter -> num_xdp_queues = ixgbe_xdp_queues (adapter );
672
683
673
684
return true;
674
685
}
@@ -689,6 +700,7 @@ static void ixgbe_set_num_queues(struct ixgbe_adapter *adapter)
689
700
/* Start with base case */
690
701
adapter -> num_rx_queues = 1 ;
691
702
adapter -> num_tx_queues = 1 ;
703
+ adapter -> num_xdp_queues = 0 ;
692
704
adapter -> num_rx_pools = adapter -> num_rx_queues ;
693
705
adapter -> num_rx_queues_per_pool = 1 ;
694
706
@@ -719,8 +731,11 @@ static int ixgbe_acquire_msix_vectors(struct ixgbe_adapter *adapter)
719
731
struct ixgbe_hw * hw = & adapter -> hw ;
720
732
int i , vectors , vector_threshold ;
721
733
722
- /* We start by asking for one vector per queue pair */
734
+ /* We start by asking for one vector per queue pair with XDP queues
735
+ * being stacked with TX queues.
736
+ */
723
737
vectors = max (adapter -> num_rx_queues , adapter -> num_tx_queues );
738
+ vectors = max (vectors , adapter -> num_xdp_queues );
724
739
725
740
/* It is easy to be greedy for MSI-X vectors. However, it really
726
741
* doesn't do much good if we have a lot more vectors than CPUs. We'll
@@ -800,6 +815,8 @@ static void ixgbe_add_ring(struct ixgbe_ring *ring,
800
815
* @v_idx: index of vector in adapter struct
801
816
* @txr_count: total number of Tx rings to allocate
802
817
* @txr_idx: index of first Tx ring to allocate
818
+ * @xdp_count: total number of XDP rings to allocate
819
+ * @xdp_idx: index of first XDP ring to allocate
803
820
* @rxr_count: total number of Rx rings to allocate
804
821
* @rxr_idx: index of first Rx ring to allocate
805
822
*
@@ -808,6 +825,7 @@ static void ixgbe_add_ring(struct ixgbe_ring *ring,
808
825
static int ixgbe_alloc_q_vector (struct ixgbe_adapter * adapter ,
809
826
int v_count , int v_idx ,
810
827
int txr_count , int txr_idx ,
828
+ int xdp_count , int xdp_idx ,
811
829
int rxr_count , int rxr_idx )
812
830
{
813
831
struct ixgbe_q_vector * q_vector ;
@@ -817,7 +835,7 @@ static int ixgbe_alloc_q_vector(struct ixgbe_adapter *adapter,
817
835
int ring_count , size ;
818
836
u8 tcs = netdev_get_num_tc (adapter -> netdev );
819
837
820
- ring_count = txr_count + rxr_count ;
838
+ ring_count = txr_count + rxr_count + xdp_count ;
821
839
size = sizeof (struct ixgbe_q_vector ) +
822
840
(sizeof (struct ixgbe_ring ) * ring_count );
823
841
@@ -909,6 +927,33 @@ static int ixgbe_alloc_q_vector(struct ixgbe_adapter *adapter,
909
927
ring ++ ;
910
928
}
911
929
930
+ while (xdp_count ) {
931
+ /* assign generic ring traits */
932
+ ring -> dev = & adapter -> pdev -> dev ;
933
+ ring -> netdev = adapter -> netdev ;
934
+
935
+ /* configure backlink on ring */
936
+ ring -> q_vector = q_vector ;
937
+
938
+ /* update q_vector Tx values */
939
+ ixgbe_add_ring (ring , & q_vector -> tx );
940
+
941
+ /* apply Tx specific ring traits */
942
+ ring -> count = adapter -> tx_ring_count ;
943
+ ring -> queue_index = xdp_idx ;
944
+ set_ring_xdp (ring );
945
+
946
+ /* assign ring to adapter */
947
+ adapter -> xdp_ring [xdp_idx ] = ring ;
948
+
949
+ /* update count and index */
950
+ xdp_count -- ;
951
+ xdp_idx ++ ;
952
+
953
+ /* push pointer to next ring */
954
+ ring ++ ;
955
+ }
956
+
912
957
while (rxr_count ) {
913
958
/* assign generic ring traits */
914
959
ring -> dev = & adapter -> pdev -> dev ;
@@ -1002,17 +1047,18 @@ static int ixgbe_alloc_q_vectors(struct ixgbe_adapter *adapter)
1002
1047
int q_vectors = adapter -> num_q_vectors ;
1003
1048
int rxr_remaining = adapter -> num_rx_queues ;
1004
1049
int txr_remaining = adapter -> num_tx_queues ;
1005
- int rxr_idx = 0 , txr_idx = 0 , v_idx = 0 ;
1050
+ int xdp_remaining = adapter -> num_xdp_queues ;
1051
+ int rxr_idx = 0 , txr_idx = 0 , xdp_idx = 0 , v_idx = 0 ;
1006
1052
int err ;
1007
1053
1008
1054
/* only one q_vector if MSI-X is disabled. */
1009
1055
if (!(adapter -> flags & IXGBE_FLAG_MSIX_ENABLED ))
1010
1056
q_vectors = 1 ;
1011
1057
1012
- if (q_vectors >= (rxr_remaining + txr_remaining )) {
1058
+ if (q_vectors >= (rxr_remaining + txr_remaining + xdp_remaining )) {
1013
1059
for (; rxr_remaining ; v_idx ++ ) {
1014
1060
err = ixgbe_alloc_q_vector (adapter , q_vectors , v_idx ,
1015
- 0 , 0 , 1 , rxr_idx );
1061
+ 0 , 0 , 0 , 0 , 1 , rxr_idx );
1016
1062
1017
1063
if (err )
1018
1064
goto err_out ;
@@ -1026,8 +1072,11 @@ static int ixgbe_alloc_q_vectors(struct ixgbe_adapter *adapter)
1026
1072
for (; v_idx < q_vectors ; v_idx ++ ) {
1027
1073
int rqpv = DIV_ROUND_UP (rxr_remaining , q_vectors - v_idx );
1028
1074
int tqpv = DIV_ROUND_UP (txr_remaining , q_vectors - v_idx );
1075
+ int xqpv = DIV_ROUND_UP (xdp_remaining , q_vectors - v_idx );
1076
+
1029
1077
err = ixgbe_alloc_q_vector (adapter , q_vectors , v_idx ,
1030
1078
tqpv , txr_idx ,
1079
+ xqpv , xdp_idx ,
1031
1080
rqpv , rxr_idx );
1032
1081
1033
1082
if (err )
@@ -1036,14 +1085,17 @@ static int ixgbe_alloc_q_vectors(struct ixgbe_adapter *adapter)
1036
1085
/* update counts and index */
1037
1086
rxr_remaining -= rqpv ;
1038
1087
txr_remaining -= tqpv ;
1088
+ xdp_remaining -= xqpv ;
1039
1089
rxr_idx ++ ;
1040
1090
txr_idx ++ ;
1091
+ xdp_idx += xqpv ;
1041
1092
}
1042
1093
1043
1094
return 0 ;
1044
1095
1045
1096
err_out :
1046
1097
adapter -> num_tx_queues = 0 ;
1098
+ adapter -> num_xdp_queues = 0 ;
1047
1099
adapter -> num_rx_queues = 0 ;
1048
1100
adapter -> num_q_vectors = 0 ;
1049
1101
@@ -1066,6 +1118,7 @@ static void ixgbe_free_q_vectors(struct ixgbe_adapter *adapter)
1066
1118
int v_idx = adapter -> num_q_vectors ;
1067
1119
1068
1120
adapter -> num_tx_queues = 0 ;
1121
+ adapter -> num_xdp_queues = 0 ;
1069
1122
adapter -> num_rx_queues = 0 ;
1070
1123
adapter -> num_q_vectors = 0 ;
1071
1124
@@ -1172,9 +1225,10 @@ int ixgbe_init_interrupt_scheme(struct ixgbe_adapter *adapter)
1172
1225
1173
1226
ixgbe_cache_ring_register (adapter );
1174
1227
1175
- e_dev_info ("Multiqueue %s: Rx Queue count = %u, Tx Queue count = %u\n" ,
1228
+ e_dev_info ("Multiqueue %s: Rx Queue count = %u, Tx Queue count = %u XDP Queue count = %u \n" ,
1176
1229
(adapter -> num_rx_queues > 1 ) ? "Enabled" : "Disabled" ,
1177
- adapter -> num_rx_queues , adapter -> num_tx_queues );
1230
+ adapter -> num_rx_queues , adapter -> num_tx_queues ,
1231
+ adapter -> num_xdp_queues );
1178
1232
1179
1233
set_bit (__IXGBE_DOWN , & adapter -> state );
1180
1234
@@ -1195,6 +1249,7 @@ int ixgbe_init_interrupt_scheme(struct ixgbe_adapter *adapter)
1195
1249
void ixgbe_clear_interrupt_scheme (struct ixgbe_adapter * adapter )
1196
1250
{
1197
1251
adapter -> num_tx_queues = 0 ;
1252
+ adapter -> num_xdp_queues = 0 ;
1198
1253
adapter -> num_rx_queues = 0 ;
1199
1254
1200
1255
ixgbe_free_q_vectors (adapter );
0 commit comments