Message ID | 20240904120052.24561-1-michal.swiatkowski@linux.intel.com |
---|---|
State | Superseded |
Headers | show |
Series | [iwl-net,v1] iavf: allow changing VLAN state without calling PF | expand |
On 9/4/24 14:00, Michal Swiatkowski wrote: > First case: [...] > Second case: [...] > With fix for previous case we end up with no VLAN filters in hardware. > We have to remove VLAN filters if the state is IAVF_VLAN_ADD and delete > VLAN was called. It is save as IAVF_VLAN_ADD means that virtchnl message > wasn't sent yet. I'm fine with combining the two cases into one commit as that is related > > Fixes: 0c0da0e95105 ("iavf: refactor VLAN filter states") > Signed-off-by: Michal Swiatkowski <michal.swiatkowski@linux.intel.com> > --- > drivers/net/ethernet/intel/iavf/iavf_main.c | 18 ++++++++++++++++-- > 1 file changed, 16 insertions(+), 2 deletions(-) [...] > @@ -793,8 +798,17 @@ static void iavf_del_vlan(struct iavf_adapter *adapter, struct iavf_vlan vlan) > > f = iavf_find_vlan(adapter, vlan); > if (f) { > - f->state = IAVF_VLAN_REMOVE; you forgot to put this line in else case below > - iavf_schedule_aq_request(adapter, IAVF_FLAG_AQ_DEL_VLAN_FILTER); > + /* IAVF_ADD_VLAN means that VLAN wasn't even added yet. > + * Remove it from the list. > + */ > + if (f->state == IAVF_VLAN_ADD) { > + list_del(&f->list); > + kfree(f); > + adapter->num_vlan_filters--; > + } else { > + iavf_schedule_aq_request(adapter, > + IAVF_FLAG_AQ_DEL_VLAN_FILTER); > + } > } > > spin_unlock_bh(&adapter->mac_vlan_list_lock);
On Thu, Sep 05, 2024 at 08:19:58AM +0200, Przemek Kitszel wrote: > On 9/4/24 14:00, Michal Swiatkowski wrote: > > First case: > > [...] > > > Second case: > > [...] > > > With fix for previous case we end up with no VLAN filters in hardware. > > We have to remove VLAN filters if the state is IAVF_VLAN_ADD and delete > > VLAN was called. It is save as IAVF_VLAN_ADD means that virtchnl message > > wasn't sent yet. > > I'm fine with combining the two cases into one commit as that is related > > > > > Fixes: 0c0da0e95105 ("iavf: refactor VLAN filter states") > > Signed-off-by: Michal Swiatkowski <michal.swiatkowski@linux.intel.com> > > --- > > drivers/net/ethernet/intel/iavf/iavf_main.c | 18 ++++++++++++++++-- > > 1 file changed, 16 insertions(+), 2 deletions(-) > > [...] > > > @@ -793,8 +798,17 @@ static void iavf_del_vlan(struct iavf_adapter *adapter, struct iavf_vlan vlan) > > f = iavf_find_vlan(adapter, vlan); > > if (f) { > > - f->state = IAVF_VLAN_REMOVE; > > you forgot to put this line in else case below > Oh, sorry, thanks for finding that. Will send v2. > > - iavf_schedule_aq_request(adapter, IAVF_FLAG_AQ_DEL_VLAN_FILTER); > > + /* IAVF_ADD_VLAN means that VLAN wasn't even added yet. > > + * Remove it from the list. > > + */ > > + if (f->state == IAVF_VLAN_ADD) { > > + list_del(&f->list); > > + kfree(f); > > + adapter->num_vlan_filters--; > > + } else { > > + iavf_schedule_aq_request(adapter, > > + IAVF_FLAG_AQ_DEL_VLAN_FILTER); > > + } > > } > > spin_unlock_bh(&adapter->mac_vlan_list_lock); >
diff --git a/drivers/net/ethernet/intel/iavf/iavf_main.c b/drivers/net/ethernet/intel/iavf/iavf_main.c index ff11bafb3b4f..ae5e37eac761 100644 --- a/drivers/net/ethernet/intel/iavf/iavf_main.c +++ b/drivers/net/ethernet/intel/iavf/iavf_main.c @@ -773,6 +773,11 @@ iavf_vlan_filter *iavf_add_vlan(struct iavf_adapter *adapter, f->state = IAVF_VLAN_ADD; adapter->num_vlan_filters++; iavf_schedule_aq_request(adapter, IAVF_FLAG_AQ_ADD_VLAN_FILTER); + } else if (f->state == IAVF_VLAN_REMOVE) { + /* IAVF_VLAN_REMOVE means that VLAN wasn't yet removed. + * We can safely only change the state here. + */ + f->state = IAVF_VLAN_ACTIVE; } clearout: @@ -793,8 +798,17 @@ static void iavf_del_vlan(struct iavf_adapter *adapter, struct iavf_vlan vlan) f = iavf_find_vlan(adapter, vlan); if (f) { - f->state = IAVF_VLAN_REMOVE; - iavf_schedule_aq_request(adapter, IAVF_FLAG_AQ_DEL_VLAN_FILTER); + /* IAVF_ADD_VLAN means that VLAN wasn't even added yet. + * Remove it from the list. + */ + if (f->state == IAVF_VLAN_ADD) { + list_del(&f->list); + kfree(f); + adapter->num_vlan_filters--; + } else { + iavf_schedule_aq_request(adapter, + IAVF_FLAG_AQ_DEL_VLAN_FILTER); + } } spin_unlock_bh(&adapter->mac_vlan_list_lock);