Skip to content

Commit

Permalink
Merge tag 'thermal-6.11-rc5' of git://git.kernel.org/pub/scm/linux/ke…
Browse files Browse the repository at this point in the history
…rnel/git/rafael/linux-pm

Pull thermal control fixes from Rafael Wysocki:
 "These fix error handling in the thermal debug code and OF node
  reference leaks in the thermal OF driver.

  Specifics:

   - Use IS_ERR() in checks of debugfs_create_dir() return value instead
     of checking it against NULL in the thermal debug code (Yang Ruibin)

   - Fix three OF node reference leaks in thermal_of (Krzysztof
     Kozlowski)"

* tag 'thermal-6.11-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
  thermal: of: Fix OF node leak in of_thermal_zone_find() error paths
  thermal: of: Fix OF node leak in thermal_of_zone_register()
  thermal: of: Fix OF node leak in thermal_of_trips_init() error path
  thermal/debugfs: Fix the NULL vs IS_ERR() confusion in debugfs_create_dir()
  • Loading branch information
torvalds committed Aug 23, 2024
2 parents f76a30a + c0a1ef9 commit 6ae4e48
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 12 deletions.
6 changes: 3 additions & 3 deletions drivers/thermal/thermal_debugfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -178,11 +178,11 @@ struct thermal_debugfs {
void thermal_debug_init(void)
{
d_root = debugfs_create_dir("thermal", NULL);
if (!d_root)
if (IS_ERR(d_root))
return;

d_cdev = debugfs_create_dir("cooling_devices", d_root);
if (!d_cdev)
if (IS_ERR(d_cdev))
return;

d_tz = debugfs_create_dir("thermal_zones", d_root);
Expand All @@ -202,7 +202,7 @@ static struct thermal_debugfs *thermal_debugfs_add_id(struct dentry *d, int id)
snprintf(ids, IDSLENGTH, "%d", id);

thermal_dbg->d_top = debugfs_create_dir(ids, d);
if (!thermal_dbg->d_top) {
if (IS_ERR(thermal_dbg->d_top)) {
kfree(thermal_dbg);
return NULL;
}
Expand Down
23 changes: 14 additions & 9 deletions drivers/thermal/thermal_of.c
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ static int thermal_of_populate_trip(struct device_node *np,
static struct thermal_trip *thermal_of_trips_init(struct device_node *np, int *ntrips)
{
struct thermal_trip *tt;
struct device_node *trips, *trip;
struct device_node *trips;
int ret, count;

trips = of_get_child_by_name(np, "trips");
Expand All @@ -150,7 +150,7 @@ static struct thermal_trip *thermal_of_trips_init(struct device_node *np, int *n
*ntrips = count;

count = 0;
for_each_child_of_node(trips, trip) {
for_each_child_of_node_scoped(trips, trip) {
ret = thermal_of_populate_trip(trip, &tt[count++]);
if (ret)
goto out_kfree;
Expand Down Expand Up @@ -184,14 +184,14 @@ static struct device_node *of_thermal_zone_find(struct device_node *sensor, int
* Search for each thermal zone, a defined sensor
* corresponding to the one passed as parameter
*/
for_each_available_child_of_node(np, tz) {
for_each_available_child_of_node_scoped(np, child) {

int count, i;

count = of_count_phandle_with_args(tz, "thermal-sensors",
count = of_count_phandle_with_args(child, "thermal-sensors",
"#thermal-sensor-cells");
if (count <= 0) {
pr_err("%pOFn: missing thermal sensor\n", tz);
pr_err("%pOFn: missing thermal sensor\n", child);
tz = ERR_PTR(-EINVAL);
goto out;
}
Expand All @@ -200,18 +200,19 @@ static struct device_node *of_thermal_zone_find(struct device_node *sensor, int

int ret;

ret = of_parse_phandle_with_args(tz, "thermal-sensors",
ret = of_parse_phandle_with_args(child, "thermal-sensors",
"#thermal-sensor-cells",
i, &sensor_specs);
if (ret < 0) {
pr_err("%pOFn: Failed to read thermal-sensors cells: %d\n", tz, ret);
pr_err("%pOFn: Failed to read thermal-sensors cells: %d\n", child, ret);
tz = ERR_PTR(ret);
goto out;
}

if ((sensor == sensor_specs.np) && id == (sensor_specs.args_count ?
sensor_specs.args[0] : 0)) {
pr_debug("sensor %pOFn id=%d belongs to %pOFn\n", sensor, id, tz);
pr_debug("sensor %pOFn id=%d belongs to %pOFn\n", sensor, id, child);
tz = no_free_ptr(child);
goto out;
}
}
Expand Down Expand Up @@ -491,7 +492,8 @@ static struct thermal_zone_device *thermal_of_zone_register(struct device_node *
trips = thermal_of_trips_init(np, &ntrips);
if (IS_ERR(trips)) {
pr_err("Failed to find trip points for %pOFn id=%d\n", sensor, id);
return ERR_CAST(trips);
ret = PTR_ERR(trips);
goto out_of_node_put;
}

ret = thermal_of_monitor_init(np, &delay, &pdelay);
Expand Down Expand Up @@ -519,6 +521,7 @@ static struct thermal_zone_device *thermal_of_zone_register(struct device_node *
goto out_kfree_trips;
}

of_node_put(np);
kfree(trips);

ret = thermal_zone_device_enable(tz);
Expand All @@ -533,6 +536,8 @@ static struct thermal_zone_device *thermal_of_zone_register(struct device_node *

out_kfree_trips:
kfree(trips);
out_of_node_put:
of_node_put(np);

return ERR_PTR(ret);
}
Expand Down

0 comments on commit 6ae4e48

Please sign in to comment.