Message ID | 20240918180256.419235-1-david.m.ertman@intel.com (mailing list archive) |
---|---|
State | Awaiting Upstream |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [iwl-net] ice: fix VLAN replay after reset | expand |
> -----Original Message----- > From: Dave Ertman <david.m.ertman@intel.com> > Sent: Wednesday, September 18, 2024 11:03 AM > To: intel-wired-lan@lists.osuosl.org > Cc: netdev@vger.kernel.org; Kitszel, Przemyslaw <przemyslaw.kitszel@intel.com> > Subject: [PATCH iwl-net] ice: fix VLAN replay after reset > > There is a bug currently when there are more than one VLAN defined > and any reset that affects the PF is initiated, after the reset rebuild > no traffic will pass on any VLAN but the last one created. > > This is caused by the iteration though the VLANs during replay each > clearing the vsi_map bitmap of the VSI that is being replayed. The > problem is that during rhe replay, the pointer to the vsi_map bitmap > is used by each successive vlan to determine if it should be replayed > on this VSI. > > The logic was that the replay of the VLAN would replace the bit in the map > before the next VLAN would iterate through. But, since the replay copies > the old bitmap pointer to filt_replay_rules and creates a new one for the > recreated VLANS, it does not do this, and leaves the old bitmap broken > to be used to replay the remaining VLANs. > > Since the old bitmap will be cleaned up in post replay cleanup, there is > no need to alter it and break following VLAN replay, so don't clear the > bit. > > Fixes: 334cb0626de1 ("ice: Implement VSI replay framework") > Reviewed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com> > Signed-off-by: Dave Ertman <david.m.ertman@intel.com> > --- Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
diff --git a/drivers/net/ethernet/intel/ice/ice_switch.c b/drivers/net/ethernet/intel/ice/ice_switch.c index 79d91e95358c..0e740342e294 100644 --- a/drivers/net/ethernet/intel/ice/ice_switch.c +++ b/drivers/net/ethernet/intel/ice/ice_switch.c @@ -6322,8 +6322,6 @@ ice_replay_vsi_fltr(struct ice_hw *hw, u16 vsi_handle, u8 recp_id, if (!itr->vsi_list_info || !test_bit(vsi_handle, itr->vsi_list_info->vsi_map)) continue; - /* Clearing it so that the logic can add it back */ - clear_bit(vsi_handle, itr->vsi_list_info->vsi_map); f_entry.fltr_info.vsi_handle = vsi_handle; f_entry.fltr_info.fltr_act = ICE_FWD_TO_VSI; /* update the src in case it is VSI num */