From: "Srivatsa S. Bhat" <srivatsa.bhat@linux.vnet.ibm.com>
To: Linus Walleij <linus.walleij@linaro.org>
Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
Viresh Kumar <viresh.kumar@linaro.org>
Subject: Re: Regression on cpufreq in v3.12-rc1
Date: Thu, 19 Sep 2013 23:47:22 +0530 [thread overview]
Message-ID: <523B3FB2.80307@linux.vnet.ibm.com> (raw)
In-Reply-To: <523B3E4B.6080003@linux.vnet.ibm.com>
On 09/19/2013 11:41 PM, Srivatsa S. Bhat wrote:
> On 09/19/2013 06:28 PM, Srivatsa S. Bhat wrote:
>> On 09/19/2013 06:25 PM, Linus Walleij wrote:
>>> On Thu, Sep 19, 2013 at 2:46 PM, Srivatsa S. Bhat
>>> <srivatsa.bhat@linux.vnet.ibm.com> wrote:
>>>
>>>>>> I don't really know if this is the right solution at all, so please
>>>>>> help me out here... if you want that patch I can send it once
>>>>>> I understand this properly.
>>>>
>>>> IIRC, recent kernels didn't return 0 or any error code when the !policy
>>>> condition was matched. So can you check whether this problem occurs with
>>>> 3.11 or 3.10 as well?
>>>
>>> v3.11 works fine.
>>>
>
> Ok, now that I got a chance to look at the code and the git logs, I think
> I have a clearer idea of what is happening.
>
> Basically commit 474deff74 (cpufreq: remove cpufreq_policy_cpu per-cpu
> variable) exposed a hidden issue. Before that commit, the code looked like
> this:
>
> static DEFINE_PER_CPU(int, cpufreq_policy_cpu);
>
> [...]
>
> static int lock_policy_rwsem_##mode(int cpu) \
> { \
> int policy_cpu = per_cpu(cpufreq_policy_cpu, cpu); \
> BUG_ON(policy_cpu == -1); \
> down_##mode(&per_cpu(cpu_policy_rwsem, policy_cpu)); \
> \
> return 0; \
> }
>
> But there was no code to set the per-cpu values to -1 to begin with. Since
> the per-cpu variable was defined as static, it would have been initialized
> to zero. Thus, we would never actually hit the BUG_ON() condition, since
> policy_cpu didn't turn out to be -1.
>
> (The per-cpu variable was set to -1 only during error in __cpufreq_add_dev
> and during cpufreq_remove_dev, both of which are irrelevant to the scenario
> we are dealing with here).
>
> So, code ended up accessing and locking CPU 0's rwsemaphore. But how was
> its initialization taken care of? The answer is the initcall sequence.
> Cpufreq core code initialized itself at the core_initcall stage, and the
> sa1100 cpufreq driver initialized itself at the arch_initcall stage, like
> Viresh mentioned. And core-initcall comes before arch-initcall. So the
> cpufreq core would have finished initializing the per-cpu rwsemaphores,
> so that locking/unlocking them wouldn't crash the system or get complaints
> from lockdep.
>
> To summarize, I think before commit 474deff74, we were accessing CPU0's
> rwsems (perhaps incorrectly) and due to the lacking initialization of the
> per-cpu vars, the BUG_ON() would never fire.
>
> To confirm this, you can perhaps try out one commit before 474deff74 and see
> if it works for you. Or equivalently, you can apply the following patch
> (revert of 474deff74) over mainline and see if it works.
Just before sending, I rebased that patch on top of Rafael's linux-next
branch, but forgot to update the above sentence. However I think the same
patch might apply cleanly over mainline as well.
Regards,
Srivatsa S. Bhat
next prev parent reply other threads:[~2013-09-19 18:21 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-09-18 21:21 Regression on cpufreq in v3.12-rc1 Linus Walleij
2013-09-18 22:41 ` Rafael J. Wysocki
2013-09-19 12:21 ` Linus Walleij
2013-09-19 12:46 ` Srivatsa S. Bhat
2013-09-19 12:55 ` Linus Walleij
2013-09-19 12:58 ` Srivatsa S. Bhat
2013-09-19 14:12 ` Viresh Kumar
2013-09-19 18:11 ` Srivatsa S. Bhat
2013-09-19 18:17 ` Srivatsa S. Bhat [this message]
2013-09-20 4:19 ` Viresh Kumar
2013-09-20 10:13 ` Srivatsa S. Bhat
2013-09-20 8:43 ` Linus Walleij
2013-09-20 8:33 ` Linus Walleij
2013-09-20 8:39 ` Viresh Kumar
2013-09-20 8:41 ` Linus Walleij
2013-09-20 8:49 ` Viresh Kumar
2013-09-20 9:35 ` Viresh Kumar
2013-09-20 15:16 ` Srivatsa S. Bhat
2013-09-20 16:54 ` Viresh Kumar
2013-09-21 5:47 ` Srivatsa S. Bhat
2013-09-20 15:36 ` Linus Walleij
2013-09-20 15:39 ` Linus Walleij
2013-09-20 17:05 ` Viresh Kumar
2013-09-20 17:31 ` Linus Walleij
2013-09-20 15:21 ` Linus Walleij
2013-09-20 15:32 ` Srivatsa S. Bhat
2013-09-20 15:40 ` Linus Walleij
2013-09-20 16:34 ` Linus Walleij
2013-09-20 17:01 ` Viresh Kumar
2013-09-21 5:48 ` 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=523B3FB2.80307@linux.vnet.ibm.com \
--to=srivatsa.bhat@linux.vnet.ibm.com \
--cc=linus.walleij@linaro.org \
--cc=linux-kernel@vger.kernel.org \
--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.