> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Qi Zhang
> Sent: Monday, May 28, 2018 10:01 AM
> To: Xing, Beilei <beilei.xing@intel.com>
> Cc: dev@dpdk.org; Zhang, Helin <helin.zhang@intel.com>; Wang, Liang-min
> <liang-min.wang@intel.com>; Zhang, Qi Z <qi.z.zhang@intel.com>
> Subject: [dpdk-dev] [PATCH 1/2] net/i40e: improve VF VLAN performance
>
> Add vlan to vlan prune table cost additinal firmware cycle that cause
> significent performance downgrade. This patch remove related code when
The patch looks OK for me, just some typo:
additinal->additional
Significent-> significant
> enable vlan filter, the side effect is vlan anti spoof will not work, following
> patch will deal with it.
>
> Signed-off-by: Qi Zhang <qi.z.zhang@intel.com>
> ---
@@ -5337,7 +5337,6 @@ i40e_vsi_setup(struct i40e_pf *pf,
vsi->parent_vsi = uplink_vsi ? uplink_vsi : pf->main_vsi;
vsi->user_param = user_param;
vsi->vlan_anti_spoof_on = 0;
- vsi->vlan_filter_on = 0;
/* Allocate queues */
switch (vsi->type) {
case I40E_VSI_MAIN :
@@ -6710,32 +6709,10 @@ void
i40e_set_vlan_filter(struct i40e_vsi *vsi,
uint16_t vlan_id, bool on)
{
- struct i40e_hw *hw = I40E_VSI_TO_HW(vsi);
- struct i40e_aqc_add_remove_vlan_element_data vlan_data = {0};
- int ret;
-
if (vlan_id > ETH_VLAN_ID_MAX)
return;
i40e_store_vlan_filter(vsi, vlan_id, on);
-
- if ((!vsi->vlan_anti_spoof_on && !vsi->vlan_filter_on) || !vlan_id)
- return;
-
- vlan_data.vlan_tag = rte_cpu_to_le_16(vlan_id);
-
- if (on) {
- ret = i40e_aq_add_vlan(hw, vsi->seid,
- &vlan_data, 1, NULL);
- if (ret != I40E_SUCCESS)
- PMD_DRV_LOG(ERR, "Failed to add vlan filter");
- } else {
- ret = i40e_aq_remove_vlan(hw, vsi->seid,
- &vlan_data, 1, NULL);
- if (ret != I40E_SUCCESS)
- PMD_DRV_LOG(ERR,
- "Failed to remove vlan filter");
- }
}
/**
@@ -378,7 +378,6 @@ struct i40e_vsi {
uint16_t nb_msix; /* The max number of msix vector */
uint8_t enabled_tc; /* The traffic class enabled */
uint8_t vlan_anti_spoof_on; /* The VLAN anti-spoofing enabled */
- uint8_t vlan_filter_on; /* The VLAN filter enabled */
struct i40e_bw_info bw_info; /* VSI bandwidth information */
};
@@ -102,45 +102,6 @@ rte_pmd_i40e_set_vf_mac_anti_spoof(uint16_t port, uint16_t vf_id, uint8_t on)
return ret;
}
-static int
-i40e_add_rm_all_vlan_filter(struct i40e_vsi *vsi, uint8_t add)
-{
- uint32_t j, k;
- uint16_t vlan_id;
- struct i40e_hw *hw = I40E_VSI_TO_HW(vsi);
- struct i40e_aqc_add_remove_vlan_element_data vlan_data = {0};
- int ret;
-
- for (j = 0; j < I40E_VFTA_SIZE; j++) {
- if (!vsi->vfta[j])
- continue;
-
- for (k = 0; k < I40E_UINT32_BIT_SIZE; k++) {
- if (!(vsi->vfta[j] & (1 << k)))
- continue;
-
- vlan_id = j * I40E_UINT32_BIT_SIZE + k;
- if (!vlan_id)
- continue;
-
- vlan_data.vlan_tag = rte_cpu_to_le_16(vlan_id);
- if (add)
- ret = i40e_aq_add_vlan(hw, vsi->seid,
- &vlan_data, 1, NULL);
- else
- ret = i40e_aq_remove_vlan(hw, vsi->seid,
- &vlan_data, 1, NULL);
- if (ret != I40E_SUCCESS) {
- PMD_DRV_LOG(ERR,
- "Failed to add/rm vlan filter");
- return ret;
- }
- }
- }
-
- return I40E_SUCCESS;
-}
-
int
rte_pmd_i40e_set_vf_vlan_anti_spoof(uint16_t port, uint16_t vf_id, uint8_t on)
{
@@ -176,14 +137,6 @@ rte_pmd_i40e_set_vf_vlan_anti_spoof(uint16_t port, uint16_t vf_id, uint8_t on)
return 0; /* already on or off */
vsi->vlan_anti_spoof_on = on;
- if (!vsi->vlan_filter_on) {
- ret = i40e_add_rm_all_vlan_filter(vsi, on);
- if (ret) {
- PMD_DRV_LOG(ERR, "Failed to add/remove VLAN filters.");
- return -ENOTSUP;
- }
- }
-
vsi->info.valid_sections = cpu_to_le16(I40E_AQ_VSI_PROP_SECURITY_VALID);
if (on)
vsi->info.sec_flags |= I40E_AQ_VSI_SEC_FLAG_ENABLE_VLAN_CHK;
@@ -364,13 +317,6 @@ i40e_vsi_set_tx_loopback(struct i40e_vsi *vsi, uint8_t on)
PMD_INIT_LOG(ERR, "Failed to remove MAC filters.");
return ret;
}
- if (vsi->vlan_anti_spoof_on || vsi->vlan_filter_on) {
- ret = i40e_add_rm_all_vlan_filter(vsi, 0);
- if (ret) {
- PMD_INIT_LOG(ERR, "Failed to remove VLAN filters.");
- return ret;
- }
- }
vsi->info.valid_sections = cpu_to_le16(I40E_AQ_VSI_PROP_SWITCH_VALID);
if (on)
@@ -390,13 +336,6 @@ i40e_vsi_set_tx_loopback(struct i40e_vsi *vsi, uint8_t on)
/* add all the MAC and VLAN back */
ret = i40e_vsi_restore_mac_filter(vsi);
- if (ret)
- return ret;
- if (vsi->vlan_anti_spoof_on || vsi->vlan_filter_on) {
- ret = i40e_add_rm_all_vlan_filter(vsi, 1);
- if (ret)
- return ret;
- }
return ret;
}
@@ -849,32 +788,6 @@ int rte_pmd_i40e_set_vf_vlan_tag(uint16_t port, uint16_t vf_id, uint8_t on)
return ret;
}
-static int
-i40e_vlan_filter_count(struct i40e_vsi *vsi)
-{
- uint32_t j, k;
- uint16_t vlan_id;
- int count = 0;
-
- for (j = 0; j < I40E_VFTA_SIZE; j++) {
- if (!vsi->vfta[j])
- continue;
-
- for (k = 0; k < I40E_UINT32_BIT_SIZE; k++) {
- if (!(vsi->vfta[j] & (1 << k)))
- continue;
-
- vlan_id = j * I40E_UINT32_BIT_SIZE + k;
- if (!vlan_id)
- continue;
-
- count++;
- }
- }
-
- return count;
-}
-
int rte_pmd_i40e_set_vf_vlan_filter(uint16_t port, uint16_t vlan_id,
uint64_t vf_mask, uint8_t on)
{
@@ -923,29 +836,10 @@ int rte_pmd_i40e_set_vf_vlan_filter(uint16_t port, uint16_t vlan_id,
for (vf_idx = 0; vf_idx < pf->vf_num && ret == I40E_SUCCESS; vf_idx++) {
if (vf_mask & ((uint64_t)(1ULL << vf_idx))) {
vsi = pf->vfs[vf_idx].vsi;
- if (on) {
- if (!vsi->vlan_filter_on) {
- vsi->vlan_filter_on = true;
- i40e_aq_set_vsi_vlan_promisc(hw,
- vsi->seid,
- false,
- NULL);
- if (!vsi->vlan_anti_spoof_on)
- i40e_add_rm_all_vlan_filter(
- vsi, true);
- }
+ if (on)
ret = i40e_vsi_add_vlan(vsi, vlan_id);
- } else {
+ else
ret = i40e_vsi_delete_vlan(vsi, vlan_id);
-
- if (!i40e_vlan_filter_count(vsi)) {
- vsi->vlan_filter_on = false;
- i40e_aq_set_vsi_vlan_promisc(hw,
- vsi->seid,
- true,
- NULL);
- }
- }
}
}