Re: [PATCH] thermal/core: Split __thermal_cooling_device_register() into two functions
From: Lukasz Luba
Date: Fri May 08 2026 - 06:35:19 EST
On 5/7/26 19:26, Daniel Lezcano wrote:
On 5/7/26 12:02, Lukasz Luba wrote:
Hi Daniel,
On 5/5/26 15:44, Daniel Lezcano wrote:
In preparation for the upcoming changes separating OF and non-OF code,
split __thermal_cooling_device_register() into allocation and addition
phases.
This allows moving the device node assignment out of the core
initialization path.
This change is not a trivial split. The lifetime of the cooling device
is managed by the device core through put_device(), which triggers
thermal_release() to free all associated resources.
With the introduction of thermal_cooling_device_alloc(), the allocation
path must mirror what thermal_release() undoes. In contrast,
thermal_cooling_device_add() must not perform any rollback and relies
on put_device() for cleanup on error paths. This avoids both double
free and resource leaks.
As part of this rework, add the missing device_initialize() call when
allocating the cooling device.
Suggested-by: Rafael J. Wysocki <rafael@xxxxxxxxxx>
Signed-off-by: Daniel Lezcano <daniel.lezcano@xxxxxxxxxxxxxxxx>
---
[ ... ]
+static int thermal_cooling_device_add(struct thermal_cooling_device *cdev, void *devdata)
+{
+ unsigned long current_state;
+ int ret;
+
mutex_init(&cdev->lock);
INIT_LIST_HEAD(&cdev->thermal_instances);
- cdev->np = np;
- cdev->ops = ops;
cdev->updated = false;
cdev->device.class = &thermal_class;
+ device_initialize(&cdev->device);
cdev->devdata = devdata;
+ thermal_cooling_device_setup_sysfs(cdev);
+
+ ret = dev_set_name(&cdev->device, "cooling_device%d", cdev->id);
+ if (ret)
In case of error here, when the cdev->device won't have this name,
would thermal_release() still be able to call the cleanup
for the sysfs bits?
IMHO the check 'if()' there might bite us and we might not free
the sysfs allocated memory.
Hmm, I wondering if we can invert dev_set_name() and thermal_cooling_device_setup_sysfs() ?
I've checked that. It looks like the guarded 'if()'
in thermal_release which needs a dev_name() to clean-up the memory i
an issue in this case.
When this dev_set_name() fails, we won't go into the
clean up code to free cdev->type, ida, cdev...
I would call them explicitly in case of 'if(ret)'
error from dev_set_name()...
Then the rest could end in case of error with that new
'put_device()' logic at the bottom.
Would you agree?
A different option would be to refactor thermal_release()
and somehow recognize the cooling device not based on name.