All of lore.kernel.org
 help / color / mirror / Atom feed
From: Srikar Srimath Tirumala <srikars@nvidia.com>
To: "linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH] thermal: add sysfs_notify on some attributes
Date: Thu, 25 Feb 2016 18:16:19 -0800	[thread overview]
Message-ID: <56CFB573.1090109@nvidia.com> (raw)
In-Reply-To: <1456445532-2798-1-git-send-email-srikars@nvidia.com>

On 02/25/2016 04:12 PM, Srikar Srimath Tirumala wrote:
> Add a sysfs_notify on thermal_zone*/temp and cooling_device*/
> cur_state whenever any trip is triggered or cur state is changed.
>
> This change allows usermode apps to register themselves to get
> notified, when certain thermal conditions occur and reduce their
> workload. This workload throttling allows usermode to react before
> hardware clocks are throttled and keep some critical apps running
> reliably longer.
>
> Signed-off-by: Srikar Srimath Tirumala <srikars@nvidia.com>
> ---
>   drivers/thermal/thermal_core.c | 34 ++++++++++++++++++++++++++--------
>   1 file changed, 26 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c
> index a0a8fd1..f54519e 100644
> --- a/drivers/thermal/thermal_core.c
> +++ b/drivers/thermal/thermal_core.c
> @@ -419,14 +419,23 @@ static void monitor_thermal_zone(struct thermal_zone_device *tz)
>   	mutex_unlock(&tz->lock);
>   }
>
> -static void handle_non_critical_trips(struct thermal_zone_device *tz,
> +static int handle_non_critical_trips(struct thermal_zone_device *tz,
>   			int trip, enum thermal_trip_type trip_type)
>   {
> +	int trip_temp;
> +	int ret = 0;
> +
>   	tz->governor ? tz->governor->throttle(tz, trip) :
>   		       def_governor->throttle(tz, trip);
> +
> +	tz->ops->get_trip_temp(tz, trip, &trip_temp);
> +	if (tz->temperature >= trip_temp)
> +		ret = 1;
> +
> +	return ret;
>   }
>
> -static void handle_critical_trips(struct thermal_zone_device *tz,
> +static int handle_critical_trips(struct thermal_zone_device *tz,
>   				int trip, enum thermal_trip_type trip_type)
>   {
>   	int trip_temp;
> @@ -435,7 +444,7 @@ static void handle_critical_trips(struct thermal_zone_device *tz,
>
>   	/* If we have not crossed the trip_temp, we do not care. */
>   	if (trip_temp <= 0 || tz->temperature < trip_temp)
> -		return;
> +		return 0;
>
>   	trace_thermal_zone_trip(tz, trip, trip_type);
>
> @@ -448,23 +457,28 @@ static void handle_critical_trips(struct thermal_zone_device *tz,
>   			  tz->temperature / 1000);
>   		orderly_poweroff(true);
>   	}
> +
> +	return 1;
>   }
>
> -static void handle_thermal_trip(struct thermal_zone_device *tz, int trip)
> +static int handle_thermal_trip(struct thermal_zone_device *tz, int trip)
>   {
> +	int ret = 0;
>   	enum thermal_trip_type type;
>
>   	tz->ops->get_trip_type(tz, trip, &type);
>
>   	if (type == THERMAL_TRIP_CRITICAL || type == THERMAL_TRIP_HOT)
> -		handle_critical_trips(tz, trip, type);
> +		ret = handle_critical_trips(tz, trip, type);
>   	else
> -		handle_non_critical_trips(tz, trip, type);
> +		ret = handle_non_critical_trips(tz, trip, type);
>   	/*
>   	 * Alright, we handled this trip successfully.
>   	 * So, start monitoring again.
>   	 */
>   	monitor_thermal_zone(tz);
> +
> +	return ret;
>   }
>
>   /**
> @@ -556,7 +570,7 @@ static void thermal_zone_device_reset(struct thermal_zone_device *tz)
>   void thermal_zone_device_update(struct thermal_zone_device *tz)
>   {
>   	int count;
> -
> +	int trips = 0;
>   	if (atomic_read(&in_suspend))
>   		return;
>
> @@ -566,7 +580,10 @@ void thermal_zone_device_update(struct thermal_zone_device *tz)
>   	update_temperature(tz);
>
>   	for (count = 0; count < tz->trips; count++)
> -		handle_thermal_trip(tz, count);
> +		trips += handle_thermal_trip(tz, count);
> +
> +	if (trips)
> +		sysfs_notify(&tz->device.kobj, NULL, "temp");
>   }
>   EXPORT_SYMBOL_GPL(thermal_zone_device_update);
>
> @@ -1638,6 +1655,7 @@ void thermal_cdev_update(struct thermal_cooling_device *cdev)
>   	cdev->updated = true;
>   	trace_cdev_update(cdev, target);
>   	dev_dbg(&cdev->device, "set to state %lu\n", target);
> +	sysfs_notify(&cdev->device.kobj, NULL, "cur_state");
>   }
>   EXPORT_SYMBOL(thermal_cdev_update);
>
>
I intended this change to be an RFC and posted it by mistake. Kindly
ignore this patch. I sent it as a RFC again. Apologize for this
  duplicate email.
Srikar

      reply	other threads:[~2016-02-26  2:16 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-02-26  0:12 [PATCH] thermal: add sysfs_notify on some attributes Srikar Srimath Tirumala
2016-02-26  2:16 ` Srikar Srimath Tirumala [this message]

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=56CFB573.1090109@nvidia.com \
    --to=srikars@nvidia.com \
    --cc=linux-kernel@vger.kernel.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.