FAILED: patch "[PATCH] net: dsa: microchip: Free previously initialized ports on" failed to apply to 6.6-stable tree
Subsystems (4)
[email protected]
maintainerThe patch below does not apply to the 6.6-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.6.y
git checkout FETCH_HEAD
git cherry-pick -x 0f80e21bf6229637e193248fbd284c0ec44bc0fd
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2025120249-dormitory-filtrate-415a@gregkh' --subject-prefix 'PATCH 6.6.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 0f80e21bf6229637e193248fbd284c0ec44bc0fd Mon Sep 17 00:00:00 2001
From: "Bastien Curutchet (Schneider Electric)" <[email protected]>
Date: Thu, 20 Nov 2025 10:12:03 +0100
Subject: [PATCH] net: dsa: microchip: Free previously initialized ports on
init failures
If a port interrupt setup fails after at least one port has already been successfully initialized, the gotos miss some resource releasing:
- the already initialized PTP IRQs aren't released
- the already initialized port IRQs aren't released if the failure occurs in ksz_pirq_setup().
Merge 'out_girq' and 'out_ptpirq' into a single 'port_release' label. Behind this label, use the reverse loop to release all IRQ resources for all initialized ports.
Jump in the middle of the reverse loop if an error occurs in ksz_ptp_irq_setup() to only release the port IRQ of the current iteration.
drivers/net/dsa/microchip/ksz_common.c +11 -12
@@ -3038,12 +3038,12 @@ static int ksz_setup(struct dsa_switch *ds)dsa_switch_for_each_user_port (dp, dev->ds) { ret =ksz_pirq_setup (dev, dp->index);if (ret) - goto out_girq; + goto port_release;if (dev->info->ptp_capable) { ret =ksz_ptp_irq_setup (ds, dp->index);if (ret) - goto out_pirq; + goto pirq_release; } } }
@@ -3053,7 +3053,7 @@ static int ksz_setup(struct dsa_switch *ds)if (ret) {dev_err (dev->dev,"Failed to register PTP clock: %d\n" , ret); - goto out_ptpirq; + goto port_release; } }
@@ -3076,17 +3076,16 @@ static int ksz_setup(struct dsa_switch *ds) out_ptp_clock_unregister:if (dev->info->ptp_capable)ksz_ptp_clock_unregister (ds); -out_ptpirq: -if (dev->irq >0 && dev->info->ptp_capable) -dsa_switch_for_each_user_port (dp, dev->ds) -ksz_ptp_irq_free (ds, dp->index); -out_pirq: -if (dev->irq >0 ) -dsa_switch_for_each_user_port_continue_reverse (dp, dev->ds) +port_release: +if (dev->irq >0 ) { +dsa_switch_for_each_user_port_continue_reverse (dp, dev->ds) { +if (dev->info->ptp_capable) +ksz_ptp_irq_free (ds, dp->index); +pirq_release:ksz_irq_free (&dev->ports[dp->index].pirq); -out_girq: -if (dev->irq >0 ) + }ksz_irq_free (&dev->girq); + }return ret; }
Sasha Levin
maintainerPATCH 1/1 net: dsa: microchip: Free previously initialized ports on init failures
From: "Bastien Curutchet (Schneider Electric)" <[email protected]>
[ Upstream commit 0f80e21bf6229637e193248fbd284c0ec44bc0fd ]
If a port interrupt setup fails after at least one port has already been successfully initialized, the gotos miss some resource releasing:
- the already initialized PTP IRQs aren't released
- the already initialized port IRQs aren't released if the failure occurs in ksz_pirq_setup().
Merge 'out_girq' and 'out_ptpirq' into a single 'port_release' label. Behind this label, use the reverse loop to release all IRQ resources for all initialized ports.
Jump in the middle of the reverse loop if an error occurs in ksz_ptp_irq_setup() to only release the port IRQ of the current iteration.
--- drivers/net/dsa/microchip/ksz_common.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-)
drivers/net/dsa/microchip/ksz_common.c +11 -11
@@ -2163,18 +2163,18 @@ static int ksz_setup(struct dsa_switch *ds)dsa_switch_for_each_user_port (dp, dev->ds) { ret =ksz_pirq_setup (dev, dp->index);if (ret) - goto out_girq; + goto port_release; ret =ksz_ptp_irq_setup (ds, dp->index);if (ret) - goto out_pirq; + goto pirq_release; } } ret =ksz_ptp_clock_register (ds);if (ret) {dev_err (dev->dev,"Failed to register PTP clock: %d\n" , ret); - goto out_ptpirq; + goto port_release; } ret =ksz_mdio_register (dev);
@@ -2191,17 +2191,17 @@ static int ksz_setup(struct dsa_switch *ds) out_ptp_clock_unregister:ksz_ptp_clock_unregister (ds); -out_ptpirq: -if (dev->irq >0 ) -dsa_switch_for_each_user_port (dp, dev->ds) +port_release: +if (dev->irq >0 ) { +dsa_switch_for_each_port_continue_reverse (dp, dev->ds) { +if (!dsa_port_is_user (dp)) +continue ;ksz_ptp_irq_free (ds, dp->index); -out_pirq: -if (dev->irq >0 ) -dsa_switch_for_each_user_port (dp, dev->ds) +pirq_release:ksz_irq_free (&dev->ports[dp->index].pirq); -out_girq: -if (dev->irq >0 ) + }ksz_irq_free (&dev->girq); + }return ret; }
Signature · 1 line
2.51.0