On 19/04/2021 10:45, Lukasz Luba wrote:
- instance->cdev->updated = false;
+ if (update)
+ instance->cdev->updated = false;
+
mutex_unlock(&instance->cdev->lock);
- (instance->cdev);
+
+ if (update)
+ thermal_cdev_update(instance->cdev);
This cdev update has something bad IMHO. It is protected by a mutex but
the 'updated' field is left unprotected before calling
thermal_cdev_update().
It is not the fault of this code but how the cooling device are updated
and how it interacts with the thermal instances.
IMO, part of the core code needs to revisited.
This change tight a bit more the knot.
Would it make sense to you if we create a function eg.
__thermal_cdev_update()
And then we have:
void thermal_cdev_update(struct thermal_cooling_device *cdev)
{
mutex_lock(&cdev->lock);
/* cooling device is updated*/
if (cdev->updated) {
mutex_unlock(&cdev->lock);
return;
}
__thermal_cdev_update(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);
}
And in this file we do instead:
- instance->cdev->updated = false;
+ if (update)
+ __thermal_cdev_update(instance->cdev);
mutex_unlock(&instance->cdev->lock);
- thermal_cdev_update(instance->cdev);