@@ -5121,12 +5121,48 @@ get_fwd_port_total_tc_num(void)
51215121
51225122 for (i = 0 ; i < nb_fwd_ports ; i ++ ) {
51235123 (void )rte_eth_dev_get_dcb_info (fwd_ports_ids [i ], & dcb_info );
5124- total_tc_num += dcb_info .nb_tcs ;
5124+ total_tc_num += rte_popcount32 ( dcb_fwd_tc_mask & (( 1u << dcb_info .nb_tcs ) - 1 )) ;
51255125 }
51265126
51275127 return total_tc_num ;
51285128}
51295129
5130+ static void
5131+ dcb_fwd_tc_update_dcb_info (struct rte_eth_dcb_info * org_dcb_info )
5132+ {
5133+ struct rte_eth_dcb_info dcb_info = {0 };
5134+ uint32_t i , vmdq_idx ;
5135+ uint32_t tc = 0 ;
5136+
5137+ if (dcb_fwd_tc_mask == DEFAULT_DCB_FWD_TC_MASK )
5138+ return ;
5139+
5140+ /*
5141+ * Use compress scheme to update dcb-info.
5142+ * E.g. If org_dcb_info->nb_tcs is 4 and dcb_fwd_tc_mask is 0x8, it
5143+ * means only enable TC3, then the new dcb-info's nb_tcs is set to
5144+ * 1, and also move corresponding tc_rxq and tc_txq info to new
5145+ * index.
5146+ */
5147+ for (i = 0 ; i < org_dcb_info -> nb_tcs ; i ++ ) {
5148+ if (!(dcb_fwd_tc_mask & (1u << i )))
5149+ continue ;
5150+ for (vmdq_idx = 0 ; vmdq_idx < RTE_ETH_MAX_VMDQ_POOL ; vmdq_idx ++ ) {
5151+ dcb_info .tc_queue .tc_rxq [vmdq_idx ][tc ].base =
5152+ org_dcb_info -> tc_queue .tc_rxq [vmdq_idx ][i ].base ;
5153+ dcb_info .tc_queue .tc_rxq [vmdq_idx ][tc ].nb_queue =
5154+ org_dcb_info -> tc_queue .tc_rxq [vmdq_idx ][i ].nb_queue ;
5155+ dcb_info .tc_queue .tc_txq [vmdq_idx ][tc ].base =
5156+ org_dcb_info -> tc_queue .tc_txq [vmdq_idx ][i ].base ;
5157+ dcb_info .tc_queue .tc_txq [vmdq_idx ][tc ].nb_queue =
5158+ org_dcb_info -> tc_queue .tc_txq [vmdq_idx ][i ].nb_queue ;
5159+ }
5160+ tc ++ ;
5161+ }
5162+ dcb_info .nb_tcs = tc ;
5163+ * org_dcb_info = dcb_info ;
5164+ }
5165+
51305166/**
51315167 * For the DCB forwarding test, each core is assigned on each traffic class.
51325168 *
@@ -5176,11 +5212,17 @@ dcb_fwd_config_setup(void)
51765212 }
51775213 }
51785214
5215+ total_tc_num = get_fwd_port_total_tc_num ();
5216+ if (total_tc_num == 0 ) {
5217+ fprintf (stderr , "Error: total forwarding TC num is zero!\n" );
5218+ cur_fwd_config .nb_fwd_lcores = 0 ;
5219+ return ;
5220+ }
5221+
51795222 cur_fwd_config .nb_fwd_lcores = (lcoreid_t ) nb_fwd_lcores ;
51805223 cur_fwd_config .nb_fwd_ports = nb_fwd_ports ;
51815224 cur_fwd_config .nb_fwd_streams =
51825225 (streamid_t ) (nb_rxq * cur_fwd_config .nb_fwd_ports );
5183- total_tc_num = get_fwd_port_total_tc_num ();
51845226 if (cur_fwd_config .nb_fwd_lcores > total_tc_num )
51855227 cur_fwd_config .nb_fwd_lcores = total_tc_num ;
51865228
@@ -5190,7 +5232,9 @@ dcb_fwd_config_setup(void)
51905232 txp = fwd_topology_tx_port_get (rxp );
51915233 /* get the dcb info on the first RX and TX ports */
51925234 (void )rte_eth_dev_get_dcb_info (fwd_ports_ids [rxp ], & rxp_dcb_info );
5235+ dcb_fwd_tc_update_dcb_info (& rxp_dcb_info );
51935236 (void )rte_eth_dev_get_dcb_info (fwd_ports_ids [txp ], & txp_dcb_info );
5237+ dcb_fwd_tc_update_dcb_info (& txp_dcb_info );
51945238
51955239 for (lc_id = 0 ; lc_id < cur_fwd_config .nb_fwd_lcores ; lc_id ++ ) {
51965240 fwd_lcores [lc_id ]-> stream_nb = 0 ;
@@ -5238,7 +5282,9 @@ dcb_fwd_config_setup(void)
52385282 txp = fwd_topology_tx_port_get (rxp );
52395283 /* get the dcb information on next RX and TX ports */
52405284 rte_eth_dev_get_dcb_info (fwd_ports_ids [rxp ], & rxp_dcb_info );
5285+ dcb_fwd_tc_update_dcb_info (& rxp_dcb_info );
52415286 rte_eth_dev_get_dcb_info (fwd_ports_ids [txp ], & txp_dcb_info );
5287+ dcb_fwd_tc_update_dcb_info (& txp_dcb_info );
52425288 }
52435289}
52445290
0 commit comments