Skip to content

Commit

Permalink
thermal: fix multiple disbalanced device node counters
Browse files Browse the repository at this point in the history
Here on function return all temporarily used device nodes shall
decrement their usage counter. The problems are found with device
nodes allocated by for_each_child_of_node(), of_parse_phandle()
and of_find_node_by_name(), fix all problems at once.

Signed-off-by: Vladimir Zapolskiy <[email protected]>
Cc: [email protected]
Cc: Zhang Rui <[email protected]>
Cc: Eduardo Valentin <[email protected]>
Signed-off-by: Eduardo Valentin <[email protected]>
  • Loading branch information
vzapolskiy authored and Eduardo Valentin committed Nov 3, 2014
1 parent 689bd24 commit c2aad93
Showing 1 changed file with 32 additions and 8 deletions.
40 changes: 32 additions & 8 deletions drivers/thermal/of-thermal.c
Original file line number Diff line number Diff line change
Expand Up @@ -387,15 +387,18 @@ thermal_zone_of_sensor_register(struct device *dev, int sensor_id,
int (*get_trend)(void *, long *))
{
struct device_node *np, *child, *sensor_np;
struct thermal_zone_device *tzd = ERR_PTR(-ENODEV);

np = of_find_node_by_name(NULL, "thermal-zones");
if (!np)
return ERR_PTR(-ENODEV);

if (!dev || !dev->of_node)
if (!dev || !dev->of_node) {
of_node_put(np);
return ERR_PTR(-EINVAL);
}

sensor_np = dev->of_node;
sensor_np = of_node_get(dev->of_node);

for_each_child_of_node(np, child) {
struct of_phandle_args sensor_specs;
Expand All @@ -422,16 +425,21 @@ thermal_zone_of_sensor_register(struct device *dev, int sensor_id,
}

if (sensor_specs.np == sensor_np && id == sensor_id) {
of_node_put(np);
return thermal_zone_of_add_sensor(child, sensor_np,
data,
get_temp,
get_trend);
tzd = thermal_zone_of_add_sensor(child, sensor_np,
data,
get_temp,
get_trend);
of_node_put(sensor_specs.np);
of_node_put(child);
goto exit;
}
of_node_put(sensor_specs.np);
}
exit:
of_node_put(sensor_np);
of_node_put(np);

return ERR_PTR(-ENODEV);
return tzd;
}
EXPORT_SYMBOL_GPL(thermal_zone_of_sensor_register);

Expand Down Expand Up @@ -623,6 +631,7 @@ static int thermal_of_populate_trip(struct device_node *np,

/* Required for cooling map matching */
trip->np = np;
of_node_get(np);

return 0;
}
Expand Down Expand Up @@ -730,9 +739,14 @@ thermal_of_build_thermal_zone(struct device_node *np)
return tz;

free_tbps:
for (i = 0; i < tz->num_tbps; i++)
of_node_put(tz->tbps[i].cooling_device);
kfree(tz->tbps);
free_trips:
for (i = 0; i < tz->ntrips; i++)
of_node_put(tz->trips[i].np);
kfree(tz->trips);
of_node_put(gchild);
free_tz:
kfree(tz);
of_node_put(child);
Expand All @@ -742,7 +756,13 @@ thermal_of_build_thermal_zone(struct device_node *np)

static inline void of_thermal_free_zone(struct __thermal_zone *tz)
{
int i;

for (i = 0; i < tz->num_tbps; i++)
of_node_put(tz->tbps[i].cooling_device);
kfree(tz->tbps);
for (i = 0; i < tz->ntrips; i++)
of_node_put(tz->trips[i].np);
kfree(tz->trips);
kfree(tz);
}
Expand Down Expand Up @@ -814,10 +834,13 @@ int __init of_parse_thermal_zones(void)
/* attempting to build remaining zones still */
}
}
of_node_put(np);

return 0;

exit_free:
of_node_put(child);
of_node_put(np);
of_thermal_free_zone(tz);

/* no memory available, so free what we have built */
Expand Down Expand Up @@ -859,4 +882,5 @@ void of_thermal_destroy_zones(void)
kfree(zone->ops);
of_thermal_free_zone(zone->devdata);
}
of_node_put(np);
}

0 comments on commit c2aad93

Please sign in to comment.