From: "Rafael J. Wysocki" <rjw@rjwysocki.net>
To: Linux PM <linux-pm@vger.kernel.org>
Cc: LKML <linux-kernel@vger.kernel.org>,
Daniel Lezcano <daniel.lezcano@linaro.org>,
Lukasz Luba <lukasz.luba@arm.com>,
Zhang Rui <rui.zhang@intel.com>,
Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Subject: [PATCH v2 06/12] thermal: core: Consolidate thermal zone locking during initialization
Date: Fri, 04 Oct 2024 21:23:10 +0200 [thread overview]
Message-ID: <1920382.CQOukoFCf9@rjwysocki.net> (raw)
In-Reply-To: <2215082.irdbgypaU6@rjwysocki.net>
From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
The part of thermal zone initialization carried out under
thermal_list_lock acquires the thermal zone lock and releases it
multiple times back and forth which is not really necessary.
Instead of doing this, make it acquire the thermal zone lock once after
acquiring thermal_list_lock and release it along with that lock.
For this purpose, move all of the code in question to
thermal_zone_init_complete() introduced previously and provide an
"unlocked" variant of thermal_zone_cdev_bind() to be invoked from
there.
Also notice that a thermal zone does not need to be added to
thermal_tz_list under its own lock, so make the new code acquire
the thermal zone lock after adding it to the list.
No intentional functional impact.
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
---
This is a new iteration of
https://lore.kernel.org/linux-pm/10548633.nUPlyArG6x@rjwysocki.net/
v1 -> v2: Rebase, update the changelog.
---
drivers/thermal/thermal_core.c | 39 ++++++++++++++++++++++-----------------
1 file changed, 22 insertions(+), 17 deletions(-)
Index: linux-pm/drivers/thermal/thermal_core.c
===================================================================
--- linux-pm.orig/drivers/thermal/thermal_core.c
+++ linux-pm/drivers/thermal/thermal_core.c
@@ -933,16 +933,14 @@ void print_bind_err_msg(struct thermal_z
cdev->type, thermal_zone_trip_id(tz, trip), ret);
}
-static void thermal_zone_cdev_bind(struct thermal_zone_device *tz,
- struct thermal_cooling_device *cdev)
+static void __thermal_zone_cdev_bind(struct thermal_zone_device *tz,
+ struct thermal_cooling_device *cdev)
{
struct thermal_trip_desc *td;
if (!tz->ops.should_bind)
return;
- mutex_lock(&tz->lock);
-
for_each_trip_desc(tz, td) {
struct thermal_trip *trip = &td->trip;
struct cooling_spec c = {
@@ -959,6 +957,14 @@ static void thermal_zone_cdev_bind(struc
if (ret)
print_bind_err_msg(tz, trip, cdev, ret);
}
+}
+
+static void thermal_zone_cdev_bind(struct thermal_zone_device *tz,
+ struct thermal_cooling_device *cdev)
+{
+ mutex_lock(&tz->lock);
+
+ __thermal_zone_cdev_bind(tz, cdev);
mutex_unlock(&tz->lock);
}
@@ -1336,8 +1342,18 @@ EXPORT_SYMBOL_GPL(thermal_zone_get_crit_
static void thermal_zone_init_complete(struct thermal_zone_device *tz)
{
+ struct thermal_cooling_device *cdev;
+
+ mutex_lock(&thermal_list_lock);
+
+ list_add_tail(&tz->node, &thermal_tz_list);
+
mutex_lock(&tz->lock);
+ /* Bind cooling devices for this zone. */
+ list_for_each_entry(cdev, &thermal_cdev_list, node)
+ __thermal_zone_cdev_bind(tz, cdev);
+
tz->state &= ~TZ_STATE_FLAG_INIT;
/*
* If system suspend or resume is in progress at this point, the
@@ -1350,6 +1366,8 @@ static void thermal_zone_init_complete(s
__thermal_zone_device_update(tz, THERMAL_EVENT_UNSPECIFIED);
mutex_unlock(&tz->lock);
+
+ mutex_unlock(&thermal_list_lock);
}
/**
@@ -1386,7 +1404,6 @@ thermal_zone_device_register_with_trips(
unsigned int polling_delay)
{
const struct thermal_trip *trip = trips;
- struct thermal_cooling_device *cdev;
struct thermal_zone_device *tz;
struct thermal_trip_desc *td;
int id;
@@ -1514,20 +1531,8 @@ thermal_zone_device_register_with_trips(
goto unregister;
}
- mutex_lock(&thermal_list_lock);
-
- mutex_lock(&tz->lock);
- list_add_tail(&tz->node, &thermal_tz_list);
- mutex_unlock(&tz->lock);
-
- /* Bind cooling devices for this zone */
- list_for_each_entry(cdev, &thermal_cdev_list, node)
- thermal_zone_cdev_bind(tz, cdev);
-
thermal_zone_init_complete(tz);
- mutex_unlock(&thermal_list_lock);
-
thermal_notify_tz_create(tz);
thermal_debug_tz_add(tz);
next prev parent reply other threads:[~2024-10-04 19:43 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-04 19:01 [PATCH v2 00/12] thermal: core: Fixes and cleanups, mostly related to thermal zone init and exit Rafael J. Wysocki
2024-10-04 19:05 ` [PATCH v2 01/12] thermal: core: Initialize thermal zones before registering them Rafael J. Wysocki
2024-10-21 22:16 ` Lukasz Luba
2024-10-04 19:09 ` [PATCH v2 02/12] thermal: core: Rearrange PM notification code Rafael J. Wysocki
2024-10-21 22:18 ` Lukasz Luba
2024-10-04 19:11 ` [PATCH v2 03/12] thermal: core: Represent suspend-related thermal zone flags as bits Rafael J. Wysocki
2024-10-21 22:23 ` Lukasz Luba
2024-10-04 19:15 ` [PATCH v2 04/12] thermal: core: Mark thermal zones as initializing to start with Rafael J. Wysocki
2024-10-21 22:26 ` Lukasz Luba
2024-10-04 19:19 ` [PATCH v2 05/12] thermal: core: Fix race between zone registration and system suspend Rafael J. Wysocki
2024-10-21 22:27 ` Lukasz Luba
2024-10-04 19:23 ` Rafael J. Wysocki [this message]
2024-10-21 22:30 ` [PATCH v2 06/12] thermal: core: Consolidate thermal zone locking during initialization Lukasz Luba
2024-10-04 19:26 ` [PATCH v2 07/12] thermal: core: Mark thermal zones as exiting before unregistration Rafael J. Wysocki
2024-10-21 22:31 ` Lukasz Luba
2024-10-04 19:30 ` [PATCH v2 08/12] thermal: core: Consolidate thermal zone locking in the exit path Rafael J. Wysocki
2024-10-21 22:33 ` Lukasz Luba
2024-10-04 19:33 ` [PATCH v2 09/12] thermal: core: Update thermal zones after cooling device binding Rafael J. Wysocki
2024-10-21 22:35 ` Lukasz Luba
2024-10-04 19:35 ` [PATCH v2 10/12] thermal: core: Drop need_update field from struct thermal_zone_device Rafael J. Wysocki
2024-10-21 22:36 ` Lukasz Luba
2024-10-04 19:39 ` [PATCH v2 11/12] thermal: core: Move lists of thermal instances to trip descriptors Rafael J. Wysocki
2024-10-21 22:44 ` Lukasz Luba
2024-10-04 19:42 ` [PATCH v2 12/12] thermal: core: Pass trip descriptors to trip bind/unbind functions Rafael J. Wysocki
2024-10-21 22:37 ` Lukasz Luba
2024-10-11 18:50 ` [PATCH v2 00/12] thermal: core: Fixes and cleanups, mostly related to thermal zone init and exit Rafael J. Wysocki
2024-10-21 11:05 ` Rafael J. Wysocki
2024-10-21 22:45 ` Lukasz Luba
2024-10-22 9:56 ` Rafael J. Wysocki
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=1920382.CQOukoFCf9@rjwysocki.net \
--to=rjw@rjwysocki.net \
--cc=daniel.lezcano@linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=lukasz.luba@arm.com \
--cc=rui.zhang@intel.com \
--cc=srinivas.pandruvada@linux.intel.com \
/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