FAILED: patch "[PATCH] thermal: core: Fix thermal zone governor cleanup issues" failed to apply to 6.6-stable tree
Subsystems (2)
[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 41ff66baf81c6541f4f985dd7eac4494d03d9440
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026043038-thyself-gummy-4e85@gregkh' --subject-prefix 'PATCH 6.6.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 41ff66baf81c6541f4f985dd7eac4494d03d9440 Mon Sep 17 00:00:00 2001
From: "Rafael J. Wysocki" <[email protected]>
Date: Tue, 7 Apr 2026 15:55:19 +0200
Subject: [PATCH] thermal: core: Fix thermal zone governor cleanup issues
If thermal_zone_device_register_with_trips() fails after adding a thermal governor to the thermal zone being registered, the governor is not removed from it as appropriate which may lead to a memory leak.
In turn, thermal_zone_device_unregister() calls thermal_set_governor() without acquiring the thermal zone lock beforehand which may race with a governor update via sysfs and may lead to a use-after-free in that case.
Address these issues by adding two thermal_set_governor() calls, one to thermal_release() to remove the governor from the given thermal zone, and one to the thermal zone registration error path to cover failures preceding the thermal zone device registration.
drivers/thermal/thermal_core.c +4 -3
@@ -964,6 +964,7 @@ static void thermal_release(struct device *dev) sizeof("thermal_zone") - 1)) { tz =to_thermal_zone (dev);thermal_zone_destroy_device_groups (tz); +thermal_set_governor (tz,NULL );mutex_destroy (&tz->lock);complete (&tz->removal); } else if (!strncmp(dev_name(dev), "cooling_device",
@@ -1610,8 +1611,10 @@ thermal_zone_device_register_with_trips(const char *type,/* sys I/F */ /* Add nodes that are always present via .groups */ result =thermal_zone_create_device_groups (tz); -if (result) +if (result) { +thermal_set_governor (tz,NULL ); goto remove_id; + } result =device_register (&tz->device);if (result)
@@ -1724,8 +1727,6 @@ void thermal_zone_device_unregister(struct thermal_zone_device *tz)cancel_delayed_work_sync (&tz->poll_queue); -thermal_set_governor (tz,NULL ); -thermal_thresholds_exit (tz);thermal_remove_hwmon_sysfs (tz);ida_free (&thermal_tz_ida, tz->id);
Sasha Levin
maintainerPATCH 1/1 thermal: core: Fix thermal zone governor cleanup issues
From: "Rafael J. Wysocki" <[email protected]>
[ Upstream commit 41ff66baf81c6541f4f985dd7eac4494d03d9440 ]
If thermal_zone_device_register_with_trips() fails after adding a thermal governor to the thermal zone being registered, the governor is not removed from it as appropriate which may lead to a memory leak.
In turn, thermal_zone_device_unregister() calls thermal_set_governor() without acquiring the thermal zone lock beforehand which may race with a governor update via sysfs and may lead to a use-after-free in that case.
Address these issues by adding two thermal_set_governor() calls, one to thermal_release() to remove the governor from the given thermal zone, and one to the thermal zone registration error path to cover failures preceding the thermal zone device registration.
--- drivers/thermal/thermal_core.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/thermal/thermal_core.c +4 -3
@@ -804,6 +804,7 @@ static void thermal_release(struct device *dev) sizeof("thermal_zone") - 1)) { tz =to_thermal_zone (dev);thermal_zone_destroy_device_groups (tz); +thermal_set_governor (tz,NULL );mutex_destroy (&tz->lock);complete (&tz->removal); } else if (!strncmp(dev_name(dev), "cooling_device",
@@ -1325,8 +1326,10 @@ thermal_zone_device_register_with_trips(const char *type, struct thermal_trip *t/* sys I/F */ /* Add nodes that are always present via .groups */ result =thermal_zone_create_device_groups (tz, mask); -if (result) +if (result) { +thermal_set_governor (tz,NULL ); goto remove_id; + }/* A new thermal zone needs to be updated anyway. */ atomic_set (&tz->need_update,1 );
@@ -1478,8 +1481,6 @@ void thermal_zone_device_unregister(struct thermal_zone_device *tz)cancel_delayed_work_sync (&tz->poll_queue); -thermal_set_governor (tz,NULL ); -thermal_remove_hwmon_sysfs (tz);ida_free (&thermal_tz_ida, tz->id);ida_destroy (&tz->ida);
Signature · 1 line
2.53.0