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>
Subject: [PATCH for 6.13 v1 3/8] thermal: core: Build sorted lists instead of sorting them later
Date: Tue, 10 Sep 2024 11:30:13 +0200 [thread overview]
Message-ID: <3316488.44csPzL39Z@rjwysocki.net> (raw)
In-Reply-To: <4920970.GXAFRqVoOG@rjwysocki.net>
From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Large numbers of trip points are not expected to be crossed in one go,
so quite likely it is more efficient to build a sorted list of crossed
trip points than to put them on an unsorted list and sort it later.
Moreover, trip points are often provided in ascending temperature order
during thermal zone registration. so they are naturally sorted anyway
and building a sorted list out of them is quite straightforward.
Accordingly, make handle_thermal_trip() maintain list ordering when
adding trip points to the lists and get rid of separate list sorting
in __thermal_zone_device_update().
No intentional functional impact.
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
---
drivers/thermal/thermal_core.c | 33 ++++++++++++++++++---------------
1 file changed, 18 insertions(+), 15 deletions(-)
Index: linux-pm/drivers/thermal/thermal_core.c
===================================================================
--- linux-pm.orig/drivers/thermal/thermal_core.c
+++ linux-pm/drivers/thermal/thermal_core.c
@@ -15,7 +15,6 @@
#include <linux/slab.h>
#include <linux/kdev_t.h>
#include <linux/idr.h>
-#include <linux/list_sort.h>
#include <linux/thermal.h>
#include <linux/reboot.h>
#include <linux/string.h>
@@ -421,6 +420,21 @@ static void handle_critical_trips(struct
tz->ops.hot(tz);
}
+static void add_trip_to_sorted_list(struct thermal_trip_desc *td,
+ struct list_head *list)
+{
+ struct thermal_trip_desc *entry;
+
+ /* Assume that the new entry is likely to be the last one. */
+ list_for_each_entry_reverse(entry, list, notify_list_node) {
+ if (entry->notify_temp <= td->notify_temp) {
+ list_add(&td->notify_list_node, &entry->notify_list_node);
+ return;
+ }
+ }
+ list_add(&td->notify_list_node, list);
+}
+
static void handle_thermal_trip(struct thermal_zone_device *tz,
struct thermal_trip_desc *td,
struct list_head *way_up_list,
@@ -450,8 +464,8 @@ static void handle_thermal_trip(struct t
* In that case, the trip temperature becomes the new threshold.
*/
if (tz->temperature < trip->temperature - trip->hysteresis) {
- list_add(&td->notify_list_node, way_down_list);
td->notify_temp = trip->temperature - trip->hysteresis;
+ add_trip_to_sorted_list(td, way_down_list);
if (trip->type == THERMAL_TRIP_PASSIVE) {
tz->passive--;
@@ -466,8 +480,9 @@ static void handle_thermal_trip(struct t
* if the zone temperature exceeds the trip one. The new
* threshold is then set to the low temperature of the trip.
*/
- list_add_tail(&td->notify_list_node, way_up_list);
td->notify_temp = trip->temperature;
+ add_trip_to_sorted_list(td, way_up_list);
+
td->threshold -= trip->hysteresis;
if (trip->type == THERMAL_TRIP_PASSIVE)
@@ -531,16 +546,6 @@ static void thermal_trip_crossed(struct
thermal_governor_trip_crossed(governor, tz, trip, crossed_up);
}
-static int thermal_trip_notify_cmp(void *not_used, const struct list_head *a,
- const struct list_head *b)
-{
- struct thermal_trip_desc *tda = container_of(a, struct thermal_trip_desc,
- notify_list_node);
- struct thermal_trip_desc *tdb = container_of(b, struct thermal_trip_desc,
- notify_list_node);
- return tda->notify_temp - tdb->notify_temp;
-}
-
void __thermal_zone_device_update(struct thermal_zone_device *tz,
enum thermal_notify_event event)
{
@@ -591,11 +596,9 @@ void __thermal_zone_device_update(struct
thermal_zone_set_trips(tz, low, high);
- list_sort(NULL, &way_up_list, thermal_trip_notify_cmp);
list_for_each_entry(td, &way_up_list, notify_list_node)
thermal_trip_crossed(tz, &td->trip, governor, true);
- list_sort(NULL, &way_down_list, thermal_trip_notify_cmp);
list_for_each_entry_reverse(td, &way_down_list, notify_list_node)
thermal_trip_crossed(tz, &td->trip, governor, false);
next prev parent reply other threads:[~2024-09-10 9:39 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-10 9:26 [PATCH for 6.13 v1 0/8] thermal: core: Updates related to thermal instances, trip points handling and locking Rafael J. Wysocki
2024-09-10 9:27 ` [PATCH for 6.13 v1 1/8] thermal: core: Move lists of thermal instances to trip descriptors Rafael J. Wysocki
2024-09-10 9:28 ` [PATCH for 6.13 v1 2/8] thermal: core: Pass trip descriptors to trip bind/unbind functions Rafael J. Wysocki
2024-09-10 9:30 ` Rafael J. Wysocki [this message]
2024-09-10 9:31 ` [PATCH for 6.13 v1 4/8] thermal: core: Initialize thermal zones before registerimg them Rafael J. Wysocki
2024-09-10 9:32 ` [PATCH for 6.13 v1 5/8] thermal: core: Rename trip list node in struct thermal_trip_desc Rafael J. Wysocki
2024-09-10 9:33 ` [PATCH for 6.13 v1 6/8] thermal: core: Add function for moving trips to sorted lists Rafael J. Wysocki
2024-09-10 9:34 ` [PATCH for 6.13 v1 7/8] thermal: core: Use trip lists for trip crossing detection Rafael J. Wysocki
2024-09-10 9:35 ` [PATCH for 6.13 v1 8/8] thermal: core: Add and use thermal zone guard 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=3316488.44csPzL39Z@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 \
/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
all inboxes | Powered by JetHome®