RE: [PATCH 09/16] Thermal: Introduce thermal_zone_trip_update()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Rui/Amit,


> -----Original Message-----
> From: Zhang, Rui
> Sent: Thursday, July 26, 2012 10:38 AM
> To: Amit Kachhap
> Cc: linux-acpi@xxxxxxxxxxxxxxx; linux-pm@xxxxxxxxxxxxxxx; Rafael J. Wysocki;
> Matthew Garrett; Len Brown; R, Durgadoss; Eduardo Valentin; Wei Ni
> Subject: Re: [PATCH 09/16] Thermal: Introduce thermal_zone_trip_update()
> 
> On 二, 2012-07-24 at 13:36 +0530, Amit Kachhap wrote:
> > On 24 July 2012 12:41, Zhang Rui <rui.zhang@xxxxxxxxx> wrote:
> > > On 二, 2012-07-24 at 12:27 +0530, Amit Kachhap wrote:
> > >>
> > >>
> > >> On 19 July 2012 12:01, Zhang Rui <rui.zhang@xxxxxxxxx> wrote:
> > >>         This function is used to update the cooling state of
> > >>         all the cooling devices that are binded to an active trip
> > >>         point.
> > >>
> > >>         This will be used for passive cooling as well, in the future
> > >>         patches.
> > >>         as both active and passive cooling can share the same
> > >>         algorithm,
> > >>         which is
> > >>
> > >>         1. if the temperature is higher than a trip point,
> > >>            a. if the trend is THERMAL_TREND_RAISING, use higher
> > >>         cooling
> > >>               state for this trip point
> > >>            b. if the trend is THERMAL_TREND_DROPPING, use lower
> > >>         cooling
> > >>               state for this trip point
> > >>
> > >>         2. if the temperature is lower than a trip point, use lower
> > >>            cooling state for this trip point.
> > >>
> > >> Hi Rui,
> > >>
> > >> Your patches looks useful.
> > >> For my platform I need to have get_trend called even in the case when
> > >> current temp is less than the trip point and then use
> > >> THERMAL_TREND_DROPPING to actually lower the cooling state.
> > >>
> > > hmm, why?
> > > in the current cooling algorithm, when the temperature is lower than the
> > > trip point, the cooling state is decreased by 1 every time,
> > > unconditionally, isn't this what you want?
> >
> > Basically the requirement is that I do not want to remove the cooling
> > device when the temp just reaches below the trip point because this
> > causes many throttling in this trip point so say I will remove cooling
> > device when the temp is < (trip - 5) which can be done inside the new
> > platform get_trend call.
> >
> As Durga is working on the thermal governor patches, I think that one
> can handle this, right?

I am fine with this..Since we anyway want all throttling logic to be moved to
the governor, I think it makes sense to put this there.

So, I will pick it up, when I submit the governor patches.
Amit, Please feel free to point out if I don’t pick this one in my patches.

