All of lore.kernel.org
 help / color / mirror / Atom feed
From: Chanwoo Choi <cw00.choi@samsung.com>
To: "myungjoo.ham@samsung.com" <myungjoo.ham@samsung.com>
Cc: cwchoi00@gmail.com, Kyungmin Park <kyungmin.park@samsung.com>,
	"rafael.j.wysocki@intel.com" <rafael.j.wysocki@intel.com>,
	Inki Dae <inki.dae@samsung.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"linux-pm@vger.kernel.org" <linux-pm@vger.kernel.org>
Subject: Re: [PATCH v3 5/8] PM / devfreq: Get the available next frequency on update_devfreq()
Date: Fri, 13 Oct 2017 15:45:19 +0900	[thread overview]
Message-ID: <59E060FF.1060507@samsung.com> (raw)
In-Reply-To: <CAGTfZH0NSZkDvPAv=Msvqc5EQJQy5YEAWXwmgChvPVi2jaAnbg@mail.gmail.com>

Hi,

On 2017년 10월 11일 22:33, Chanwoo Choi wrote:
> On Wed, Oct 11, 2017 at 8:30 PM, MyungJoo Ham <myungjoo.ham@samsung.com> wrote:
>>> The update_devfreq() considers only user frequency (min_freq/max_freq)
>>> and the next target_freq provided by the governor. But, the commit
>>> a76caf55e5b35 ("thermal: Add devfreq cooling") is able to disable
>>> OPP as a cooling device. In result, the update_devfreq() have to
>>> consider the 'opp->available' status in order to decicde the next freq
>>> by the devfreq_recommended_opp().
>>>
>>> Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
>>> ---
>>>  drivers/devfreq/devfreq.c | 9 ++++++++-
>>>  1 file changed, 8 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c
>>> index 1c4b377cacfb..3b9662ffe603 100644
>>> --- a/drivers/devfreq/devfreq.c
>>> +++ b/drivers/devfreq/devfreq.c
>>> @@ -255,6 +255,7 @@ static int devfreq_notify_transition(struct devfreq *devfreq,
>>>  int update_devfreq(struct devfreq *devfreq)
>>>  {
>>>       struct devfreq_freqs freqs;
>>> +     struct dev_pm_opp *opp;
>>>       unsigned long freq, cur_freq;
>>>       int err = 0;
>>>       u32 flags = 0;
>>> @@ -273,7 +274,7 @@ int update_devfreq(struct devfreq *devfreq)
>>>               return err;
>>>
>>>       /*
>>> -      * Adjust the frequency with user freq and QoS.
>>> +      * Adjust the frequency with user freq, QoS and available freq.
>>>        *
>>>        * List from the highest priority
>>>        * max_freq
>>> @@ -289,6 +290,12 @@ int update_devfreq(struct devfreq *devfreq)
>>>               flags |= DEVFREQ_FLAG_LEAST_UPPER_BOUND; /* Use LUB */
>>>       }
>>>
>>> +     opp = devfreq_recommended_opp(devfreq->dev.parent, &freq, flags);
>>> +     if (IS_ERR(opp))
>>> +             return PTR_ERR(opp);
>>> +     freq = dev_pm_opp_get_freq(opp);
>>> +     dev_pm_opp_put(opp);
>>> +
>>
>> Is this really necessary?
> 
> The requirement is due to devfreq_cooling device using
> dev_pm_opp_disable/enable().

I got the better solution. If struct devfreq contains the 'scaling_min/max_freq'
variable, this issue could be fixed. I'll update it with scaling_min/max_freq'
variables on v4.

> 
> I added the detailed explanation on cover letter as following:
> If this code is not included, the notifiee using TRANSITION_NOTIFIER
> receives the wrong next target_freq. On the cpufreq, cpufreq doesn't
> use the 'dev_pm_opp_disable/enable()' function and then there is no
> the same issue on cpufreq.
> 
> [Cover letter's description about this patch]
> For example,
> - devfreq's min_freq is 100Mhz and max_freq is 700Mhz.
> - OPP disabled 500/600/700Mhz due to devfreq-cooling.c.
> - simple_ondemand govenor decided the next target_freq (600Mhz)
> |----------|-------------------------------------------------------------|
> |Freq(MHz) |100     |200    |300    |400     |500     |600      |70 0    |
> |Devfreq   |min_freq|       |       |        |        |         |max_freq|
> |OPP avail |enabled |enabled|enabled|enabled |Disabled| Disabled|Disabled|
> |Ondmenad  |        |       |       |        |        |next_freq|        |
> |------------------------------------------------------------------------|
> 
> In result,
> - Before this patch, target_freq is 600Mhz
>   and TRANSITION_NOTIFIER sends the next_freq is 600Mhz to the notifiee.
> - After this patch, target_freq is 400Mhz because 500/600 were disabled by OPP.
>   and TRANSITION_NOTIFIER sends the next_freq is 400Mhz to the notifiee.
> --------------
> 
>>
>> devfreq_recommended_opp is going to be called by the device driver
>> invoked by devfreq->profile->target() function anyway.
>>
>> We are now going to call devfreq_recommended_opp twice in this context.
>>
>>>       if (devfreq->profile->get_cur_freq)
>>>               devfreq->profile->get_cur_freq(devfreq->dev.parent, &cur_freq);
>>>       else
>>> --
> 
> Right. The devfreq_recommended_opp() is called twice.
> I wish there was a better way.
> 


-- 
Best Regards,
Chanwoo Choi
Samsung Electronics

  reply	other threads:[~2017-10-13  6:45 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <CGME20171011030946epcas1p1268ea2af497086ca64c373ea7367baaa@epcas1p1.samsung.com>
2017-10-11  3:09 ` [PATCH v3 0/8] PM / devfreq: Use OPP interface to handle the frequency Chanwoo Choi
2017-10-11  3:09   ` [PATCH v3 1/8] PM / devfreq: Set min/max_freq when adding the devfreq device Chanwoo Choi
2017-10-11 11:09     ` MyungJoo Ham
2017-10-11 11:22       ` FW: " MyungJoo Ham
2017-10-11  3:09   ` [PATCH v3 2/8] Revert "PM / devfreq: Add show_one macro to delete the duplicate code" Chanwoo Choi
2017-10-11  3:09   ` [PATCH v3 3/8] PM / devfreq: Show the available min/max frequency through sysfs node Chanwoo Choi
2017-10-11 11:15     ` MyungJoo Ham
2017-10-11 12:57       ` Chanwoo Choi
2017-10-12  4:08         ` Chanwoo Choi
2017-10-13  6:47           ` Chanwoo Choi
2017-10-11  3:09   ` [PATCH v3 4/8] PM / devfreq: Show the all available frequencies Chanwoo Choi
2017-10-11 11:26     ` MyungJoo Ham
2017-10-11 13:14       ` Chanwoo Choi
2017-10-11  3:09   ` [PATCH v3 5/8] PM / devfreq: Get the available next frequency on update_devfreq() Chanwoo Choi
2017-10-11 11:30     ` MyungJoo Ham
2017-10-11 13:33       ` Chanwoo Choi
2017-10-13  6:45         ` Chanwoo Choi [this message]
2017-10-11  3:09   ` [PATCH v3 6/8] PM / devfreq: Remove unneeded conditional statement Chanwoo Choi
2017-10-11 11:36     ` MyungJoo Ham
2017-10-11 13:45       ` Chanwoo Choi
2017-10-11  3:09   ` [PATCH v3 7/8] PM / devfreq: Define the constant governor name Chanwoo Choi
2017-10-11  3:09     ` Chanwoo Choi
2017-10-11  3:09   ` [PATCH v3 8/8] PM / devfreq: exynos-bus: Register cooling device Chanwoo Choi
2017-10-11  3:09     ` Chanwoo Choi
2017-10-11  3:09     ` Chanwoo Choi

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=59E060FF.1060507@samsung.com \
    --to=cw00.choi@samsung.com \
    --cc=cwchoi00@gmail.com \
    --cc=inki.dae@samsung.com \
    --cc=kyungmin.park@samsung.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=myungjoo.ham@samsung.com \
    --cc=rafael.j.wysocki@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 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.