diff --git a/patches.kernel.org/6.2.12-053-iavf-refactor-VLAN-filter-states.patch b/patches.kernel.org/6.2.12-053-iavf-refactor-VLAN-filter-states.patch new file mode 100644 index 0000000..3f03b2c --- /dev/null +++ b/patches.kernel.org/6.2.12-053-iavf-refactor-VLAN-filter-states.patch @@ -0,0 +1,211 @@ +From: Ahmed Zaki +Date: Thu, 6 Apr 2023 15:35:27 -0600 +Subject: [PATCH] iavf: refactor VLAN filter states +References: bsc#1012628 +Patch-mainline: 6.2.12 +Git-commit: 0c0da0e951053fda20412cd284e2714bbbb31bff + +[ Upstream commit 0c0da0e951053fda20412cd284e2714bbbb31bff ] + +The VLAN filter states are currently being saved as individual bits. +This is error prone as multiple bits might be mistakenly set. + +Fix by replacing the bits with a single state enum. Also, add an +"ACTIVE" state for filters that are accepted by the PF. + +Signed-off-by: Ahmed Zaki +Tested-by: Rafal Romanowski +Signed-off-by: Tony Nguyen +Stable-dep-of: 9c85b7fa12ef ("iavf: remove active_cvlans and active_svlans bitmaps") +Signed-off-by: Sasha Levin +Signed-off-by: Jiri Slaby +--- + drivers/net/ethernet/intel/iavf/iavf.h | 15 +++++---- + drivers/net/ethernet/intel/iavf/iavf_main.c | 8 ++--- + .../net/ethernet/intel/iavf/iavf_virtchnl.c | 31 +++++++++---------- + 3 files changed, 28 insertions(+), 26 deletions(-) + +diff --git a/drivers/net/ethernet/intel/iavf/iavf.h b/drivers/net/ethernet/intel/iavf/iavf.h +index 2a9f1eee..fdbb5d9a 100644 +--- a/drivers/net/ethernet/intel/iavf/iavf.h ++++ b/drivers/net/ethernet/intel/iavf/iavf.h +@@ -157,15 +157,18 @@ struct iavf_vlan { + u16 tpid; + }; + ++enum iavf_vlan_state_t { ++ IAVF_VLAN_INVALID, ++ IAVF_VLAN_ADD, /* filter needs to be added */ ++ IAVF_VLAN_IS_NEW, /* filter is new, wait for PF answer */ ++ IAVF_VLAN_ACTIVE, /* filter is accepted by PF */ ++ IAVF_VLAN_REMOVE, /* filter needs to be removed */ ++}; ++ + struct iavf_vlan_filter { + struct list_head list; + struct iavf_vlan vlan; +- struct { +- u8 is_new_vlan:1; /* filter is new, wait for PF answer */ +- u8 remove:1; /* filter needs to be removed */ +- u8 add:1; /* filter needs to be added */ +- u8 padding:5; +- }; ++ enum iavf_vlan_state_t state; + }; + + #define IAVF_MAX_TRAFFIC_CLASS 4 +diff --git a/drivers/net/ethernet/intel/iavf/iavf_main.c b/drivers/net/ethernet/intel/iavf/iavf_main.c +index 8bbdf66c..3faa9e4d 100644 +--- a/drivers/net/ethernet/intel/iavf/iavf_main.c ++++ b/drivers/net/ethernet/intel/iavf/iavf_main.c +@@ -791,7 +791,7 @@ iavf_vlan_filter *iavf_add_vlan(struct iavf_adapter *adapter, + f->vlan = vlan; + + list_add_tail(&f->list, &adapter->vlan_filter_list); +- f->add = true; ++ f->state = IAVF_VLAN_ADD; + adapter->aq_required |= IAVF_FLAG_AQ_ADD_VLAN_FILTER; + } + +@@ -813,7 +813,7 @@ static void iavf_del_vlan(struct iavf_adapter *adapter, struct iavf_vlan vlan) + + f = iavf_find_vlan(adapter, vlan); + if (f) { +- f->remove = true; ++ f->state = IAVF_VLAN_REMOVE; + adapter->aq_required |= IAVF_FLAG_AQ_DEL_VLAN_FILTER; + } + +@@ -1296,11 +1296,11 @@ static void iavf_clear_mac_vlan_filters(struct iavf_adapter *adapter) + /* remove all VLAN filters */ + list_for_each_entry_safe(vlf, vlftmp, &adapter->vlan_filter_list, + list) { +- if (vlf->add) { ++ if (vlf->state == IAVF_VLAN_ADD) { + list_del(&vlf->list); + kfree(vlf); + } else { +- vlf->remove = true; ++ vlf->state = IAVF_VLAN_REMOVE; + } + } + spin_unlock_bh(&adapter->mac_vlan_list_lock); +diff --git a/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c b/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c +index 0fea6b9b..fd023983 100644 +--- a/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c ++++ b/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c +@@ -642,7 +642,7 @@ static void iavf_vlan_add_reject(struct iavf_adapter *adapter) + + spin_lock_bh(&adapter->mac_vlan_list_lock); + list_for_each_entry_safe(f, ftmp, &adapter->vlan_filter_list, list) { +- if (f->is_new_vlan) { ++ if (f->state == IAVF_VLAN_IS_NEW) { + if (f->vlan.tpid == ETH_P_8021Q) + clear_bit(f->vlan.vid, + adapter->vsi.active_cvlans); +@@ -679,7 +679,7 @@ void iavf_add_vlans(struct iavf_adapter *adapter) + spin_lock_bh(&adapter->mac_vlan_list_lock); + + list_for_each_entry(f, &adapter->vlan_filter_list, list) { +- if (f->add) ++ if (f->state == IAVF_VLAN_ADD) + count++; + } + if (!count || !VLAN_FILTERING_ALLOWED(adapter)) { +@@ -710,11 +710,10 @@ void iavf_add_vlans(struct iavf_adapter *adapter) + vvfl->vsi_id = adapter->vsi_res->vsi_id; + vvfl->num_elements = count; + list_for_each_entry(f, &adapter->vlan_filter_list, list) { +- if (f->add) { ++ if (f->state == IAVF_VLAN_ADD) { + vvfl->vlan_id[i] = f->vlan.vid; + i++; +- f->add = false; +- f->is_new_vlan = true; ++ f->state = IAVF_VLAN_IS_NEW; + if (i == count) + break; + } +@@ -760,7 +759,7 @@ void iavf_add_vlans(struct iavf_adapter *adapter) + vvfl_v2->vport_id = adapter->vsi_res->vsi_id; + vvfl_v2->num_elements = count; + list_for_each_entry(f, &adapter->vlan_filter_list, list) { +- if (f->add) { ++ if (f->state == IAVF_VLAN_ADD) { + struct virtchnl_vlan_supported_caps *filtering_support = + &adapter->vlan_v2_caps.filtering.filtering_support; + struct virtchnl_vlan *vlan; +@@ -778,8 +777,7 @@ void iavf_add_vlans(struct iavf_adapter *adapter) + vlan->tpid = f->vlan.tpid; + + i++; +- f->add = false; +- f->is_new_vlan = true; ++ f->state = IAVF_VLAN_IS_NEW; + } + } + +@@ -822,10 +820,11 @@ void iavf_del_vlans(struct iavf_adapter *adapter) + * filters marked for removal to enable bailing out before + * sending a virtchnl message + */ +- if (f->remove && !VLAN_FILTERING_ALLOWED(adapter)) { ++ if (f->state == IAVF_VLAN_REMOVE && ++ !VLAN_FILTERING_ALLOWED(adapter)) { + list_del(&f->list); + kfree(f); +- } else if (f->remove) { ++ } else if (f->state == IAVF_VLAN_REMOVE) { + count++; + } + } +@@ -857,7 +856,7 @@ void iavf_del_vlans(struct iavf_adapter *adapter) + vvfl->vsi_id = adapter->vsi_res->vsi_id; + vvfl->num_elements = count; + list_for_each_entry_safe(f, ftmp, &adapter->vlan_filter_list, list) { +- if (f->remove) { ++ if (f->state == IAVF_VLAN_REMOVE) { + vvfl->vlan_id[i] = f->vlan.vid; + i++; + list_del(&f->list); +@@ -901,7 +900,7 @@ void iavf_del_vlans(struct iavf_adapter *adapter) + vvfl_v2->vport_id = adapter->vsi_res->vsi_id; + vvfl_v2->num_elements = count; + list_for_each_entry_safe(f, ftmp, &adapter->vlan_filter_list, list) { +- if (f->remove) { ++ if (f->state == IAVF_VLAN_REMOVE) { + struct virtchnl_vlan_supported_caps *filtering_support = + &adapter->vlan_v2_caps.filtering.filtering_support; + struct virtchnl_vlan *vlan; +@@ -2192,7 +2191,7 @@ void iavf_virtchnl_completion(struct iavf_adapter *adapter, + list_for_each_entry(vlf, + &adapter->vlan_filter_list, + list) +- vlf->add = true; ++ vlf->state = IAVF_VLAN_ADD; + + adapter->aq_required |= + IAVF_FLAG_AQ_ADD_VLAN_FILTER; +@@ -2260,7 +2259,7 @@ void iavf_virtchnl_completion(struct iavf_adapter *adapter, + list_for_each_entry(vlf, + &adapter->vlan_filter_list, + list) +- vlf->add = true; ++ vlf->state = IAVF_VLAN_ADD; + + aq_required |= IAVF_FLAG_AQ_ADD_VLAN_FILTER; + } +@@ -2444,8 +2443,8 @@ void iavf_virtchnl_completion(struct iavf_adapter *adapter, + + spin_lock_bh(&adapter->mac_vlan_list_lock); + list_for_each_entry(f, &adapter->vlan_filter_list, list) { +- if (f->is_new_vlan) { +- f->is_new_vlan = false; ++ if (f->state == IAVF_VLAN_IS_NEW) { ++ f->state = IAVF_VLAN_ACTIVE; + if (f->vlan.tpid == ETH_P_8021Q) + set_bit(f->vlan.vid, + adapter->vsi.active_cvlans); +-- +2.35.3 + diff --git a/series.conf b/series.conf index ab3bd09..6bc861d 100644 --- a/series.conf +++ b/series.conf @@ -2280,6 +2280,7 @@ patches.kernel.org/6.2.12-050-niu-Fix-missing-unwind-goto-in-niu_alloc_chann.patch patches.kernel.org/6.2.12-051-tcp-restrict-net.ipv4.tcp_app_win.patch patches.kernel.org/6.2.12-052-bonding-fix-ns-validation-on-backup-slaves.patch + patches.kernel.org/6.2.12-053-iavf-refactor-VLAN-filter-states.patch ######################################################## # Build fixes that apply to the vanilla kernel too.