Re: [PATCH] acpi: thermal: honor "mode" sysfs file setting

From: Zhang Rui
Date: Thu Jun 29 2017 - 01:20:01 EST


On Thu, 2017-06-29 at 00:14 +0200, Rafael J. Wysocki wrote:
> On Thursday, June 22, 2017 02:45:42 PM Enric Balletbo i Serra wrote:
> >
> > From: Sameer Nanda <snanda@xxxxxxxxxxxx>
> >
> > Under each thermal zone there is a file called "mode". Writing
> > enabled
> > or disabled to this file allows a given thermal zone to be enabled
> > or
> > disabled. Honor writes to this file by enabling or disabling the
> > polling timers.
> >
> > With this change, in the acpi_thermal_add path,
> > acpi_thermal_get_info
> > gets called before acpi_thermal_register_thermal_zone. Since
> > tz_enabled
> > was getting set to 1 only in acpi_thermal_register_thermal_zone,
> > acpi_thermal_get_info ended up disabling thermal polling so moved
> > the
> > setting of tz_enabled to 1 into acpi_thermal_add itself.
> >
> > After this patch echoing enabled|disabled to "mode" sysfs will
> > start/stop
> > the polling of the temperature.
> >
I see, so there are three logics to decide the polling frequency

1. returned by _TZP, according to ACPI spec
2. overridden by thermal.tzp module parameter
3. cleared when the thermal zone is disabled and restored when the
thermal zone is re-enabled (missing in current code)

what we are doing in this patch is to introduce the third logic, and
move all the code of 1, 2 and 3 into
acpi_thermal_get_polling_frequency().
To align with this change, tz->tz_enable=1 is moved earlier, before
acpi_thermal_get_polling_frequency() being invoked in
acpi_thermal_add().
right?

> > Signed-off-by: Sameer Nanda <snanda@xxxxxxxxxxxx>
> > Signed-off-by: Enric Balletbo i Serra <enric.balletbo@xxxxxxxxxxxxx
> > >
> Rui, Srinivas, can you please have a look at this one and let me know
> what you
> think?
>
> >
> > ---
> > Âdrivers/acpi/thermal.c | 28 +++++++++++++++++++++-------
> > Â1 file changed, 21 insertions(+), 7 deletions(-)
> >
> > diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c
> > index 1d0417b..68ad9fe 100644
> > --- a/drivers/acpi/thermal.c
> > +++ b/drivers/acpi/thermal.c
> > @@ -223,6 +223,17 @@ static int
> > acpi_thermal_get_polling_frequency(struct acpi_thermal *tz)
> > Â if (!tz)
> > Â return -EINVAL;
> > Â
> > + if (tz->tz_enabled == THERMAL_DEVICE_DISABLED) {
> > + tz->polling_frequency = 0;
> > + return 0;
> > + }
> > +
> > + /* Get default polling frequency [_TZP] (optional) */
> > + if (tzp) {
> > + tz->polling_frequency = tzp;
> > + return 0;
> > + }
> > +
> > Â status = acpi_evaluate_integer(tz->device->handle, "_TZP",
> > NULL, &tmp);
> > Â if (ACPI_FAILURE(status))
> > Â return -ENODEV;
> > @@ -582,6 +593,14 @@ static int thermal_set_mode(struct
> > thermal_zone_device *thermal,
> > Â ACPI_DEBUG_PRINT((ACPI_DB_INFO,
> > Â "%s kernel ACPI thermal control\n",
> > Â tz->tz_enabled ? "Enable" : "Disable"));
> > +
> > + acpi_thermal_get_polling_frequency(tz);
> > +
> > + mutex_lock(&tz->thermal_zone->lock);
> > + tz->thermal_zone->polling_delay = tz-
> > >polling_frequency * 100;
> > + tz->thermal_zone->passive_delay = tz-
> > >polling_frequency * 100;

To me, this policy, "disabling polling when disabling thermal zone,
enabling polling after enabling thermal zone" applies to all the
thermal zones, thus it's better to be implemented in thermal subsystem,
rather than ACPI thermal driver.

BTW, two other comments about the code itself,
1. I don't like the way how tz->polling_delay/tz->passive_delay are
changed here. If we have to do this, better using a thermal API, and we
should invokeÂmonitor_thermal_zone() right after updating these two
fields.
2. passive_delay is set to wrong value here.

thanks,
rui
> > + mutex_unlock(&tz->thermal_zone->lock);
> > +
> > Â acpi_thermal_check(tz);
> > Â }
> > Â return 0;
> > @@ -930,8 +949,6 @@ static int
> > acpi_thermal_register_thermal_zone(struct acpi_thermal *tz)
> > Â if (ACPI_FAILURE(status))
> > Â return -ENODEV;
> > Â
> > - tz->tz_enabled = 1;
> > -
> > Â dev_info(&tz->device->dev, "registered as
> > thermal_zone%d\n",
> > Â Âtz->thermal_zone->id);
> > Â return 0;
> > @@ -1039,11 +1056,7 @@ static int acpi_thermal_get_info(struct
> > acpi_thermal *tz)
> > Â if (!result)
> > Â tz->flags.cooling_mode = 1;
> > Â
> > - /* Get default polling frequency [_TZP] (optional) */
> > - if (tzp)
> > - tz->polling_frequency = tzp;
> > - else
> > - acpi_thermal_get_polling_frequency(tz);
> > + acpi_thermal_get_polling_frequency(tz);
> > Â
> > Â return 0;
> > Â}
> > @@ -1088,6 +1101,7 @@ static int acpi_thermal_add(struct
> > acpi_device *device)
> > Â return -ENOMEM;
> > Â
> > Â tz->device = device;
> > + tz->tz_enabled = 1;
> > Â strcpy(tz->name, device->pnp.bus_id);
> > Â strcpy(acpi_device_name(device),
> > ACPI_THERMAL_DEVICE_NAME);
> > Â strcpy(acpi_device_class(device), ACPI_THERMAL_CLASS);
> >
> --
> To unsubscribe from this list: send the line "unsubscribe linux-acpi"
> in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info atÂÂhttp://vger.kernel.org/majordomo-info.html