FAILED: patch "[PATCH] thermal/drivers/broadcom: Fix race between removal and clock" 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 e90c369cc2ffcf7145a46448de101f715a1f5584
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2024072901-rare-engaging-abb3@gregkh' --subject-prefix 'PATCH 6.6.y' HEAD^..
Possible dependencies:
e90c369cc2ff ("thermal/drivers/broadcom: Fix race between removal and clock disable") f29ecd3748a2 ("thermal: bcm2835: Convert to platform remove callback returning void")
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From e90c369cc2ffcf7145a46448de101f715a1f5584 Mon Sep 17 00:00:00 2001
From: Krzysztof Kozlowski <[email protected]>
Date: Tue, 9 Jul 2024 14:59:31 +0200
Subject: [PATCH] thermal/drivers/broadcom: Fix race between removal and clock
disable
During the probe, driver enables clocks necessary to access registers (in get_temp()) and then registers thermal zone with managed-resources (devm) interface. Removal of device is not done in reversed order, because:
1. Clock will be disabled in driver remove() callback - thermal zone is still registered and accessible to users,
2. devm interface will unregister thermal zone.
This leaves short window between (1) and (2) for accessing the get_temp() callback with disabled clock.
Fix this by enabling clock also via devm-interface, so entire cleanup path will be in proper, reversed order.
drivers/thermal/broadcom/bcm2835_thermal.c +4 -15
@@ -185,7 +185,7 @@ static int bcm2835_thermal_probe(struct platform_device *pdev)return err; } - data->clk =devm_clk_get (&pdev->dev,NULL ); + data->clk =devm_clk_get_enabled (&pdev->dev,NULL );if (IS_ERR (data->clk)) { err =PTR_ERR (data->clk);if (err != -EPROBE_DEFER )
@@ -193,10 +193,6 @@ static int bcm2835_thermal_probe(struct platform_device *pdev)return err; } - err =clk_prepare_enable (data->clk); -if (err) -return err; - rate =clk_get_rate (data->clk);if ((rate <1920000 ) || (rate >5000000 )) dev_warn(&pdev->dev,
@@ -211,7 +207,7 @@ static int bcm2835_thermal_probe(struct platform_device *pdev)dev_err (&pdev->dev,"Failed to register the thermal device: %d\n" , err); - goto err_clk; +return err; }/*
@@ -236,7 +232,7 @@ static int bcm2835_thermal_probe(struct platform_device *pdev)dev_err (&pdev->dev,"Not able to read trip_temp: %d\n" , err); - goto err_tz; +return err; }/* set bandgap reference voltage and enable voltage regulator */
@@ -269,17 +265,11 @@ static int bcm2835_thermal_probe(struct platform_device *pdev)*/ err =thermal_add_hwmon_sysfs (tz);if (err) - goto err_tz; +return err;bcm2835_thermal_debugfs (pdev);return 0 ; -err_tz: -devm_thermal_of_zone_unregister (&pdev->dev, tz); -err_clk: -clk_disable_unprepare (data->clk); - -return err; }static void bcm2835_thermal_remove (struct platform_device *pdev)
@@ -287,7 +277,6 @@ static void bcm2835_thermal_remove(struct platform_device *pdev)struct bcm2835_thermal_data *data =platform_get_drvdata (pdev);debugfs_remove_recursive (data->debugfsdir); -clk_disable_unprepare (data->clk); }static struct platform_driver bcm2835_thermal_driver = {