mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-28 14:44:10 +08: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
@ -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 *cdev);
|
||||
|
||||
/**
|
||||
* 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);
|
||||
}
|
||||
|
||||
void thermal_cdev_update(struct thermal_cooling_device *cdev)
|
||||
void __thermal_cdev_update(struct thermal_cooling_device *cdev)
|
||||
{
|
||||
struct thermal_instance *instance;
|
||||
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 */
|
||||
list_for_each_entry(instance, &cdev->thermal_instances, cdev_node) {
|
||||
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);
|
||||
|
||||
cdev->updated = true;
|
||||
mutex_unlock(&cdev->lock);
|
||||
trace_cdev_update(cdev, 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);
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user