From: Lukasz Luba <lukasz.luba@arm.com>
To: linux-kernel@vger.kernel.org, rafael@kernel.org
Cc: linux-pm@vger.kernel.org, daniel.lezcano@linaro.org,
rui.zhang@intel.com, lukasz.luba@arm.com
Subject: [PATCH v3 1/9] thermal: core: Add governor callback for thermal zone change
Date: Wed, 20 Dec 2023 23:17:45 +0000 [thread overview]
Message-ID: <20231220231753.1824364-2-lukasz.luba@arm.com> (raw)
In-Reply-To: <20231220231753.1824364-1-lukasz.luba@arm.com>
Add a new callback to the struct thermal_governor. It can be used for
updating governors when there is a change in the thermal zone internals,
e.g. thermal cooling device is bind to the thermal zone.
That makes possible to move some heavy operations like memory allocations
related to the number of cooling instances out of the throttle() callback.
Both callback code paths (throttle() and update_tz()) are protected with
the same thermal zone lock, which guaranties the consistency.
Signed-off-by: Lukasz Luba <lukasz.luba@arm.com>
---
drivers/thermal/thermal_core.c | 14 ++++++++++++++
drivers/thermal/thermal_core.h | 2 ++
include/linux/thermal.h | 6 ++++++
3 files changed, 22 insertions(+)
diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c
index 0d761afb7cbc..62979c5401c3 100644
--- a/drivers/thermal/thermal_core.c
+++ b/drivers/thermal/thermal_core.c
@@ -311,6 +311,15 @@ static void handle_non_critical_trips(struct thermal_zone_device *tz,
def_governor->throttle(tz, trip);
}
+void thermal_governor_update_tz(struct thermal_zone_device *tz,
+ enum thermal_notify_event reason)
+{
+ if (!tz->governor || !tz->governor->update_tz)
+ return;
+
+ tz->governor->update_tz(tz, reason);
+}
+
static void thermal_zone_device_halt(struct thermal_zone_device *tz, bool shutdown)
{
/*
@@ -727,6 +736,8 @@ int thermal_bind_cdev_to_trip(struct thermal_zone_device *tz,
list_add_tail(&dev->tz_node, &tz->thermal_instances);
list_add_tail(&dev->cdev_node, &cdev->thermal_instances);
atomic_set(&tz->need_update, 1);
+
+ thermal_governor_update_tz(tz, THERMAL_TZ_BIND_CDEV);
}
mutex_unlock(&cdev->lock);
mutex_unlock(&tz->lock);
@@ -785,6 +796,9 @@ int thermal_unbind_cdev_from_trip(struct thermal_zone_device *tz,
if (pos->tz == tz && pos->trip == trip && pos->cdev == cdev) {
list_del(&pos->tz_node);
list_del(&pos->cdev_node);
+
+ thermal_governor_update_tz(tz, THERMAL_TZ_UNBIND_CDEV);
+
mutex_unlock(&cdev->lock);
mutex_unlock(&tz->lock);
goto unbind;
diff --git a/drivers/thermal/thermal_core.h b/drivers/thermal/thermal_core.h
index b5e6743bd157..e6a2b6f97be8 100644
--- a/drivers/thermal/thermal_core.h
+++ b/drivers/thermal/thermal_core.h
@@ -115,6 +115,8 @@ int thermal_build_list_of_policies(char *buf);
void __thermal_zone_device_update(struct thermal_zone_device *tz,
enum thermal_notify_event event);
void thermal_zone_device_critical_reboot(struct thermal_zone_device *tz);
+void thermal_governor_update_tz(struct thermal_zone_device *tz,
+ enum thermal_notify_event reason);
/* Helpers */
#define for_each_trip(__tz, __trip) \
diff --git a/include/linux/thermal.h b/include/linux/thermal.h
index c0fabbcdefb9..1b76878cea46 100644
--- a/include/linux/thermal.h
+++ b/include/linux/thermal.h
@@ -51,6 +51,8 @@ enum thermal_notify_event {
THERMAL_DEVICE_POWER_CAPABILITY_CHANGED, /* power capability changed */
THERMAL_TABLE_CHANGED, /* Thermal table(s) changed */
THERMAL_EVENT_KEEP_ALIVE, /* Request for user space handler to respond */
+ THERMAL_TZ_BIND_CDEV, /* Cooling dev is bind to the thermal zone */
+ THERMAL_TZ_UNBIND_CDEV, /* Cooling dev is unbind from the thermal zone */
};
/**
@@ -197,6 +199,8 @@ struct thermal_zone_device {
* thermal zone.
* @throttle: callback called for every trip point even if temperature is
* below the trip point temperature
+ * @update_tz: callback called when thermal zone internals have changed, e.g.
+ * thermal cooling instance was added/removed
* @governor_list: node in thermal_governor_list (in thermal_core.c)
*/
struct thermal_governor {
@@ -205,6 +209,8 @@ struct thermal_governor {
void (*unbind_from_tz)(struct thermal_zone_device *tz);
int (*throttle)(struct thermal_zone_device *tz,
const struct thermal_trip *trip);
+ void (*update_tz)(struct thermal_zone_device *tz,
+ enum thermal_notify_event reason);
struct list_head governor_list;
};
--
2.25.1
next prev parent reply other threads:[~2023-12-20 23:16 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-12-20 23:17 [PATCH v3 0/9] Add callback for cooling list update to speed-up IPA Lukasz Luba
2023-12-20 23:17 ` Lukasz Luba [this message]
2023-12-20 23:17 ` [PATCH v3 2/9] thermal: gov_power_allocator: Refactor check_power_actors() Lukasz Luba
2023-12-20 23:17 ` [PATCH v3 3/9] thermal: gov_power_allocator: Refactor checks in divvy_up_power() Lukasz Luba
2023-12-20 23:17 ` [PATCH v3 4/9] thermal: gov_power_allocator: Change trace functions Lukasz Luba
2023-12-20 23:17 ` [PATCH v3 5/9] thermal: gov_power_allocator: Move memory allocation out of throttle() Lukasz Luba
2023-12-20 23:17 ` [PATCH v3 6/9] thermal: gov_power_allocator: Simplify checks for valid power actor Lukasz Luba
2023-12-20 23:17 ` [PATCH v3 7/9] thermal/sysfs: Update instance->weight under tz lock Lukasz Luba
2023-12-20 23:17 ` [PATCH v3 8/9] thermal/sysfs: Update governors when the 'weight' has changed Lukasz Luba
2023-12-20 23:17 ` [PATCH v3 9/9] thermal: gov_power_allocator: Support new update callback of weights Lukasz Luba
2023-12-29 17:15 ` [PATCH v3 0/9] Add callback for cooling list update to speed-up IPA Rafael J. Wysocki
2024-01-02 9:39 ` Lukasz Luba
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=20231220231753.1824364-2-lukasz.luba@arm.com \
--to=lukasz.luba@arm.com \
--cc=daniel.lezcano@linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=rafael@kernel.org \
--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®