diff --git a/patches/kernel/0007-Revert-RDMA-irdma-Report-the-correct-link-speed.patch b/patches/kernel/0007-Revert-RDMA-irdma-Report-the-correct-link-speed.patch deleted file mode 100644 index 18a6565..0000000 --- a/patches/kernel/0007-Revert-RDMA-irdma-Report-the-correct-link-speed.patch +++ /dev/null @@ -1,72 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Thomas Lamprecht -Date: Sat, 7 Jan 2023 13:48:41 +0100 -Subject: [PATCH] Revert "RDMA/irdma: Report the correct link speed" -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -seem to cause a regression with some NICs: -https://lore.kernel.org/netdev/CAK8fFZ6A_Gphw_3-QMGKEFQk=sfCw1Qmq0TVZK3rtAi7vb621A@mail.gmail.com/ - -This reverts commit e8553504e366c8a47d1f6156c30d6eb9778cda13. - -Signed-off-by: Thomas Lamprecht -Signed-off-by: Fabian Grünbichler ---- - drivers/infiniband/hw/irdma/verbs.c | 35 ++++++++++++++++++++++++++--- - 1 file changed, 32 insertions(+), 3 deletions(-) - -diff --git a/drivers/infiniband/hw/irdma/verbs.c b/drivers/infiniband/hw/irdma/verbs.c -index f6973ea55eda..132fe91bb799 100644 ---- a/drivers/infiniband/hw/irdma/verbs.c -+++ b/drivers/infiniband/hw/irdma/verbs.c -@@ -63,6 +63,36 @@ static int irdma_query_device(struct ib_device *ibdev, - return 0; - } - -+/** -+ * irdma_get_eth_speed_and_width - Get IB port speed and width from netdev speed -+ * @link_speed: netdev phy link speed -+ * @active_speed: IB port speed -+ * @active_width: IB port width -+ */ -+static void irdma_get_eth_speed_and_width(u32 link_speed, u16 *active_speed, -+ u8 *active_width) -+{ -+ if (link_speed <= SPEED_1000) { -+ *active_width = IB_WIDTH_1X; -+ *active_speed = IB_SPEED_SDR; -+ } else if (link_speed <= SPEED_10000) { -+ *active_width = IB_WIDTH_1X; -+ *active_speed = IB_SPEED_FDR10; -+ } else if (link_speed <= SPEED_20000) { -+ *active_width = IB_WIDTH_4X; -+ *active_speed = IB_SPEED_DDR; -+ } else if (link_speed <= SPEED_25000) { -+ *active_width = IB_WIDTH_1X; -+ *active_speed = IB_SPEED_EDR; -+ } else if (link_speed <= SPEED_40000) { -+ *active_width = IB_WIDTH_4X; -+ *active_speed = IB_SPEED_FDR10; -+ } else { -+ *active_width = IB_WIDTH_4X; -+ *active_speed = IB_SPEED_EDR; -+ } -+} -+ - /** - * irdma_query_port - get port attributes - * @ibdev: device pointer from stack -@@ -90,9 +120,8 @@ static int irdma_query_port(struct ib_device *ibdev, u32 port, - props->state = IB_PORT_DOWN; - props->phys_state = IB_PORT_PHYS_STATE_DISABLED; - } -- -- ib_get_eth_speed(ibdev, port, &props->active_speed, -- &props->active_width); -+ irdma_get_eth_speed_and_width(SPEED_100000, &props->active_speed, -+ &props->active_width); - - if (rdma_protocol_roce(ibdev, 1)) { - props->gid_tbl_len = 32; diff --git a/patches/kernel/0007-ice-avoid-bonding-causing-auxiliary-plug-unplug-unde.patch b/patches/kernel/0007-ice-avoid-bonding-causing-auxiliary-plug-unplug-unde.patch new file mode 100644 index 0000000..89f71fe --- /dev/null +++ b/patches/kernel/0007-ice-avoid-bonding-causing-auxiliary-plug-unplug-unde.patch @@ -0,0 +1,98 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Dave Ertman +Date: Fri, 10 Mar 2023 11:48:33 -0800 +Subject: [PATCH] ice: avoid bonding causing auxiliary plug/unplug under RTNL + lock + +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 +Signed-off-by: Thomas Lamprecht +--- + drivers/net/ethernet/intel/ice/ice.h | 14 +++++--------- + drivers/net/ethernet/intel/ice/ice_main.c | 19 ++++++++----------- + 2 files changed, 13 insertions(+), 20 deletions(-) + +diff --git a/drivers/net/ethernet/intel/ice/ice.h b/drivers/net/ethernet/intel/ice/ice.h +index 713069f809ec..3cad5e6b2ad1 100644 +--- a/drivers/net/ethernet/intel/ice/ice.h ++++ b/drivers/net/ethernet/intel/ice/ice.h +@@ -506,6 +506,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 */ +@@ -950,16 +951,11 @@ static inline void ice_set_rdma_cap(struct ice_pf *pf) + */ + 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_ */ +diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c +index 381146282439..56155a04cc0c 100644 +--- a/drivers/net/ethernet/intel/ice/ice_main.c ++++ b/drivers/net/ethernet/intel/ice/ice_main.c +@@ -2316,18 +2316,15 @@ static void ice_service_task(struct work_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;