mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Neil Armstrong <neil.armstrong@linaro.org>
To: Daniel Lezcano <daniel.lezcano@linaro.org>,
	"Rafael J. Wysocki" <rjw@rjwysocki.net>,
	Linux PM <linux-pm@vger.kernel.org>
Cc: LKML <linux-kernel@vger.kernel.org>,
	Lukasz Luba <lukasz.luba@arm.com>,
	Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>,
	Zhang Rui <rui.zhang@intel.com>
Subject: Re: [PATCH v3] thermal: core: Call monitor_thermal_zone() if zone temperature is invalid
Date: Thu, 4 Jul 2024 14:52:50 +0200	[thread overview]
Message-ID: <d30068aa-b0df-4ec7-9a6b-9d5c6b49b74e@linaro.org> (raw)
In-Reply-To: <218d45a8-4c3d-453b-aded-d232c366da2c@linaro.org>

Hi,

On 04/07/2024 14:49, Daniel Lezcano wrote:
> On 04/07/2024 13:46, Rafael J. Wysocki wrote:
>> From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
>>
>> Commit 202aa0d4bb53 ("thermal: core: Do not call handle_thermal_trip()
>> if zone temperature is invalid") caused __thermal_zone_device_update()
>> to return early if the current thermal zone temperature was invalid.
>>
>> This was done to avoid running handle_thermal_trip() and governor
>> callbacks in that case which led to confusion.  However, it went too
>> far because monitor_thermal_zone() still needs to be called even when
>> the zone temperature is invalid to ensure that it will be updated
>> eventually in case thermal polling is enabled and the driver has no
>> other means to notify the core of zone temperature changes (for example,
>> it does not register an interrupt handler or ACPI notifier).
>>
>> Also if the .set_trips() zone callback is expected to set up monitoring
>> interrupts for a thermal zone, it needs to be provided with valid
>> boundaries and that can only be done if the zone temperature is known.
>>
>> Accordingly, to ensure that __thermal_zone_device_update() will
>> run again after a failing zone temperature check, make it call
>> monitor_thermal_zone() regardless of whether or not the zone
>> temperature is valid and make the latter schedule a thermal zone
>> temperature update if the zone temperature is invalid even if
>> polling is not enabled for the thermal zone (however, if this
>> continues to fail, give up after some time).
> 
> Rafael,
> 
> do we agree that we should fix somehow the current issue in this way because we are close to the merge window, but the proper fix is not doing that ?

I've tested this patch, but I have no opinion about it.

I sent https://lore.kernel.org/all/20240704-topic-sm8x50-upstream-fix-battmgr-temp-tz-warn-v1-1-9d66d6f6efde@linaro.org/ which
fixes the warning print, leaving the option for thermal core to update the tz once it becomes available,
which is the initial goal of this patchset.

Neil

> 
> 
>> Fixes: 202aa0d4bb53 ("thermal: core: Do not call handle_thermal_trip() if zone temperature is invalid")
>> Reported-by: Daniel Lezcano <daniel.lezcano@linaro.org>
>> Link: https://lore.kernel.org/linux-pm/dc1e6cba-352b-4c78-93b5-94dd033fca16@linaro.org
>> Link: https://lore.kernel.org/linux-pm/2764814.mvXUDI8C0e@rjwysocki.net
>> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
>> ---
>>   drivers/thermal/thermal_core.c |   13 ++++++++++++-
>>   drivers/thermal/thermal_core.h |    9 +++++++++
>>   2 files changed, 21 insertions(+), 1 deletion(-)
>>
>> Index: linux-pm/drivers/thermal/thermal_core.c
>> ===================================================================
>> --- linux-pm.orig/drivers/thermal/thermal_core.c
>> +++ linux-pm/drivers/thermal/thermal_core.c
>> @@ -300,6 +300,14 @@ static void monitor_thermal_zone(struct
>>           thermal_zone_device_set_polling(tz, tz->passive_delay_jiffies);
>>       else if (tz->polling_delay_jiffies)
>>           thermal_zone_device_set_polling(tz, tz->polling_delay_jiffies);
>> +    else if (tz->temperature == THERMAL_TEMP_INVALID &&
>> +         tz->recheck_delay_jiffies <= THERMAL_MAX_RECHECK_DELAY) {
>> +        thermal_zone_device_set_polling(tz, tz->recheck_delay_jiffies);
>> +        /* Double the recheck delay for the next attempt. */
>> +        tz->recheck_delay_jiffies += tz->recheck_delay_jiffies;
>> +        if (tz->recheck_delay_jiffies > THERMAL_MAX_RECHECK_DELAY)
>> +            dev_info(&tz->device, "Temperature unknown, giving up\n");
>> +    }
>>   }
>>   static struct thermal_governor *thermal_get_tz_governor(struct thermal_zone_device *tz)
>> @@ -430,6 +438,7 @@ static void update_temperature(struct th
>>       tz->last_temperature = tz->temperature;
>>       tz->temperature = temp;
>> +    tz->recheck_delay_jiffies = 1;
>>       trace_thermal_temperature(tz);
>> @@ -514,7 +523,7 @@ void __thermal_zone_device_update(struct
>>       update_temperature(tz);
>>       if (tz->temperature == THERMAL_TEMP_INVALID)
>> -        return;
>> +        goto monitor;
>>       tz->notify_event = event;
>> @@ -536,6 +545,7 @@ void __thermal_zone_device_update(struct
>>       thermal_debug_update_trip_stats(tz);
>> +monitor:
>>       monitor_thermal_zone(tz);
>>   }
>> @@ -1438,6 +1448,7 @@ thermal_zone_device_register_with_trips(
>>       thermal_set_delay_jiffies(&tz->passive_delay_jiffies, passive_delay);
>>       thermal_set_delay_jiffies(&tz->polling_delay_jiffies, polling_delay);
>> +    tz->recheck_delay_jiffies = 1;
>>       /* sys I/F */
>>       /* Add nodes that are always present via .groups */
>> Index: linux-pm/drivers/thermal/thermal_core.h
>> ===================================================================
>> --- linux-pm.orig/drivers/thermal/thermal_core.h
>> +++ linux-pm/drivers/thermal/thermal_core.h
>> @@ -67,6 +67,8 @@ struct thermal_governor {
>>    * @polling_delay_jiffies: number of jiffies to wait between polls when
>>    *            checking whether trip points have been crossed (0 for
>>    *            interrupt driven systems)
>> + * @recheck_delay_jiffies: delay after a failed thermal zone temperature check
>> + *             before attempting to check it again
>>    * @temperature:    current temperature.  This is only for core code,
>>    *            drivers should use thermal_zone_get_temp() to get the
>>    *            current temperature
>> @@ -108,6 +110,7 @@ struct thermal_zone_device {
>>       int num_trips;
>>       unsigned long passive_delay_jiffies;
>>       unsigned long polling_delay_jiffies;
>> +    unsigned long recheck_delay_jiffies;
>>       int temperature;
>>       int last_temperature;
>>       int emul_temperature;
>> @@ -133,6 +136,12 @@ struct thermal_zone_device {
>>       struct thermal_trip_desc trips[] __counted_by(num_trips);
>>   };
>> +/*
>> + * Maximum delay after a failing thermal zone temperature check before
>> + * attempting to check it again (in jiffies).
>> + */
>> +#define THERMAL_MAX_RECHECK_DELAY    (30 * HZ)
>> +
>>   /* Default Thermal Governor */
>>   #if defined(CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE)
>>   #define DEFAULT_THERMAL_GOVERNOR       "step_wise"
>>
>>
>>
> 


  reply	other threads:[~2024-07-04 12:52 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-07-04 11:46 Rafael J. Wysocki
2024-07-04 12:49 ` Daniel Lezcano
2024-07-04 12:52   ` Neil Armstrong [this message]
2024-07-04 14:23     ` Rafael J. Wysocki
2024-07-04 14:21   ` Rafael J. Wysocki
2024-07-04 16:53     ` Daniel Lezcano
2024-07-04 16:58       ` Rafael J. Wysocki
2024-07-15  4:45 ` Eric Biggers
2024-07-15  9:06   ` Stefan Lippers-Hollmann
2024-07-15 10:52     ` Rafael J. Wysocki
2024-07-15  9:09   ` Daniel Lezcano
2024-07-15 11:21     ` Rafael J. Wysocki
2024-07-15 12:54       ` Stefan Lippers-Hollmann
2024-07-15 14:48         ` Rafael J. Wysocki
2024-07-15 21:12           ` Eric Biggers
2024-07-15 23:48           ` Stefan Lippers-Hollmann
2024-07-16 10:05             ` Rafael J. Wysocki
2024-07-16 10:55               ` Stefan Lippers-Hollmann
2024-07-16 11:15                 ` Stefan Lippers-Hollmann
2024-07-16 11:36                   ` Rafael J. Wysocki
2024-07-16 12:10                     ` Daniel Lezcano
2024-07-16 12:18                       ` Rafael J. Wysocki
2024-07-16 12:30                     ` Rafael J. Wysocki
2024-07-16 13:20                       ` Stefan Lippers-Hollmann
2024-07-16 14:04                         ` Rafael J. Wysocki
2024-07-16 16:37                           ` Oleksandr Natalenko
2024-07-16 17:03                             ` Rafael J. Wysocki
2024-07-16 23:30                           ` Stefan Lippers-Hollmann
2024-07-16 11:19                 ` Rafael J. Wysocki
2024-07-15 10:49   ` Rafael J. Wysocki

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=d30068aa-b0df-4ec7-9a6b-9d5c6b49b74e@linaro.org \
    --to=neil.armstrong@linaro.org \
    --cc=daniel.lezcano@linaro.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=lukasz.luba@arm.com \
    --cc=rjw@rjwysocki.net \
    --cc=rui.zhang@intel.com \
    --cc=srinivas.pandruvada@linux.intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®