From: Eduardo Valentin <eduardo.valentin@ti.com>
To: Durgadoss R <durgadoss.r@intel.com>
Cc: lenb@kernel.org, rui.zhang@intel.com, rjw@sisk.pl,
linux-acpi@vger.kernel.org, linux-pm@vger.kernel.org,
eduardo.valentin@ti.com, amit.kachhap@linaro.org, wni@nvidia.com
Subject: Re: [PATCH 08/13] Thermal: Introduce fair_share thermal governor
Date: Tue, 21 Aug 2012 08:33:13 +0300 [thread overview]
Message-ID: <20120821053313.GY9833@besouro> (raw)
In-Reply-To: <1344516365-7230-9-git-send-email-durgadoss.r@intel.com>
Hello,
On Thu, Aug 09, 2012 at 06:16:00PM +0530, Durgadoss R wrote:
> This patch introduces a simple 'weight' based
> governor named fair_share governor. Whenever the
> thermal framework gets notified of the trip point
> violation, this governor (if configured), throttles
> the cooling devices associated with a thermal zone.
>
> This mapping between a thermal zone and a cooling device
> and the effectiveness of cooling are provided in the
> platform layer.
>
> Signed-off-by: Durgadoss R <durgadoss.r@intel.com>
> ---
> drivers/thermal/Kconfig | 6 ++
> drivers/thermal/Makefile | 3 +-
> drivers/thermal/fair_share.c | 128 ++++++++++++++++++++++++++++++++++++++++++
> include/linux/thermal.h | 9 +++
> 4 files changed, 145 insertions(+), 1 deletion(-)
> create mode 100644 drivers/thermal/fair_share.c
>
> diff --git a/drivers/thermal/Kconfig b/drivers/thermal/Kconfig
> index 3ab2bd5..f5110c0 100644
> --- a/drivers/thermal/Kconfig
> +++ b/drivers/thermal/Kconfig
> @@ -27,3 +27,9 @@ config SPEAR_THERMAL
> help
> Enable this to plug the SPEAr thermal sensor driver into the Linux
> thermal framework
> +
> +config FAIR_SHARE
> + bool "Fair-share thermal governor"
> + depends on THERMAL
> + help
> + Enable this to manage platform thermals using fair-share governor.
> diff --git a/drivers/thermal/Makefile b/drivers/thermal/Makefile
> index a9fff0b..4ffe1a8 100644
> --- a/drivers/thermal/Makefile
> +++ b/drivers/thermal/Makefile
> @@ -3,4 +3,5 @@
> #
>
> obj-$(CONFIG_THERMAL) += thermal_sys.o
> -obj-$(CONFIG_SPEAR_THERMAL) += spear_thermal.o
> \ No newline at end of file
> +obj-$(CONFIG_SPEAR_THERMAL) += spear_thermal.o
> +obj-$(CONFIG_FAIR_SHARE) += fair_share.o
> diff --git a/drivers/thermal/fair_share.c b/drivers/thermal/fair_share.c
> new file mode 100644
> index 0000000..b8c8d45
> --- /dev/null
> +++ b/drivers/thermal/fair_share.c
> @@ -0,0 +1,128 @@
> +/*
> + * fair_share.c - A simple weight based Thermal governor
> + *
> + * Copyright (C) 2012 Intel Corp
> + * Copyright (C) 2012 Durgadoss R <durgadoss.r@intel.com>
> + *
> + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; version 2 of the License.
> + *
> + * This program is distributed in the hope that it will be useful, but
> + * WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + * General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License along
> + * with this program; if not, write to the Free Software Foundation, Inc.,
> + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
> + *
> + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> + */
> +
> +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
> +
> +#include <linux/module.h>
> +#include <linux/thermal.h>
> +
> +/**
> + * get_trip_level: - obtains the current trip level for a zone
> + * @tz: thermal zone device
> + */
> +static int get_trip_level(struct thermal_zone_device *tz)
> +{
> + int count = 0;
> + unsigned long trip_temp;
> +
> + if (tz->trips == 0 || !tz->ops->get_trip_temp)
> + return 0;
> +
> + for (count = 0; count < tz->trips; count++) {
> + tz->ops->get_trip_temp(tz, count, &trip_temp);
> + if (tz->temperature < trip_temp)
> + break;
> + }
> + return count;
> +}
> +
> +static long get_target_state(struct thermal_zone_device *tz,
> + struct thermal_cooling_device *cdev, int weight, int level)
> +{
> + unsigned long max_state;
> +
> + cdev->ops->get_max_state(cdev, &max_state);
> +
> + return (long)(weight * level * max_state) / (100 * tz->trips);
> +}
> +
> +static void thermal_cdev_update(struct thermal_cooling_device *cdev)
> +{
> + struct thermal_instance *instance;
> + unsigned long target = 0;
> +
> + mutex_lock(&cdev->lock);
> +
> + /* Make sure cdev enters the deepest cooling state */
> + list_for_each_entry(instance, &cdev->thermal_instances, cdev_node) {
> + if (instance->target > target)
> + target = instance->target;
> + }
> +
> + mutex_unlock(&cdev->lock);
> +
> + cdev->ops->set_cur_state(cdev, target);
> +}
I believe Rui has already provided an arbitrator, can we reuse it here as well?
> +
> +/**
> + * fair_share_throttle - throttles devices asscciated with the given zone
> + * @tz - thermal_zone_device
> + *
> + * Throttling Logic: This uses three parameters to calculate the new
> + * throttle state of the cooling devices associated with the given zone.
> + *
> + * Parameters used for Throttling:
> + * P1. max_state: Maximum throttle state exposed by the cooling device.
> + * P2. weight[i]/100:
> + * How 'effective' the 'i'th device is, in cooling the given zone.
> + * P3. cur_trip_level/max_no_of_trips:
> + * This describes the extent to which the devices should be throttled.
> + * We do not want to throttle too much when we trip a lower temperature,
> + * whereas the throttling is at full swing if we trip critical levels.
> + * (Heavily assumes the trip points are in ascending order)
> + * new_state of cooling device = P3 * P2 * P1
> + */
> +void fair_share_throttle(struct thermal_zone_device *tz, int trip)
> +{
> + struct thermal_zone_params *tzp;
> + struct thermal_cooling_device *cdev;
> + struct thermal_instance *instance;
> + int i;
> + int cur_trip_level = get_trip_level(tz);
> +
> + if (!tz->tzp)
> + return;
> +
> + tzp = tz->tzp;
> +
> + for (i = 0; i < tzp->num_cdevs; i++) {
> + cdev = get_cdev_by_name(tzp->cdevs_name[i]);
> + if (!cdev)
> + continue;
> +
> + instance = get_thermal_instance(tz, cdev, trip);
> + if (!instance)
> + continue;
> +
> + instance->target = get_target_state(tz, cdev,
> + tzp->weights[i], cur_trip_level);
> +
> + thermal_cdev_update(cdev);
> + }
> +}
> +EXPORT_SYMBOL(fair_share_throttle);
> +
> +MODULE_AUTHOR("Durgadoss R");
> +MODULE_DESCRIPTION("A simple weight based thermal throttling governor");
> +MODULE_LICENSE("GPL");
> diff --git a/include/linux/thermal.h b/include/linux/thermal.h
> index 1d49f05..4e2dc2c 100644
> --- a/include/linux/thermal.h
> +++ b/include/linux/thermal.h
> @@ -257,6 +257,15 @@ struct thermal_instance *get_thermal_instance(struct thermal_zone_device *,
> */
> extern int (*get_platform_thermal_params)(struct thermal_zone_device *);
>
> +#ifdef CONFIG_FAIR_SHARE
> +extern void fair_share_throttle(struct thermal_zone_device *tz, int trip);
> +#else
> +static inline void fair_share_throttle(struct thermal_zone_device *tz, int trip)
> +{
> + return;
> +}
> +#endif
> +
> #ifdef CONFIG_NET
> extern int thermal_generate_netlink_event(u32 orig, enum events event);
> #else
> --
> 1.7.9.5
>
next prev parent reply other threads:[~2012-08-21 5:33 UTC|newest]
Thread overview: 61+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-08-09 12:45 [PATCH 00/13] Thermal Framework Enhancements Durgadoss R
2012-08-09 12:45 ` [PATCH 01/13] Thermal: Refactor thermal.h file Durgadoss R
2012-08-20 15:58 ` Eduardo Valentin
2012-08-20 16:42 ` R, Durgadoss
2012-08-20 17:53 ` Eduardo Valentin
2012-08-09 12:45 ` [PATCH 02/13] Thermal: Move thermal_instance to thermal.h Durgadoss R
2012-08-16 6:14 ` Zhang Rui
2012-08-16 6:19 ` R, Durgadoss
2012-08-16 6:29 ` Zhang Rui
2012-08-16 6:31 ` R, Durgadoss
2012-08-16 7:12 ` Zhang Rui
2012-08-20 20:41 ` Eduardo Valentin
2012-08-09 12:45 ` [PATCH 03/13] Thermal: Add get trend, get instance API's to thermal_sys Durgadoss R
2012-08-20 20:58 ` Eduardo Valentin
2012-08-09 12:45 ` [PATCH 04/13] Thermal: Add platform level information to thermal.h Durgadoss R
2012-08-13 6:27 ` Zhang Rui
2012-08-13 6:31 ` R, Durgadoss
2012-08-16 6:16 ` Zhang Rui
2012-08-20 21:11 ` Eduardo Valentin
2012-08-09 12:45 ` [PATCH 05/13] Thermal: Obtain platform data for thermal zone Durgadoss R
2012-08-21 5:20 ` Eduardo Valentin
2012-08-09 12:45 ` [PATCH 06/13] Thermal: Add a policy sysfs attribute Durgadoss R
2012-08-13 6:28 ` Zhang Rui
2012-08-13 6:34 ` R, Durgadoss
2012-08-13 7:07 ` Zhang Rui
2012-08-21 5:31 ` Eduardo Valentin
2012-08-09 12:45 ` [PATCH 07/13] Thermal: Update binding logic based on platform data Durgadoss R
2012-08-13 6:41 ` Zhang Rui
2012-08-13 15:41 ` R, Durgadoss
2012-08-15 6:53 ` Zhang Rui
2012-08-15 9:17 ` R, Durgadoss
2012-08-16 3:30 ` Zhang Rui
2012-08-16 3:31 ` R, Durgadoss
2012-08-20 18:11 ` Eduardo Valentin
2012-08-09 12:46 ` [PATCH 08/13] Thermal: Introduce fair_share thermal governor Durgadoss R
2012-08-21 5:33 ` Eduardo Valentin [this message]
2012-08-21 5:59 ` R, Durgadoss
2012-08-21 14:16 ` Eduardo Valentin
2012-08-09 12:46 ` [PATCH 09/13] Thermal: Introduce a step_wise " Durgadoss R
2012-08-21 5:35 ` Eduardo Valentin
2012-08-09 12:46 ` [PATCH 10/13] Thermal: Remove throttling logic out of thermal_sys.c Durgadoss R
2012-08-13 7:00 ` Zhang Rui
2012-08-13 8:04 ` R, Durgadoss
2012-08-21 5:36 ` Eduardo Valentin
2012-08-09 12:46 ` [PATCH 11/13] Thermal: Add a notification API Durgadoss R
2012-08-13 7:02 ` Zhang Rui
2012-08-13 7:46 ` R, Durgadoss
2012-08-21 5:17 ` Eduardo Valentin
2012-08-09 12:46 ` [PATCH 12/13] Thermal: Add documentation for platform layer data Durgadoss R
2012-08-21 5:38 ` Eduardo Valentin
2012-08-21 5:51 ` R, Durgadoss
2012-08-09 12:46 ` [PATCH 13/13] Thermal: Platform layer changes to provide thermal data Durgadoss R
2012-08-21 5:39 ` Eduardo Valentin
2012-08-21 5:52 ` R, Durgadoss
2012-08-21 5:55 ` Zhang Rui
2012-08-21 6:41 ` R, Durgadoss
2012-08-21 6:52 ` Zhang Rui
2012-08-21 8:51 ` Eduardo Valentin
2012-08-23 0:11 ` Zhang Rui
2012-08-21 9:28 ` R, Durgadoss
2012-08-23 0:23 ` Zhang Rui
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=20120821053313.GY9833@besouro \
--to=eduardo.valentin@ti.com \
--cc=amit.kachhap@linaro.org \
--cc=durgadoss.r@intel.com \
--cc=lenb@kernel.org \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=rjw@sisk.pl \
--cc=rui.zhang@intel.com \
--cc=wni@nvidia.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 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.