From: "Rafael J. Wysocki" <rafael@kernel.org>
To: Linux PM <linux-pm@vger.kernel.org>
Cc: Daniel Lezcano <daniel.lezcano@linaro.org>,
LKML <linux-kernel@vger.kernel.org>,
Lukasz Luba <lukasz.luba@arm.com>, Armin Wolf <w_armin@gmx.de>
Subject: [PATCH v1 2/2] thermal: core: Simplify unregistration of governors
Date: Wed, 22 Apr 2026 17:39:19 +0200 [thread overview]
Message-ID: <9615355.CDJkKcVGEf@rafael.j.wysocki> (raw)
In-Reply-To: <2354798.iZASKD2KPV@rafael.j.wysocki>
From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Thermal governors are only unregistered in the thermal_init() error
path and they actually are only deleted from thermal_governor_list.
Put the entire code needed to do that to thermal_unregister_governors()
and rearrange thermal_init() to call that function also when
thermal_register_governors() returns an error.
This allows thermal_unregister_governor() to be dropped
and thermal_register_governor() that is only called by
thermal_register_governors() can be made static __init, so the
headers of these two functions can be dropped from thermal_core.h.
No intentional functional impact.
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
---
drivers/thermal/thermal_core.c | 50 +++++++++++------------------------------
drivers/thermal/thermal_core.h | 2 -
2 files changed, 14 insertions(+), 38 deletions(-)
--- a/drivers/thermal/thermal_core.c
+++ b/drivers/thermal/thermal_core.c
@@ -117,14 +117,12 @@ static int thermal_set_governor(struct t
return ret;
}
-int thermal_register_governor(struct thermal_governor *governor)
+static int __init thermal_register_governor(struct thermal_governor *governor)
{
if (!governor)
return -EINVAL;
- guard(mutex)(&thermal_governor_lock);
-
if (__find_governor(governor->name))
return -EBUSY;
@@ -139,19 +137,6 @@ int thermal_register_governor(struct the
return 0;
}
-void thermal_unregister_governor(struct thermal_governor *governor)
-{
- if (!governor)
- return;
-
- guard(mutex)(&thermal_governor_lock);
-
- if (!__find_governor(governor->name))
- return;
-
- list_del(&governor->governor_list);
-}
-
int thermal_zone_device_set_policy(struct thermal_zone_device *tz,
char *policy)
{
@@ -187,40 +172,34 @@ int thermal_build_list_of_policies(char
static void __init thermal_unregister_governors(void)
{
- struct thermal_governor **governor;
+ struct thermal_governor *gov, *pos;
+
+ guard(mutex)(&thermal_governor_lock);
- for_each_governor_table(governor)
- thermal_unregister_governor(*governor);
+ list_for_each_entry_safe(gov, pos, &thermal_governor_list, governor_list)
+ list_del(&gov->governor_list);
}
static int __init thermal_register_governors(void)
{
- int ret = 0;
struct thermal_governor **governor;
+ guard(mutex)(&thermal_governor_lock);
+
for_each_governor_table(governor) {
+ int ret;
+
ret = thermal_register_governor(*governor);
if (ret) {
pr_err("Failed to register governor: '%s'",
(*governor)->name);
- break;
+ return ret;
}
- pr_info("Registered thermal governor '%s'",
- (*governor)->name);
- }
-
- if (ret) {
- struct thermal_governor **gov;
-
- for_each_governor_table(gov) {
- if (gov == governor)
- break;
- thermal_unregister_governor(*gov);
- }
+ pr_info("Registered thermal governor '%s'", (*governor)->name);
}
- return ret;
+ return 0;
}
static int __thermal_zone_device_set_mode(struct thermal_zone_device *tz,
@@ -1872,7 +1851,7 @@ static int __init thermal_init(void)
result = thermal_register_governors();
if (result)
- goto destroy_workqueue;
+ goto unregister_governors;
result = class_register(&thermal_class);
if (result)
@@ -1884,7 +1863,6 @@ static int __init thermal_init(void)
unregister_governors:
thermal_unregister_governors();
-destroy_workqueue:
destroy_workqueue(thermal_wq);
unregister_netlink:
thermal_netlink_exit();
--- a/drivers/thermal/thermal_core.h
+++ b/drivers/thermal/thermal_core.h
@@ -258,8 +258,6 @@ struct thermal_instance {
#define to_cooling_device(_dev) \
container_of(_dev, struct thermal_cooling_device, device)
-int thermal_register_governor(struct thermal_governor *);
-void thermal_unregister_governor(struct thermal_governor *);
int thermal_zone_device_set_policy(struct thermal_zone_device *, char *);
int thermal_build_list_of_policies(char *buf);
void __thermal_zone_device_update(struct thermal_zone_device *tz,
prev parent reply other threads:[~2026-04-22 15:39 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-22 15:35 [PATCH v1 0/2] thermal: core: Simplifications related to governor handling Rafael J. Wysocki
2026-04-22 15:37 ` [PATCH v1 1/2] thermal: core: Remove dead code from two functions Rafael J. Wysocki
2026-04-22 15:39 ` Rafael J. Wysocki [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=9615355.CDJkKcVGEf@rafael.j.wysocki \
--to=rafael@kernel.org \
--cc=daniel.lezcano@linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=lukasz.luba@arm.com \
--cc=w_armin@gmx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox