Message ID | 20240927123801.14853-1-wojciech.drewek@intel.com (mailing list archive) |
---|---|
State | Awaiting Upstream |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [iwl-net,v2] ice: Flush FDB entries before reset | expand |
> -----Original Message----- > From: Intel-wired-lan <intel-wired-lan-bounces@osuosl.org> On Behalf Of > Wojciech Drewek > Sent: Friday, September 27, 2024 6:08 PM > To: netdev@vger.kernel.org > Cc: Nguyen, Anthony L <anthony.l.nguyen@intel.com>; > marcin.szycik@linux.intel.com; intel-wired-lan@lists.osuosl.org; > horms@kernel.org; michal.swiatkowski@linux.intel.com > Subject: [Intel-wired-lan] [PATCH iwl-net v2] ice: Flush FDB entries before > reset > > Triggering the reset while in switchdev mode causes errors[1]. Rules are > already removed by this time because switch content is flushed in case of the > reset. > This means that rules were deleted from HW but SW still thinks they exist so > when we get SWITCHDEV_FDB_DEL_TO_DEVICE notification we try to delete > not existing rule. > > We can avoid these errors by clearing the rules early in the reset flow before > they are removed from HW. > Switchdev API will get notified that the rule was removed so we won't get > SWITCHDEV_FDB_DEL_TO_DEVICE notification. > Remove unnecessary ice_clear_sw_switch_recipes. > > [1] > ice 0000:01:00.0: Failed to delete FDB forward rule, err: -2 ice 0000:01:00.0: > Failed to delete FDB guard rule, err: -2 > > Fixes: 7c945a1a8e5f ("ice: Switchdev FDB events support") > Reviewed-by: Mateusz Polchlopek <mateusz.polchlopek@intel.com> > Signed-off-by: Wojciech Drewek <wojciech.drewek@intel.com> > --- > v2: extend commit msg, add NULL pointer check > --- > .../net/ethernet/intel/ice/ice_eswitch_br.c | 5 +++- > .../net/ethernet/intel/ice/ice_eswitch_br.h | 1 + > drivers/net/ethernet/intel/ice/ice_main.c | 24 +++---------------- > 3 files changed, 8 insertions(+), 22 deletions(-) > Tested-by: Sujai Buvaneswaran <sujai.buvaneswaran@intel.com>
diff --git a/drivers/net/ethernet/intel/ice/ice_eswitch_br.c b/drivers/net/ethernet/intel/ice/ice_eswitch_br.c index f5aceb32bf4d..cccb7ddf61c9 100644 --- a/drivers/net/ethernet/intel/ice/ice_eswitch_br.c +++ b/drivers/net/ethernet/intel/ice/ice_eswitch_br.c @@ -582,10 +582,13 @@ ice_eswitch_br_switchdev_event(struct notifier_block *nb, return NOTIFY_DONE; } -static void ice_eswitch_br_fdb_flush(struct ice_esw_br *bridge) +void ice_eswitch_br_fdb_flush(struct ice_esw_br *bridge) { struct ice_esw_br_fdb_entry *entry, *tmp; + if (!bridge) + return; + list_for_each_entry_safe(entry, tmp, &bridge->fdb_list, list) ice_eswitch_br_fdb_entry_notify_and_cleanup(bridge, entry); } diff --git a/drivers/net/ethernet/intel/ice/ice_eswitch_br.h b/drivers/net/ethernet/intel/ice/ice_eswitch_br.h index c15c7344d7f8..66a2c804338f 100644 --- a/drivers/net/ethernet/intel/ice/ice_eswitch_br.h +++ b/drivers/net/ethernet/intel/ice/ice_eswitch_br.h @@ -117,5 +117,6 @@ void ice_eswitch_br_offloads_deinit(struct ice_pf *pf); int ice_eswitch_br_offloads_init(struct ice_pf *pf); +void ice_eswitch_br_fdb_flush(struct ice_esw_br *bridge); #endif /* _ICE_ESWITCH_BR_H_ */ diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c index c7db88b517da..dcd4c8204753 100644 --- a/drivers/net/ethernet/intel/ice/ice_main.c +++ b/drivers/net/ethernet/intel/ice/ice_main.c @@ -519,25 +519,6 @@ static void ice_pf_dis_all_vsi(struct ice_pf *pf, bool locked) pf->vf_agg_node[node].num_vsis = 0; } -/** - * ice_clear_sw_switch_recipes - clear switch recipes - * @pf: board private structure - * - * Mark switch recipes as not created in sw structures. There are cases where - * rules (especially advanced rules) need to be restored, either re-read from - * hardware or added again. For example after the reset. 'recp_created' flag - * prevents from doing that and need to be cleared upfront. - */ -static void ice_clear_sw_switch_recipes(struct ice_pf *pf) -{ - struct ice_sw_recipe *recp; - u8 i; - - recp = pf->hw.switch_info->recp_list; - for (i = 0; i < ICE_MAX_NUM_RECIPES; i++) - recp[i].recp_created = false; -} - /** * ice_prepare_for_reset - prep for reset * @pf: board private structure @@ -574,8 +555,9 @@ ice_prepare_for_reset(struct ice_pf *pf, enum ice_reset_req reset_type) mutex_unlock(&pf->vfs.table_lock); if (ice_is_eswitch_mode_switchdev(pf)) { - if (reset_type != ICE_RESET_PFR) - ice_clear_sw_switch_recipes(pf); + rtnl_lock(); + ice_eswitch_br_fdb_flush(pf->eswitch.br_offloads->bridge); + rtnl_unlock(); } /* release ADQ specific HW and SW resources */