From 22fdb8b99e074acb73ca6e3f4a38e7c67f522822 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Fri, 19 Apr 2024 13:17:15 +0200 Subject: 6.8-stable patches added patches: r8169-add-missing-conditional-compiling-for-call-to-r8169_remove_leds.patch r8169-fix-led-related-deadlock-on-module-removal.patch --- ...l-compiling-for-call-to-r8169_remove_leds.patch | 35 +++++++ ...ix-led-related-deadlock-on-module-removal.patch | 116 +++++++++++++++++++++ queue-6.8/series | 2 + 3 files changed, 153 insertions(+) create mode 100644 queue-6.8/r8169-add-missing-conditional-compiling-for-call-to-r8169_remove_leds.patch create mode 100644 queue-6.8/r8169-fix-led-related-deadlock-on-module-removal.patch diff --git a/queue-6.8/r8169-add-missing-conditional-compiling-for-call-to-r8169_remove_leds.patch b/queue-6.8/r8169-add-missing-conditional-compiling-for-call-to-r8169_remove_leds.patch new file mode 100644 index 0000000000..110a8b647a --- /dev/null +++ b/queue-6.8/r8169-add-missing-conditional-compiling-for-call-to-r8169_remove_leds.patch @@ -0,0 +1,35 @@ +From 97e176fcbbf3c0f2bd410c9b241177c051f57176 Mon Sep 17 00:00:00 2001 +From: Heiner Kallweit +Date: Wed, 10 Apr 2024 15:11:28 +0200 +Subject: r8169: add missing conditional compiling for call to r8169_remove_leds + +From: Heiner Kallweit + +commit 97e176fcbbf3c0f2bd410c9b241177c051f57176 upstream. + +Add missing dependency on CONFIG_R8169_LEDS. As-is a link error occurs +if config option CONFIG_R8169_LEDS isn't enabled. + +Fixes: 19fa4f2a85d7 ("r8169: fix LED-related deadlock on module removal") +Reported-by: Venkat Rao Bagalkote +Signed-off-by: Heiner Kallweit +Tested-By: Venkat Rao Bagalkote +Link: https://lore.kernel.org/r/d080038c-eb6b-45ac-9237-b8c1cdd7870f@gmail.com +Signed-off-by: Jakub Kicinski +Signed-off-by: Greg Kroah-Hartman +--- + drivers/net/ethernet/realtek/r8169_main.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +--- a/drivers/net/ethernet/realtek/r8169_main.c ++++ b/drivers/net/ethernet/realtek/r8169_main.c +@@ -4932,7 +4932,8 @@ static void rtl_remove_one(struct pci_de + + cancel_work_sync(&tp->wk.work); + +- r8169_remove_leds(tp->leds); ++ if (IS_ENABLED(CONFIG_R8169_LEDS)) ++ r8169_remove_leds(tp->leds); + + unregister_netdev(tp->dev); + diff --git a/queue-6.8/r8169-fix-led-related-deadlock-on-module-removal.patch b/queue-6.8/r8169-fix-led-related-deadlock-on-module-removal.patch new file mode 100644 index 0000000000..490194b0d8 --- /dev/null +++ b/queue-6.8/r8169-fix-led-related-deadlock-on-module-removal.patch @@ -0,0 +1,116 @@ +From 19fa4f2a85d777a8052e869c1b892a2f7556569d Mon Sep 17 00:00:00 2001 +From: Heiner Kallweit +Date: Mon, 8 Apr 2024 20:47:40 +0200 +Subject: r8169: fix LED-related deadlock on module removal + +From: Heiner Kallweit + +commit 19fa4f2a85d777a8052e869c1b892a2f7556569d upstream. + +Binding devm_led_classdev_register() to the netdev is problematic +because on module removal we get a RTNL-related deadlock. Fix this +by avoiding the device-managed LED functions. + +Note: We can safely call led_classdev_unregister() for a LED even +if registering it failed, because led_classdev_unregister() detects +this and is a no-op in this case. + +Fixes: 18764b883e15 ("r8169: add support for LED's on RTL8168/RTL8101") +Cc: stable@vger.kernel.org +Reported-by: Lukas Wunner +Signed-off-by: Heiner Kallweit +Reviewed-by: Andrew Lunn +Signed-off-by: David S. Miller +Signed-off-by: Greg Kroah-Hartman +--- + drivers/net/ethernet/realtek/r8169.h | 4 +++- + drivers/net/ethernet/realtek/r8169_leds.c | 23 +++++++++++++++++------ + drivers/net/ethernet/realtek/r8169_main.c | 6 +++++- + 3 files changed, 25 insertions(+), 8 deletions(-) + +--- a/drivers/net/ethernet/realtek/r8169.h ++++ b/drivers/net/ethernet/realtek/r8169.h +@@ -72,6 +72,7 @@ enum mac_version { + }; + + struct rtl8169_private; ++struct r8169_led_classdev; + + void r8169_apply_firmware(struct rtl8169_private *tp); + u16 rtl8168h_2_get_adc_bias_ioffset(struct rtl8169_private *tp); +@@ -83,4 +84,5 @@ void r8169_get_led_name(struct rtl8169_p + char *buf, int buf_len); + int rtl8168_get_led_mode(struct rtl8169_private *tp); + int rtl8168_led_mod_ctrl(struct rtl8169_private *tp, u16 mask, u16 val); +-void rtl8168_init_leds(struct net_device *ndev); ++struct r8169_led_classdev *rtl8168_init_leds(struct net_device *ndev); ++void r8169_remove_leds(struct r8169_led_classdev *leds); +--- a/drivers/net/ethernet/realtek/r8169_leds.c ++++ b/drivers/net/ethernet/realtek/r8169_leds.c +@@ -138,20 +138,31 @@ static void rtl8168_setup_ldev(struct r8 + led_cdev->hw_control_get_device = r8169_led_hw_control_get_device; + + /* ignore errors */ +- devm_led_classdev_register(&ndev->dev, led_cdev); ++ led_classdev_register(&ndev->dev, led_cdev); + } + +-void rtl8168_init_leds(struct net_device *ndev) ++struct r8169_led_classdev *rtl8168_init_leds(struct net_device *ndev) + { +- /* bind resource mgmt to netdev */ +- struct device *dev = &ndev->dev; + struct r8169_led_classdev *leds; + int i; + +- leds = devm_kcalloc(dev, RTL8168_NUM_LEDS, sizeof(*leds), GFP_KERNEL); ++ leds = kcalloc(RTL8168_NUM_LEDS + 1, sizeof(*leds), GFP_KERNEL); + if (!leds) +- return; ++ return NULL; + + for (i = 0; i < RTL8168_NUM_LEDS; i++) + rtl8168_setup_ldev(leds + i, ndev, i); ++ ++ return leds; ++} ++ ++void r8169_remove_leds(struct r8169_led_classdev *leds) ++{ ++ if (!leds) ++ return; ++ ++ for (struct r8169_led_classdev *l = leds; l->ndev; l++) ++ led_classdev_unregister(&l->led); ++ ++ kfree(leds); + } +--- a/drivers/net/ethernet/realtek/r8169_main.c ++++ b/drivers/net/ethernet/realtek/r8169_main.c +@@ -634,6 +634,8 @@ struct rtl8169_private { + const char *fw_name; + struct rtl_fw *rtl_fw; + ++ struct r8169_led_classdev *leds; ++ + u32 ocp_base; + }; + +@@ -4930,6 +4932,8 @@ static void rtl_remove_one(struct pci_de + + cancel_work_sync(&tp->wk.work); + ++ r8169_remove_leds(tp->leds); ++ + unregister_netdev(tp->dev); + + if (tp->dash_type != RTL_DASH_NONE) +@@ -5391,7 +5395,7 @@ static int rtl_init_one(struct pci_dev * + if (IS_ENABLED(CONFIG_R8169_LEDS) && + tp->mac_version > RTL_GIGA_MAC_VER_06 && + tp->mac_version < RTL_GIGA_MAC_VER_61) +- rtl8168_init_leds(dev); ++ tp->leds = rtl8168_init_leds(dev); + + netdev_info(dev, "%s, %pM, XID %03x, IRQ %d\n", + rtl_chip_infos[chipset].name, dev->dev_addr, xid, tp->irq); diff --git a/queue-6.8/series b/queue-6.8/series index 0f30baf340..6ba7c4dbf5 100644 --- a/queue-6.8/series +++ b/queue-6.8/series @@ -8,3 +8,5 @@ scsi-core-fix-handling-of-scmd_fail_if_recovering.patch net-usb-ax88179_178a-avoid-writing-the-mac-address-before-first-reading.patch btrfs-do-not-wait-for-short-bulk-allocation.patch btrfs-zoned-do-not-flag-zeroout-on-non-dirty-extent-buffer.patch +r8169-fix-led-related-deadlock-on-module-removal.patch +r8169-add-missing-conditional-compiling-for-call-to-r8169_remove_leds.patch -- cgit 1.2.3-korg