mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-24 17:23:25 -05:00
thermal/core: Create a helper __thermal_cdev_update() without a lock
There is a need to have a helper function which updates cooling device state from the governors code. With this change governor can use lock and unlock while calling helper function. This avoid unnecessary second time lock/unlock which was in previous solution present in governor implementation. This new helper function must be called with mutex 'cdev->lock' hold. The changed been discussed and part of code presented in thread: https://lore.kernel.org/linux-pm/20210419084536.25000-1-lukasz.luba@arm.com/ Co-developed-by: Daniel Lezcano <daniel.lezcano@linaro.org> Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org> Signed-off-by: Lukasz Luba <lukasz.luba@arm.com> Link: https://lore.kernel.org/r/20210422114308.29684-2-lukasz.luba@arm.com
This commit is contained in:
parent
26b2f03d2a
commit
b70dbf40eb
2 changed files with 18 additions and 10 deletions
|
@ -66,6 +66,7 @@ static inline bool cdev_is_power_actor(struct thermal_cooling_device *cdev)
|
||||||
}
|
}
|
||||||
|
|
||||||
void thermal_cdev_update(struct thermal_cooling_device *);
|
void thermal_cdev_update(struct thermal_cooling_device *);
|
||||||
|
void __thermal_cdev_update(struct thermal_cooling_device *cdev);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct thermal_trip - representation of a point in temperature domain
|
* struct thermal_trip - representation of a point in temperature domain
|
||||||
|
|
|
@ -192,18 +192,11 @@ static void thermal_cdev_set_cur_state(struct thermal_cooling_device *cdev,
|
||||||
thermal_cooling_device_stats_update(cdev, target);
|
thermal_cooling_device_stats_update(cdev, target);
|
||||||
}
|
}
|
||||||
|
|
||||||
void thermal_cdev_update(struct thermal_cooling_device *cdev)
|
void __thermal_cdev_update(struct thermal_cooling_device *cdev)
|
||||||
{
|
{
|
||||||
struct thermal_instance *instance;
|
struct thermal_instance *instance;
|
||||||
unsigned long target = 0;
|
unsigned long target = 0;
|
||||||
|
|
||||||
mutex_lock(&cdev->lock);
|
|
||||||
/* cooling device is updated*/
|
|
||||||
if (cdev->updated) {
|
|
||||||
mutex_unlock(&cdev->lock);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Make sure cdev enters the deepest cooling state */
|
/* Make sure cdev enters the deepest cooling state */
|
||||||
list_for_each_entry(instance, &cdev->thermal_instances, cdev_node) {
|
list_for_each_entry(instance, &cdev->thermal_instances, cdev_node) {
|
||||||
dev_dbg(&cdev->device, "zone%d->target=%lu\n",
|
dev_dbg(&cdev->device, "zone%d->target=%lu\n",
|
||||||
|
@ -216,11 +209,25 @@ void thermal_cdev_update(struct thermal_cooling_device *cdev)
|
||||||
|
|
||||||
thermal_cdev_set_cur_state(cdev, target);
|
thermal_cdev_set_cur_state(cdev, target);
|
||||||
|
|
||||||
cdev->updated = true;
|
|
||||||
mutex_unlock(&cdev->lock);
|
|
||||||
trace_cdev_update(cdev, target);
|
trace_cdev_update(cdev, target);
|
||||||
dev_dbg(&cdev->device, "set to state %lu\n", target);
|
dev_dbg(&cdev->device, "set to state %lu\n", target);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* thermal_cdev_update - update cooling device state if needed
|
||||||
|
* @cdev: pointer to struct thermal_cooling_device
|
||||||
|
*
|
||||||
|
* Update the cooling device state if there is a need.
|
||||||
|
*/
|
||||||
|
void thermal_cdev_update(struct thermal_cooling_device *cdev)
|
||||||
|
{
|
||||||
|
mutex_lock(&cdev->lock);
|
||||||
|
if (!cdev->updated) {
|
||||||
|
__thermal_cdev_update(cdev);
|
||||||
|
cdev->updated = true;
|
||||||
|
}
|
||||||
|
mutex_unlock(&cdev->lock);
|
||||||
|
}
|
||||||
EXPORT_SYMBOL(thermal_cdev_update);
|
EXPORT_SYMBOL(thermal_cdev_update);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Add table
Reference in a new issue