Message ID | 3618899.iIbC2pHGDl@rjwysocki.net (mailing list archive) |
---|---|
State | Mainlined, archived |
Headers | show |
Series | thermal: core: Reimplement locking through guards | expand |
On 10/10/24 23:13, Rafael J. Wysocki wrote: > From: Rafael J. Wysocki <rafael.j.wysocki@intel.com> > > To reduce the number of redundant result checks in > thermal_bind_cdev_to_trip() and make the code in it easier to > follow, move some of it to a new function called thermal_instance_add() > and make thermal_bind_cdev_to_trip() invoke that function. > > No intentional functional impact. > > Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> > --- > > This is a resend of > > https://lore.kernel.org/linux-pm/2641944.Lt9SDvczpP@rjwysocki.net/ > > --- > drivers/thermal/thermal_core.c | 46 ++++++++++++++++++++++++++--------------- > 1 file changed, 30 insertions(+), 16 deletions(-) > > Index: linux-pm/drivers/thermal/thermal_core.c > =================================================================== > --- linux-pm.orig/drivers/thermal/thermal_core.c > +++ linux-pm/drivers/thermal/thermal_core.c > @@ -743,6 +743,28 @@ struct thermal_zone_device *thermal_zone > * binding, and unbinding. > */ > > +static int thermal_instance_add(struct thermal_instance *new_instance, > + struct thermal_cooling_device *cdev, > + struct thermal_trip_desc *td) > +{ > + struct thermal_instance *instance; > + > + list_for_each_entry(instance, &td->thermal_instances, trip_node) { > + if (instance->cdev == cdev) > + return -EEXIST; > + } > + > + list_add_tail(&new_instance->trip_node, &td->thermal_instances); > + > + mutex_lock(&cdev->lock); > + > + list_add_tail(&new_instance->cdev_node, &cdev->thermal_instances); > + > + mutex_unlock(&cdev->lock); > + > + return 0; > +} > + > /** > * thermal_bind_cdev_to_trip - bind a cooling device to a thermal zone > * @tz: pointer to struct thermal_zone_device > @@ -761,7 +783,7 @@ static int thermal_bind_cdev_to_trip(str > struct thermal_cooling_device *cdev, > struct cooling_spec *cool_spec) > { > - struct thermal_instance *dev, *instance; > + struct thermal_instance *dev; > bool upper_no_limit; > int result; > > @@ -823,23 +845,15 @@ static int thermal_bind_cdev_to_trip(str > if (result) > goto remove_trip_file; > > - mutex_lock(&cdev->lock); > - list_for_each_entry(instance, &td->thermal_instances, trip_node) > - if (instance->cdev == cdev) { > - result = -EEXIST; > - break; > - } > - if (!result) { > - list_add_tail(&dev->trip_node, &td->thermal_instances); > - list_add_tail(&dev->cdev_node, &cdev->thermal_instances); > - } > - mutex_unlock(&cdev->lock); > + result = thermal_instance_add(dev, cdev, td); > + if (result) > + goto remove_weight_file; > > - if (!result) { > - thermal_governor_update_tz(tz, THERMAL_TZ_BIND_CDEV); > - return 0; > - } > + thermal_governor_update_tz(tz, THERMAL_TZ_BIND_CDEV); > + > + return 0; > > +remove_weight_file: > device_remove_file(&tz->device, &dev->weight_attr); > remove_trip_file: > device_remove_file(&tz->device, &dev->attr); > > > Reviewed-by: Lukasz Luba <lukasz.luba@arm.com>
Index: linux-pm/drivers/thermal/thermal_core.c =================================================================== --- linux-pm.orig/drivers/thermal/thermal_core.c +++ linux-pm/drivers/thermal/thermal_core.c @@ -743,6 +743,28 @@ struct thermal_zone_device *thermal_zone * binding, and unbinding. */ +static int thermal_instance_add(struct thermal_instance *new_instance, + struct thermal_cooling_device *cdev, + struct thermal_trip_desc *td) +{ + struct thermal_instance *instance; + + list_for_each_entry(instance, &td->thermal_instances, trip_node) { + if (instance->cdev == cdev) + return -EEXIST; + } + + list_add_tail(&new_instance->trip_node, &td->thermal_instances); + + mutex_lock(&cdev->lock); + + list_add_tail(&new_instance->cdev_node, &cdev->thermal_instances); + + mutex_unlock(&cdev->lock); + + return 0; +} + /** * thermal_bind_cdev_to_trip - bind a cooling device to a thermal zone * @tz: pointer to struct thermal_zone_device @@ -761,7 +783,7 @@ static int thermal_bind_cdev_to_trip(str struct thermal_cooling_device *cdev, struct cooling_spec *cool_spec) { - struct thermal_instance *dev, *instance; + struct thermal_instance *dev; bool upper_no_limit; int result; @@ -823,23 +845,15 @@ static int thermal_bind_cdev_to_trip(str if (result) goto remove_trip_file; - mutex_lock(&cdev->lock); - list_for_each_entry(instance, &td->thermal_instances, trip_node) - if (instance->cdev == cdev) { - result = -EEXIST; - break; - } - if (!result) { - list_add_tail(&dev->trip_node, &td->thermal_instances); - list_add_tail(&dev->cdev_node, &cdev->thermal_instances); - } - mutex_unlock(&cdev->lock); + result = thermal_instance_add(dev, cdev, td); + if (result) + goto remove_weight_file; - if (!result) { - thermal_governor_update_tz(tz, THERMAL_TZ_BIND_CDEV); - return 0; - } + thermal_governor_update_tz(tz, THERMAL_TZ_BIND_CDEV); + + return 0; +remove_weight_file: device_remove_file(&tz->device, &dev->weight_attr); remove_trip_file: device_remove_file(&tz->device, &dev->attr);