All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Srivatsa S. Bhat" <srivatsa.bhat@linux.vnet.ibm.com>
To: Viresh Kumar <viresh.kumar@linaro.org>
Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>,
	Meelis Roos <mroos@linux.ee>,
	"cpufreq@vger.kernel.org" <cpufreq@vger.kernel.org>,
	"linux-pm@vger.kernel.org" <linux-pm@vger.kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH 2/3] cpufreq, powernow-k6: Fix double invocation of cpufreq_freq_transition_begin/end
Date: Fri, 25 Apr 2014 14:12:10 +0530	[thread overview]
Message-ID: <535A1FE2.3080703@linux.vnet.ibm.com> (raw)
In-Reply-To: <CAKohpomVzp7TE6sC0FfC4x9v+pM6R4hLhz-q2E+wWybK4UuV1g@mail.gmail.com>

On 04/25/2014 01:58 PM, Viresh Kumar wrote:
> On 25 April 2014 13:48, Srivatsa S. Bhat
> <srivatsa.bhat@linux.vnet.ibm.com> wrote:
>> During frequency transitions, the cpufreq core takes the responsibility of
>> invoking cpufreq_freq_transition_begin() and cpufreq_freq_transition_end()
>> for those cpufreq drivers that define the ->target_index callback but don't
>> set the ASYNC_NOTIFICATION flag.
>>
>> The powernow-k6 cpufreq driver falls under this category, but this driver was
>> invoking the _begin() and _end() APIs itself around frequency transitions,
>> which led to double invocation of the _begin() API. The _begin API makes
>> contending callers wait until the previous invocation is complete. Hence,
>> the powernow-k6 driver ended up waiting on itself, leading to system hangs
>> during boot.
>>
>> Fix this by removing the calls to the _begin() and _end() APIs from the
>> powernow-k6 driver, since they rightly belong to the cpufreq core.
>>
>> (Note that during ->exit(), the powernow-k6 driver sets the frequency
>>  without any help from the cpufreq core. So add explicit calls to the
>>  _begin() and _end() APIs around that frequency transition alone, to take
>>  care of that special case. Also, add a missing 'break' statement there.)
>>
>> Signed-off-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
>> ---
>>
>>  drivers/cpufreq/powernow-k6.c |   20 +++++++++++---------
>>  1 file changed, 11 insertions(+), 9 deletions(-)
>>
>> diff --git a/drivers/cpufreq/powernow-k6.c b/drivers/cpufreq/powernow-k6.c
>> index 49f120e..6a4c34e 100644
>> --- a/drivers/cpufreq/powernow-k6.c
>> +++ b/drivers/cpufreq/powernow-k6.c
>> @@ -138,22 +138,14 @@ static void powernow_k6_set_cpu_multiplier(unsigned int best_i)
>>  static int powernow_k6_target(struct cpufreq_policy *policy,
>>                 unsigned int best_i)
>>  {
>> -       struct cpufreq_freqs freqs;
>>
>>         if (clock_ratio[best_i].driver_data > max_multiplier) {
>>                 printk(KERN_ERR PFX "invalid target frequency\n");
>>                 return -EINVAL;
>>         }
>>
>> -       freqs.old = busfreq * powernow_k6_get_cpu_multiplier();
>> -       freqs.new = busfreq * clock_ratio[best_i].driver_data;
>> -
>> -       cpufreq_freq_transition_begin(policy, &freqs);
>> -
>>         powernow_k6_set_cpu_multiplier(best_i);
>>
>> -       cpufreq_freq_transition_end(policy, &freqs, 0);
>> -
>>         return 0;
>>  }
>>
>> @@ -228,8 +220,18 @@ static int powernow_k6_cpu_exit(struct cpufreq_policy *policy)
>>  {
>>         unsigned int i;
>>         for (i = 0; i < 8; i++) {
>> -               if (i == max_multiplier)
>> +               if (i == max_multiplier) {
> 
> This wouldn't work, it has to be: (clock_ratio[i].driver_data == max_multiplier)
>

Hmm, looks like an existing bug in the driver. Will fix this in the next
version.

Regards,
Srivatsa S. Bhat
 
>> +                       struct cpufreq_freqs freqs;
>> +
>> +                       freqs.old = policy->cur;
>> +                       freqs.new = clock_ratio[i].frequency;
>> +                       freqs.flags = 0;
>> +
>> +                       cpufreq_freq_transition_begin(policy, &freqs);
>>                         powernow_k6_target(policy, i);
>> +                       cpufreq_freq_transition_end(policy, &freqs, 0);
>> +                       break;
>> +               }
>>         }
>>         return 0;
>>  }
> 
> Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
> 


  reply	other threads:[~2014-04-25  8:42 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-04-25  8:17 [PATCH 0/3] Cpufreq frequency serialization fixes Srivatsa S. Bhat
2014-04-25  8:18 ` [PATCH 1/3] cpufreq, longhaul: Fix double invocation of cpufreq_freq_transition_begin/end Srivatsa S. Bhat
2014-04-25  8:37   ` Viresh Kumar
2014-04-25  8:39     ` Srivatsa S. Bhat
2014-04-25  8:18 ` [PATCH 2/3] cpufreq, powernow-k6: " Srivatsa S. Bhat
2014-04-25  8:28   ` Viresh Kumar
2014-04-25  8:42     ` Srivatsa S. Bhat [this message]
2014-04-25  8:18 ` [PATCH 3/3] cpufreq, powernow-k7: " Srivatsa S. Bhat
2014-04-25  8:24   ` Viresh Kumar
2014-04-25 17:29 ` [PATCH 0/3] Cpufreq frequency serialization fixes Meelis Roos
2014-04-28 18:47   ` Srivatsa S. Bhat

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=535A1FE2.3080703@linux.vnet.ibm.com \
    --to=srivatsa.bhat@linux.vnet.ibm.com \
    --cc=cpufreq@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=mroos@linux.ee \
    --cc=rjw@rjwysocki.net \
    --cc=viresh.kumar@linaro.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.