From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752355AbcBZCQR (ORCPT ); Thu, 25 Feb 2016 21:16:17 -0500 Received: from hqemgate15.nvidia.com ([216.228.121.64]:13182 "EHLO hqemgate15.nvidia.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750736AbcBZCQQ (ORCPT ); Thu, 25 Feb 2016 21:16:16 -0500 X-PGP-Universal: processed; by hqnvupgp08.nvidia.com on Thu, 25 Feb 2016 18:16:05 -0800 Subject: Re: [PATCH] thermal: add sysfs_notify on some attributes References: <1456445532-2798-1-git-send-email-srikars@nvidia.com> To: "linux-kernel@vger.kernel.org" From: Srikar Srimath Tirumala Message-ID: <56CFB573.1090109@nvidia.com> Date: Thu, 25 Feb 2016 18:16:19 -0800 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.5.1 MIME-Version: 1.0 In-Reply-To: <1456445532-2798-1-git-send-email-srikars@nvidia.com> X-Originating-IP: [172.17.185.226] X-ClientProxiedBy: HQMAIL108.nvidia.com (172.18.146.13) To HQMAIL105.nvidia.com (172.20.187.12) Content-Type: text/plain; charset="windows-1252"; format=flowed Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 > --- > 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