net/i40e: set TC strict priority mode

Set some TCs to strict priority mode.
It's a global setting on a physical port.

Signed-off-by: Wenzhuo Lu <wenzhuo.lu@intel.com>
Acked-by: Jingjing Wu <jingjing.wu@intel.com>
This commit is contained in:
Wenzhuo Lu 2017-02-24 11:24:31 +08:00 committed by Ferruh Yigit
parent 2b5518b705
commit 04c8542f96
6 changed files with 153 additions and 0 deletions

View File

@ -478,3 +478,13 @@ enabled. If so, return failure.
When enabling per TC max bandwidth, SW will check if per VF max bandwidth
is enabled. If so, disable per VF max bandwidth and continue with per TC max
bandwidth setting.
TC TX scheduling mode setting
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
There're 2 TX scheduling modes for TCs, round robin and strict priority mode.
If a TC is set to strict priority mode, it can consume unlimited bandwidth.
It means if APP has set the max bandwidth for that TC, it comes to no
effect.
It's suggested to set the strict priority mode for a TC that is latency
sensitive but no consuming much bandwidth.

View File

@ -93,6 +93,13 @@ New Features
i40e HW supports to set the max bandwidth for a TC on a VF. Enable this
capability.
* **Added TC strict priority mode setting on i40e.**
There're 2 TX scheduling modes supported for TCs by i40e HW, round ribon mode
and strict priority mode. By default it's round robin mode. Enable the
capability to change the TX scheduling mode for a TC. It's a global setting
on a physical port.
* **Added TSO support for tunneled and non-tunneled packets on mlx5 driver.**
Added support for Hardware TSO for tunneled and non-tunneled packets.

View File

@ -11591,3 +11591,122 @@ rte_pmd_i40e_set_vf_tc_max_bw(uint8_t port, uint16_t vf_id,
return 0;
}
int
rte_pmd_i40e_set_tc_strict_prio(uint8_t port, uint8_t tc_map)
{
struct rte_eth_dev *dev;
struct i40e_pf *pf;
struct i40e_vsi *vsi;
struct i40e_veb *veb;
struct i40e_hw *hw;
struct i40e_aqc_configure_switching_comp_ets_data ets_data;
int i;
int ret;
RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
dev = &rte_eth_devices[port];
if (!is_device_supported(dev, &rte_i40e_pmd))
return -ENOTSUP;
pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
vsi = pf->main_vsi;
if (!vsi) {
PMD_DRV_LOG(ERR, "Invalid VSI.");
return -EINVAL;
}
veb = vsi->veb;
if (!veb) {
PMD_DRV_LOG(ERR, "Invalid VEB.");
return -EINVAL;
}
if ((tc_map & veb->enabled_tc) != tc_map) {
PMD_DRV_LOG(ERR,
"TC bitmap isn't the subset of enabled TCs 0x%x.",
veb->enabled_tc);
return -EINVAL;
}
if (tc_map == veb->strict_prio_tc) {
PMD_DRV_LOG(INFO, "No change for TC bitmap. Nothing to do.");
return 0;
}
hw = I40E_VSI_TO_HW(vsi);
/* Disable DCBx if it's the first time to set strict priority. */
if (!veb->strict_prio_tc) {
ret = i40e_aq_stop_lldp(hw, true, NULL);
if (ret)
PMD_DRV_LOG(INFO,
"Failed to disable DCBx as it's already"
" disabled.");
else
PMD_DRV_LOG(INFO,
"DCBx is disabled according to strict"
" priority setting.");
}
memset(&ets_data, 0, sizeof(ets_data));
ets_data.tc_valid_bits = veb->enabled_tc;
ets_data.seepage = I40E_AQ_ETS_SEEPAGE_EN_MASK;
ets_data.tc_strict_priority_flags = tc_map;
/* Get all TCs' bandwidth. */
for (i = 0; i < I40E_MAX_TRAFFIC_CLASS; i++) {
if (veb->enabled_tc & BIT_ULL(i)) {
/* For rubust, if bandwidth is 0, use 1 instead. */
if (veb->bw_info.bw_ets_share_credits[i])
ets_data.tc_bw_share_credits[i] =
veb->bw_info.bw_ets_share_credits[i];
else
ets_data.tc_bw_share_credits[i] =
I40E_QOS_BW_WEIGHT_MIN;
}
}
if (!veb->strict_prio_tc)
ret = i40e_aq_config_switch_comp_ets(
hw, veb->uplink_seid,
&ets_data, i40e_aqc_opc_enable_switching_comp_ets,
NULL);
else if (tc_map)
ret = i40e_aq_config_switch_comp_ets(
hw, veb->uplink_seid,
&ets_data, i40e_aqc_opc_modify_switching_comp_ets,
NULL);
else
ret = i40e_aq_config_switch_comp_ets(
hw, veb->uplink_seid,
&ets_data, i40e_aqc_opc_disable_switching_comp_ets,
NULL);
if (ret) {
PMD_DRV_LOG(ERR,
"Failed to set TCs' strict priority mode."
" err (%d)", ret);
return -EINVAL;
}
veb->strict_prio_tc = tc_map;
/* Enable DCBx again, if all the TCs' strict priority disabled. */
if (!tc_map) {
ret = i40e_aq_start_lldp(hw, NULL);
if (ret) {
PMD_DRV_LOG(ERR,
"Failed to enable DCBx, err(%d).", ret);
return -EINVAL;
}
PMD_DRV_LOG(INFO,
"DCBx is enabled again according to strict"
" priority setting.");
}
return ret;
}

View File

@ -305,6 +305,7 @@ struct i40e_veb {
uint16_t stats_idx;
struct i40e_eth_stats stats;
uint8_t enabled_tc; /* The traffic class enabled */
uint8_t strict_prio_tc; /* bit map of TCs set to strict priority mode */
struct i40e_bw_info bw_info; /* VEB bandwidth information */
};

View File

@ -403,4 +403,19 @@ int rte_pmd_i40e_set_vf_tc_max_bw(uint8_t port,
uint8_t tc_no,
uint32_t bw);
/**
* Set some TCs to strict priority mode on a physical port.
*
* @param port
* The port identifier of the Ethernet device.
* @param tc_map
* A bit map for the TCs.
* @return
* - (0) if successful.
* - (-ENODEV) if *port* invalid.
* - (-EINVAL) if bad parameter.
* - (-ENOTSUP) not supported by firmware.
*/
int rte_pmd_i40e_set_tc_strict_prio(uint8_t port, uint8_t tc_map);
#endif /* _PMD_I40E_H_ */

View File

@ -26,6 +26,7 @@ DPDK_17.02 {
DPDK_17.05 {
global:
rte_pmd_i40e_set_tc_strict_prio;
rte_pmd_i40e_set_vf_max_bw;
rte_pmd_i40e_set_vf_tc_bw_alloc;
rte_pmd_i40e_set_vf_tc_max_bw;