aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>2024-04-19 13:17:15 +0200
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2024-04-19 13:17:15 +0200
commit22fdb8b99e074acb73ca6e3f4a38e7c67f522822 (patch)
tree36247dbaedff4cf1b42b4c8d6a8f78f54fe93e44
parent27715a3a4551591a29a710752823ab26ecd8deca (diff)
downloadstable-queue-22fdb8b99e074acb73ca6e3f4a38e7c67f522822.tar.gz
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
-rw-r--r--queue-6.8/r8169-add-missing-conditional-compiling-for-call-to-r8169_remove_leds.patch35
-rw-r--r--queue-6.8/r8169-fix-led-related-deadlock-on-module-removal.patch116
-rw-r--r--queue-6.8/series2
3 files changed, 153 insertions, 0 deletions
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 <hkallweit1@gmail.com>
+Date: Wed, 10 Apr 2024 15:11:28 +0200
+Subject: r8169: add missing conditional compiling for call to r8169_remove_leds
+
+From: Heiner Kallweit <hkallweit1@gmail.com>
+
+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 <venkat88@linux.vnet.ibm.com>
+Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
+Tested-By: Venkat Rao Bagalkote <venkat88@linux.vnet.ibm.com>
+Link: https://lore.kernel.org/r/d080038c-eb6b-45ac-9237-b8c1cdd7870f@gmail.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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 <hkallweit1@gmail.com>
+Date: Mon, 8 Apr 2024 20:47:40 +0200
+Subject: r8169: fix LED-related deadlock on module removal
+
+From: Heiner Kallweit <hkallweit1@gmail.com>
+
+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 <lukas@wunner.de>
+Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
+Reviewed-by: Andrew Lunn <andrew@lunn.ch>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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