Thanks,
Durga
> 
> Currently, as I do not want to change the behavior of the current
> drivers, ACPI passive cooling, etc, I did not use trend when the
> temperature is lower  than the trip point.
> But anyway, if really needed, I can generate an incremental patch.
> what do you think?
> 
> thanks,
> rui
> 
> > Thanks,
> > Amit D
> > >
> > > thanks,
> > > rui
> > >
> > >> Thanks,
> > >> Amit
> > >>
> > >>
> > >>         Signed-off-by: Zhang Rui <rui.zhang@xxxxxxxxx>
> > >>         ---
> > >>          drivers/acpi/thermal.c        |    7 +++-
> > >>          drivers/thermal/thermal_sys.c |   91
> > >>         +++++++++++++++++++++++++++++------------
> > >>          2 files changed, 71 insertions(+), 27 deletions(-)
> > >>
> > >>         diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c
> > >>         index 73e335f..14c4879 100644
> > >>         --- a/drivers/acpi/thermal.c
> > >>         +++ b/drivers/acpi/thermal.c
> > >>         @@ -715,7 +715,12 @@ static int thermal_get_trend(struct
> > >>         thermal_zone_device *thermal,
> > >>                 if (thermal_get_trip_type(thermal, trip, &type))
> > >>                         return -EINVAL;
> > >>
> > >>         -       /* Only PASSIVE trip points need TREND */
> > >>         +       if (type == THERMAL_TRIP_ACTIVE) {
> > >>         +               /* aggressive active cooling */
> > >>         +               *trend = THERMAL_TREND_RAISING;
> > >>         +               return 0;
> > >>         +       }
> > >>         +
> > >>                 if (type != THERMAL_TRIP_PASSIVE)
> > >>                         return -EINVAL;
> > >>
> > >>         diff --git a/drivers/thermal/thermal_sys.c
> > >>         b/drivers/thermal/thermal_sys.c
> > >>         index 59af3b8..011faba 100644
> > >>         --- a/drivers/thermal/thermal_sys.c
> > >>         +++ b/drivers/thermal/thermal_sys.c
> > >>         @@ -1076,6 +1076,70 @@ void
> > >>         thermal_cooling_device_unregister(struct
> > >>          }
> > >>          EXPORT_SYMBOL(thermal_cooling_device_unregister);
> > >>
> > >>         +/*
> > >>         + * Cooling algorithm for active trip points
> > >>         + *
> > >>         + * 1. if the temperature is higher than a trip point,
> > >>         + *    a. if the trend is THERMAL_TREND_RAISING, use higher
> > >>         cooling
> > >>         + *       state for this trip point
> > >>         + *    b. if the trend is THERMAL_TREND_DROPPING, use lower
> > >>         cooling
> > >>         + *       state for this trip point
> > >>         + *
> > >>         + * 2. if the temperature is lower than a trip point, use
> > >>         lower
> > >>         + *    cooling state for this trip point
> > >>         + *
> > >>         + * Note that this behaves the same as the previous passive
> > >>         cooling
> > >>         + * algorithm.
> > >>         + */
> > >>         +
> > >>         +static void thermal_zone_trip_update(struct
> > >>         thermal_zone_device *tz,
> > >>         +                                    int trip, long temp)
> > >>         +{
> > >>         +       struct thermal_cooling_device_instance *instance;
> > >>         +       struct thermal_cooling_device *cdev = NULL;
> > >>         +       unsigned long cur_state, max_state;
> > >>         +       long trip_temp;
> > >>         +       enum thermal_trend trend;
> > >>         +
> > >>         +       tz->ops->get_trip_temp(tz, trip, &trip_temp);
> > >>         +
> > >>         +       if (temp >= trip_temp) {
> > >>         +               thermal_get_trend(tz, trip, &trend);
> > >>         +
> > >>         +               list_for_each_entry(instance,
> > >>         &tz->cooling_devices, node) {
> > >>         +                       if (instance->trip != trip)
> > >>         +                               continue;
> > >>         +
> > >>         +                       cdev = instance->cdev;
> > >>         +
> > >>         +                       cdev->ops->get_cur_state(cdev,
> > >>         &cur_state);
> > >>         +                       cdev->ops->get_max_state(cdev,
> > >>         &max_state);
> > >>         +
> > >>         +                       if (trend == THERMAL_TREND_RAISING) {
> > >>         +                               cur_state = cur_state <
> > >>         instance->upper ?
> > >>         +                                           (cur_state + 1) :
> > >>         instance->upper;
> > >>         +                       } else if (trend ==
> > >>         THERMAL_TREND_DROPPING) {
> > >>         +                               cur_state = cur_state >
> > >>         instance->lower ?
> > >>         +                                   (cur_state - 1) :
> > >>         instance->lower;
> > >>         +                       }
> > >>         +                       cdev->ops->set_cur_state(cdev,
> > >>         cur_state);
> > >>         +               }
> > >>         +       } else {        /* below trip */
> > >>         +               list_for_each_entry(instance,
> > >>         &tz->cooling_devices, node) {
> > >>         +                       if (instance->trip != trip)
> > >>         +                               continue;
> > >>         +
> > >>         +                       cdev = instance->cdev;
> > >>         +                       cdev->ops->get_cur_state(cdev,
> > >>         &cur_state);
> > >>         +
> > >>         +                       cur_state = cur_state >
> > >>         instance->lower ?
> > >>         +                                   (cur_state - 1) :
> > >>         instance->lower;
> > >>         +                       cdev->ops->set_cur_state(cdev,
> > >>         cur_state);
> > >>         +               }
> > >>         +       }
> > >>         +
> > >>         +       return;
> > >>         +}
> > >>          /**
> > >>           * thermal_zone_device_update - force an update of a thermal
> > >>         zone's state
> > >>           * @ttz:       the thermal zone to update
> > >>         @@ -1086,9 +1150,6 @@ void thermal_zone_device_update(struct
> > >>         thermal_zone_device *tz)
> > >>                 int count, ret = 0;
> > >>                 long temp, trip_temp;
> > >>                 enum thermal_trip_type trip_type;
> > >>         -       struct thermal_cooling_device_instance *instance;
> > >>         -       struct thermal_cooling_device *cdev;
> > >>         -       unsigned long cur_state, max_state;
> > >>
> > >>                 mutex_lock(&tz->lock);
> > >>
> > >>         @@ -1124,29 +1185,7 @@ void thermal_zone_device_update(struct
> > >>         thermal_zone_device *tz)
> > >>                                                 tz->ops->notify(tz,
> > >>         count, trip_type);
> > >>                                 break;
> > >>                         case THERMAL_TRIP_ACTIVE:
> > >>         -                       list_for_each_entry(instance,
> > >>         &tz->cooling_devices,
> > >>         -                                           node) {
> > >>         -                               if (instance->trip != count)
> > >>         -                                       continue;
> > >>         -
> > >>         -                               cdev = instance->cdev;
> > >>         -
> > >>         -                               cdev->ops->get_cur_state(cdev,
> > >>         &cur_state);
> > >>         -                               cdev->ops->get_max_state(cdev,
> > >>         &max_state);
> > >>         -
> > >>         -                               if (temp >= trip_temp)
> > >>         -                                       cur_state =
> > >>         -                                               cur_state <
> > >>         instance->upper ?
> > >>         -                                               (cur_state +
> > >>         1) :
> > >>         -
> > >>         instance->upper;
> > >>         -                               else
> > >>         -                                       cur_state =
> > >>         -                                               cur_state >
> > >>         instance->lower ?
> > >>         -                                               (cur_state -
> > >>         1) :
> > >>         -
> > >>         instance->lower;
> > >>         -
> > >>         -                               cdev->ops->set_cur_state(cdev,
> > >>         cur_state);
> > >>         -                       }
> > >>         +                       thermal_zone_trip_update(tz, count,
> > >>         temp);
> > >>                                 break;
> > >>                         case THERMAL_TRIP_PASSIVE:
> > >>                                 if (temp >= trip_temp || tz->passive)
> > >>         --
> > >>         1.7.9.5
> > >>
> > >>
> > >
> > >
> 

��.n��������+%������w��{.n�����{�����ܨ}���Ơz�j:+v�����w����ޙ��&�)ߡ�a����z�ޗ���ݢj��w�f



[Index of Archives]     [Linux IBM ACPI]     [Linux Power Management]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux