diff --git a/patches.suse/ice-avoid-bonding-causing-auxiliary-plug-unplug-unde.patch b/patches.suse/ice-avoid-bonding-causing-auxiliary-plug-unplug-unde.patch new file mode 100644 index 0000000..03a7e76 --- /dev/null +++ b/patches.suse/ice-avoid-bonding-causing-auxiliary-plug-unplug-unde.patch @@ -0,0 +1,95 @@ +From: Dave Ertman +Date: Fri, 10 Mar 2023 11:48:33 -0800 +Subject: ice: avoid bonding causing auxiliary plug/unplug under RTNL lock +Patch-mainline: v6.3-rc3 +Git-commit: 248401cb2c4612d83eb0c352ee8103b78b8eb365 +References: bsc#1210158 + +RDMA is not supported in ice on a PF that has been added to a bonded +interface. To enforce this, when an interface enters a bond, we unplug +the auxiliary device that supports RDMA functionality. This unplug +currently happens in the context of handling the netdev bonding event. +This event is sent to the ice driver under RTNL context. This is causing +a deadlock where the RDMA driver is waiting for the RTNL lock to complete +the removal. + +Defer the unplugging/re-plugging of the auxiliary device to the service +task so that it is not performed under the RTNL lock context. + +Cc: stable@vger.kernel.org # 6.1.x +Reported-by: Jaroslav Pulchart +Link: https://lore.kernel.org/netdev/CAK8fFZ6A_Gphw_3-QMGKEFQk=sfCw1Qmq0TVZK3rtAi7vb621A@mail.gmail.com/ +Fixes: 5cb1ebdbc434 ("ice: Fix race condition during interface enslave") +Fixes: 4eace75e0853 ("RDMA/irdma: Report the correct link speed") +Signed-off-by: Dave Ertman +Tested-by: Arpana Arland (A Contingent worker at Intel) +Signed-off-by: Tony Nguyen +Reviewed-by: Leon Romanovsky +Link: https://lore.kernel.org/r/20230310194833.3074601-1-anthony.l.nguyen@intel.com +Signed-off-by: Jakub Kicinski +Acked-by: Thomas Bogendoerfer +--- + drivers/net/ethernet/intel/ice/ice.h | 14 +++++--------- + drivers/net/ethernet/intel/ice/ice_main.c | 19 ++++++++----------- + 2 files changed, 13 insertions(+), 20 deletions(-) + +--- a/drivers/net/ethernet/intel/ice/ice.h ++++ b/drivers/net/ethernet/intel/ice/ice.h +@@ -486,6 +486,7 @@ enum ice_pf_flags { + ICE_FLAG_VF_VLAN_PRUNING, + ICE_FLAG_LINK_LENIENT_MODE_ENA, + ICE_FLAG_PLUG_AUX_DEV, ++ ICE_FLAG_UNPLUG_AUX_DEV, + ICE_FLAG_MTU_CHANGED, + ICE_FLAG_GNSS, /* GNSS successfully initialized */ + ICE_PF_FLAGS_NBITS /* must be last */ +@@ -927,16 +928,11 @@ static inline void ice_set_rdma_cap(stru + */ + static inline void ice_clear_rdma_cap(struct ice_pf *pf) + { +- /* We can directly unplug aux device here only if the flag bit +- * ICE_FLAG_PLUG_AUX_DEV is not set because ice_unplug_aux_dev() +- * could race with ice_plug_aux_dev() called from +- * ice_service_task(). In this case we only clear that bit now and +- * aux device will be unplugged later once ice_plug_aux_device() +- * called from ice_service_task() finishes (see ice_service_task()). ++ /* defer unplug to service task to avoid RTNL lock and ++ * clear PLUG bit so that pending plugs don't interfere + */ +- if (!test_and_clear_bit(ICE_FLAG_PLUG_AUX_DEV, pf->flags)) +- ice_unplug_aux_dev(pf); +- ++ clear_bit(ICE_FLAG_PLUG_AUX_DEV, pf->flags); ++ set_bit(ICE_FLAG_UNPLUG_AUX_DEV, pf->flags); + clear_bit(ICE_FLAG_RDMA_ENA, pf->flags); + } + #endif /* _ICE_H_ */ +--- a/drivers/net/ethernet/intel/ice/ice_main.c ++++ b/drivers/net/ethernet/intel/ice/ice_main.c +@@ -2300,18 +2300,15 @@ static void ice_service_task(struct work + } + } + +- if (test_bit(ICE_FLAG_PLUG_AUX_DEV, pf->flags)) { +- /* Plug aux device per request */ +- ice_plug_aux_dev(pf); ++ /* unplug aux dev per request, if an unplug request came in ++ * while processing a plug request, this will handle it ++ */ ++ if (test_and_clear_bit(ICE_FLAG_UNPLUG_AUX_DEV, pf->flags)) ++ ice_unplug_aux_dev(pf); + +- /* Mark plugging as done but check whether unplug was +- * requested during ice_plug_aux_dev() call +- * (e.g. from ice_clear_rdma_cap()) and if so then +- * plug aux device. +- */ +- if (!test_and_clear_bit(ICE_FLAG_PLUG_AUX_DEV, pf->flags)) +- ice_unplug_aux_dev(pf); +- } ++ /* Plug aux device per request */ ++ if (test_and_clear_bit(ICE_FLAG_PLUG_AUX_DEV, pf->flags)) ++ ice_plug_aux_dev(pf); + + if (test_and_clear_bit(ICE_FLAG_MTU_CHANGED, pf->flags)) { + struct iidc_event *event; diff --git a/series.conf b/series.conf index 2675d38..1ec9a48 100644 --- a/series.conf +++ b/series.conf @@ -36919,6 +36919,7 @@ patches.suse/ibmvnic-Assign-XPS-map-to-correct-queue-index.patch patches.suse/0001-net-tls-fix-possible-race-condition-between-do_tls_g.patch patches.suse/bnxt_en-Avoid-order-5-memory-allocation-for-TPA-data.patch + patches.suse/ice-avoid-bonding-causing-auxiliary-plug-unplug-unde.patch patches.suse/s390-uaccess-add-missing-earlyclobber-annotations-to-__clear_user.patch ########################################################