Re: [PATCH v2 2/3] thermal: hwmon: Register a hwmon device for each thermal zone

Guenter Roeck <[email protected]> Tue, 5 May 2026 07:59:33 -0700
Newsgroups dev.linux.lists.sashiko,org.kernel.vger.linux-hwmon
Message-ID <[email protected]>
On 5/5/26 07:40, Rafael J. Wysocki wrote:
> On Tue, May 5, 2026 at 2:41 PM <[email protected]> wrote:
>>
>> Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
>> - [Critical] Changing the hwmon device name and splitting aggregate devices breaks userspace hwmon tools and configurations.
>> --
>>
>> commit ef04f4845b76df7ab7442699654ee8214cc3a4ea
>> Author: Rafael J. Wysocki <[email protected]>
>>
>> thermal: hwmon: Register a hwmon device for each thermal zone
>>
>> The current code creates one hwmon device per thermal zone type and registers
>> it under the first thermal zone of that type. This commit addresses removal
>> issues by registering one hwmon device for each thermal zone individually,
>> appending the zone ID to the hwmon name, and giving each its own temp1_input.
>>
>> Link: https://lore.kernel.org/linux-pm/[email protected]/
>>
>>> diff --git a/drivers/thermal/thermal_hwmon.c b/drivers/thermal/thermal_hwmon.c
>>> index 597c33c8a5550..223ae1571655b 100644
>>> --- a/drivers/thermal/thermal_hwmon.c
>>> +++ b/drivers/thermal/thermal_hwmon.c
>>
>> [ ... ]
>>
>>> @@ -137,54 +101,39 @@ int thermal_add_hwmon_sysfs(struct thermal_zone_device *tz)
>>>   {
>>>        struct thermal_hwmon_device *hwmon;
>>>        struct thermal_hwmon_temp *temp;
>>> -     int new_hwmon_device = 1;
>>>        int result;
>>>
>>> -     hwmon = thermal_hwmon_lookup_by_type(tz);
>>> -     if (hwmon) {
>>> -             new_hwmon_device = 0;
>>> -             goto register_sys_interface;
>>> -     }
>>> -
>>>        hwmon = kzalloc_obj(*hwmon);
>>>        if (!hwmon)
>>>                return -ENOMEM;
>>>
>>> -     INIT_LIST_HEAD(&hwmon->tz_list);
>>> -     strscpy(hwmon->type, tz->type, THERMAL_NAME_LENGTH);
>>> -     strreplace(hwmon->type, '-', '_');
>>> +     /*
>>> +      * Append the thermal zone ID preceded by an underline character to the
>>> +      * type to disambiguate the sensors command output.
>>> +      */
>>> +     scnprintf(hwmon->name, THERMAL_HWMON_NAME_LENGTH, "%s_%d", tz->type, tz->id);
>>> +     strreplace(hwmon->name, '-', '_');
>>
>> Could this change to the hwmon name attribute cause a regression for userspace
>> tools?
>>
>> Tools and configuration files, such as sensors.conf, typically use the name
>> attribute for matching devices (for example, matching acpitz-*). Appending an
>> instance-specific ID to the name might prevent these configurations from
>> applying correctly.
> 
> Or not.
> 
>>>        hwmon->device = hwmon_device_register_for_thermal(&tz->device,
>>> -                                                       hwmon->type, hwmon);
>>> +                                                       hwmon->name, hwmon);
>>>        if (IS_ERR(hwmon->device)) {
>>>                result = PTR_ERR(hwmon->device);
>>>                goto free_mem;
>>>        }
>>>
>>> - register_sys_interface:
>>> -     temp = kzalloc_obj(*temp);
>>> -     if (!temp) {
>>> -             result = -ENOMEM;
>>> -             goto unregister_name;
>>> -     }
>>> +     temp = &hwmon->tz_temp;
>>>
>>>        temp->tz = tz;
>>> -     hwmon->count++;
>>>
>>> -     snprintf(temp->temp_input.name, sizeof(temp->temp_input.name),
>>> -              "temp%d_input", hwmon->count);
>>> -     temp->temp_input.attr.attr.name = temp->temp_input.name;
>>> +     temp->temp_input.attr.attr.name = "temp1_input";
>>
>> Does splitting aggregate devices break existing sysfs access patterns?
>>
>> Previously, a single hwmon device might have contained multiple temperature
>> inputs, like temp1_input and temp2_input. Since each zone now gets its own
>> hwmon device with only a temp1_input, scripts or tools that explicitly read
>> temp2_input from the old aggregate device path will likely fail with a missing
>> file error.
> 
> Does this happen in practice though?
> 
I guess we'll see.

Guenter