Re: [PATCH v3 5/6] thermal/drivers/acpi: Make cross dev link optional by configuration

From: Rafael J. Wysocki
Date: Tue Apr 18 2023 - 09:38:36 EST


On Thu, Apr 13, 2023 at 1:47 PM Daniel Lezcano
<daniel.lezcano@xxxxxxxxxx> wrote:
>
> The ACPI thermal driver creates a link in the thermal zone device
> sysfs directory pointing to the device sysfs directory. At the same
> time, it creates a back pointer link from the device to the thermal
> zone device sysfs directory.
>
> From a generic perspective, having a device pointer in the sysfs
> thermal zone directory may make sense. But the opposite is not true as
> the same driver can be related to multiple thermal zones.
>
> The usage of these information is very specific to ACPI and it is
> questionable if they are really needed.
>
> Let's make the code optional and disable it by default. If it hurts,
> we will revert this change.
>
> Signed-off-by: Daniel Lezcano <daniel.lezcano@xxxxxxxxxx>
> ---
> drivers/acpi/Kconfig | 13 +++++++++
> drivers/acpi/thermal.c | 62 ++++++++++++++++++++++++++++--------------
> 2 files changed, 55 insertions(+), 20 deletions(-)
>
> diff --git a/drivers/acpi/Kconfig b/drivers/acpi/Kconfig
> index ccbeab9500ec..7df4e18f06ef 100644
> --- a/drivers/acpi/Kconfig
> +++ b/drivers/acpi/Kconfig
> @@ -336,6 +336,19 @@ config ACPI_THERMAL
> To compile this driver as a module, choose M here:
> the module will be called thermal.
>
> +config ACPI_THERMAL_SYSFS_ADDON
> + bool "Enable thermal sysfs addon"
> + depends on ACPI_THERMAL
> + def_bool n
> + help
> + Enable sysfs extra information added in the thermal zone and
> + the driver specific sysfs directories. That could be a link
> + to the associated thermal zone as well as a link pointing to
> + the device from the thermal zone. By default those are
> + disabled and are candidate for removal, if you need these
> + information anyway, enable the option or upgrade the
> + userspace program using them.
> +

I don't think that the Kconfig option is appropriate and the help text
above isn't really helpful.

> config ACPI_PLATFORM_PROFILE
> tristate
>
> diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c
> index 5763db4528b8..30fe189d04f8 100644
> --- a/drivers/acpi/thermal.c
> +++ b/drivers/acpi/thermal.c
> @@ -787,9 +787,44 @@ static struct thermal_zone_device_ops acpi_thermal_zone_ops = {
> .critical = acpi_thermal_zone_device_critical,
> };
>
> +#ifdef CONFIG_ACPI_THERMAL_SYSFS_ADDON

I agree with moving the code in question to separate functions, but I
don't agree with putting it under the Kconfig option.

> +static int acpi_thermal_zone_sysfs_add(struct acpi_thermal *tz)
> +{
> + struct device *tzdev = thermal_zone_device(tz->thermal_zone);
> + int ret;
> +
> + ret = sysfs_create_link(&tz->device->dev.kobj,
> + &tzdev->kobj, "thermal_zone");
> + if (ret)
> + return ret;
> +
> + ret = sysfs_create_link(&tzdev->kobj,
> + &tz->device->dev.kobj, "device");
> + if (ret)
> + sysfs_remove_link(&tz->device->dev.kobj, "thermal_zone");
> +
> + return ret;
> +}
> +
> +static void acpi_thermal_zone_sysfs_remove(struct acpi_thermal *tz)
> +{
> + struct device *tzdev = thermal_zone_device(tz->thermal_zone);
> +
> + sysfs_remove_link(&tz->device->dev.kobj, "thermal_zone");
> + sysfs_remove_link(&tzdev->kobj, "device");
> +}
> +#else
> +static inline int acpi_thermal_zone_sysfs_add(struct acpi_thermal *tz)
> +{
> + return 0;
> +}
> +static inline void acpi_thermal_zone_sysfs_remove(struct acpi_thermal *tz)
> +{
> +}
> +#endif
> +
> static int acpi_thermal_register_thermal_zone(struct acpi_thermal *tz)
> {
> - struct device *tzdev;
> int trips = 0;
> int result;
> acpi_status status;
> @@ -821,23 +856,15 @@ static int acpi_thermal_register_thermal_zone(struct acpi_thermal *tz)
> if (IS_ERR(tz->thermal_zone))
> return -ENODEV;
>
> - tzdev = thermal_zone_device(tz->thermal_zone);
> -
> - result = sysfs_create_link(&tz->device->dev.kobj,
> - &tzdev->kobj, "thermal_zone");
> + result = acpi_thermal_zone_sysfs_add(tz);
> if (result)
> goto unregister_tzd;
> -
> - result = sysfs_create_link(&tzdev->kobj,
> - &tz->device->dev.kobj, "device");
> - if (result)
> - goto remove_tz_link;
> -
> +
> status = acpi_bus_attach_private_data(tz->device->handle,
> tz->thermal_zone);
> if (ACPI_FAILURE(status)) {
> result = -ENODEV;
> - goto remove_dev_link;
> + goto remove_links;
> }
>
> result = thermal_zone_device_enable(tz->thermal_zone);
> @@ -851,10 +878,8 @@ static int acpi_thermal_register_thermal_zone(struct acpi_thermal *tz)
>
> acpi_bus_detach:
> acpi_bus_detach_private_data(tz->device->handle);
> -remove_dev_link:
> - sysfs_remove_link(&tzdev->kobj, "device");
> -remove_tz_link:
> - sysfs_remove_link(&tz->device->dev.kobj, "thermal_zone");
> +remove_links:
> + acpi_thermal_zone_sysfs_remove(tz);
> unregister_tzd:
> thermal_zone_device_unregister(tz->thermal_zone);
>
> @@ -863,10 +888,7 @@ static int acpi_thermal_register_thermal_zone(struct acpi_thermal *tz)
>
> static void acpi_thermal_unregister_thermal_zone(struct acpi_thermal *tz)
> {
> - struct device *tzdev = thermal_zone_device(tz->thermal_zone);
> -
> - sysfs_remove_link(&tz->device->dev.kobj, "thermal_zone");
> - sysfs_remove_link(&tzdev->kobj, "device");
> + acpi_thermal_zone_sysfs_remove(tz);
> thermal_zone_device_unregister(tz->thermal_zone);
> tz->thermal_zone = NULL;
> acpi_bus_detach_private_data(tz->device->handle);
> --
> 2.34.1
>