From: Saravana Kannan <skannan@codeaurora.org>
To: Viresh Kumar <viresh.kumar@linaro.org>
Cc: "Rafael J . Wysocki" <rjw@rjwysocki.net>,
Todd Poynor <toddpoynor@google.com>,
"linux-pm@vger.kernel.org" <linux-pm@vger.kernel.org>,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
"linux-arm-msm@vger.kernel.org" <linux-arm-msm@vger.kernel.org>,
"linux-arm-kernel@lists.infradead.org"
<linux-arm-kernel@lists.infradead.org>,
Stephen Boyd <sboyd@codeaurora.org>
Subject: Re: [PATCH v2] cpufreq: Don't destroy/realloc policy/sysfs on hotplug/suspend
Date: Fri, 11 Jul 2014 19:44:58 -0700 [thread overview]
Message-ID: <53C0A12A.2060204@codeaurora.org> (raw)
In-Reply-To: <CAKohpokhmj1OkCRj=X+Q7eYiun8fsqD2dpEt66VKYnqo3dENVA@mail.gmail.com>
On 07/11/2014 03:52 AM, Viresh Kumar wrote:
Just responding to one comment. The one about policy->cpu.
>
>>>> diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
>
>>>> static int cpufreq_add_dev_symlink(struct cpufreq_policy *policy)
>>>> {
>>>> - unsigned int j;
>>>> + unsigned int j, first_cpu = cpumask_first(policy->related_cpus);
>>>> int ret = 0;
>>>>
>>>> - for_each_cpu(j, policy->cpus) {
>>>> + for_each_cpu(j, policy->related_cpus) {
>>>> struct device *cpu_dev;
>>>>
>>>> - if (j == policy->cpu)
>>>> + if (j == first_cpu)
>>>
>>> why?
>>
>> The first CPU is a cluster always own the real nodes.
>
> What I meant was, why not use policy->cpu?
>
>>>> +static int cpufreq_add_dev_interface(struct cpufreq_policy *policy)
>>>> {
>>>> struct freq_attr **drv_attr;
>>>> + struct device *dev;
>>>> int ret = 0;
>>>>
>>>> + dev = get_cpu_device(cpumask_first(policy->related_cpus));
>>>> + if (!dev)
>>>> + return -EINVAL;
>>>> +
>>>
>>> Why?
>>
>> I'm just always adding the real nodes to the first CPU in a cluster
>> independent of which CPU gets added first. Makes it easier to know which
>> ones to symlink. See comment next to policy->cpu for full context.
>
> Yeah, and that is the order in which CPUs will boot and cpufreq_add_dev()
> will be called. So, isn't policy->cpu the right CPU always?
No, the "first" cpu in a cluster doesn't need to be the first one to be
added. An example is 2x2 cluster system where the system is booted with
max cpus = 2 and then cpu3 could be onlined first by userspace.
>
>>>> - if (has_target()) {
>>>> + cpus = cpumask_weight(policy->cpus);
>>>> + policy->cpu = cpumask_first(policy->cpus);
>>>
>>> why update it at all? Also, as per your logic what if cpus == 0?
>>
>> Yeah, I didn't write it this way at first. But the governors are making
>> the assumption that policy->cpu is always an online CPU. So, they try to
>
> Are you sure? I had a quick look and failed to see that..
>
>> queue work there and use data structs of that CPU (even if they free it in
>> the STOP event since it went offline).
>
> So, it queues work on all policy->cpus, not policy->cpu.
> And the data structures
> are just allocated with a CPU number, its fine if its offline.
>
> And where are we freeing that stuff in STOP ?
>
> Sorry if I am really really tired and couldn't read it correctly.
Yeah, it is pretty convolution. But pretty much anywhere in the gov code
where policy->cpu is used could cause this. The specific crash I hit was
in this code:
static void od_dbs_timer(struct work_struct *work)
{
struct od_cpu_dbs_info_s *dbs_info =
container_of(work, struct od_cpu_dbs_info_s, cdbs.work.work);
unsigned int cpu = dbs_info->cdbs.cur_policy->cpu;
======= CPU is policy->cpu here.
struct od_cpu_dbs_info_s *core_dbs_info = &per_cpu(od_cpu_dbs_info,
cpu);
======= Picks the per CPU struct of an offline CPU
<snip>
mutex_lock(&core_dbs_info->cdbs.timer_mutex);
======= Dies trying to lock a destroyed mutex
>
>> Another option is to leave policy->cpu unchanged and then fix all the
>> governors. But this patch would get even more complicated. So, we can
>> leave this as is, or fix that up in a separate patch.
>
> Since we are simplifying it here, I think we should NOT change policy->cpu
> at all. It will make life simple (probably).
I agree, but then I would have to fix up the governors. In the interest
of keeping this patch small. I'll continue with what I'm doing and fix
it up in another patch.
-Saravana
--
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
hosted by The Linux Foundation
WARNING: multiple messages have this Message-ID (diff)
From: skannan@codeaurora.org (Saravana Kannan)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v2] cpufreq: Don't destroy/realloc policy/sysfs on hotplug/suspend
Date: Fri, 11 Jul 2014 19:44:58 -0700 [thread overview]
Message-ID: <53C0A12A.2060204@codeaurora.org> (raw)
In-Reply-To: <CAKohpokhmj1OkCRj=X+Q7eYiun8fsqD2dpEt66VKYnqo3dENVA@mail.gmail.com>
On 07/11/2014 03:52 AM, Viresh Kumar wrote:
Just responding to one comment. The one about policy->cpu.
>
>>>> diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
>
>>>> static int cpufreq_add_dev_symlink(struct cpufreq_policy *policy)
>>>> {
>>>> - unsigned int j;
>>>> + unsigned int j, first_cpu = cpumask_first(policy->related_cpus);
>>>> int ret = 0;
>>>>
>>>> - for_each_cpu(j, policy->cpus) {
>>>> + for_each_cpu(j, policy->related_cpus) {
>>>> struct device *cpu_dev;
>>>>
>>>> - if (j == policy->cpu)
>>>> + if (j == first_cpu)
>>>
>>> why?
>>
>> The first CPU is a cluster always own the real nodes.
>
> What I meant was, why not use policy->cpu?
>
>>>> +static int cpufreq_add_dev_interface(struct cpufreq_policy *policy)
>>>> {
>>>> struct freq_attr **drv_attr;
>>>> + struct device *dev;
>>>> int ret = 0;
>>>>
>>>> + dev = get_cpu_device(cpumask_first(policy->related_cpus));
>>>> + if (!dev)
>>>> + return -EINVAL;
>>>> +
>>>
>>> Why?
>>
>> I'm just always adding the real nodes to the first CPU in a cluster
>> independent of which CPU gets added first. Makes it easier to know which
>> ones to symlink. See comment next to policy->cpu for full context.
>
> Yeah, and that is the order in which CPUs will boot and cpufreq_add_dev()
> will be called. So, isn't policy->cpu the right CPU always?
No, the "first" cpu in a cluster doesn't need to be the first one to be
added. An example is 2x2 cluster system where the system is booted with
max cpus = 2 and then cpu3 could be onlined first by userspace.
>
>>>> - if (has_target()) {
>>>> + cpus = cpumask_weight(policy->cpus);
>>>> + policy->cpu = cpumask_first(policy->cpus);
>>>
>>> why update it at all? Also, as per your logic what if cpus == 0?
>>
>> Yeah, I didn't write it this way at first. But the governors are making
>> the assumption that policy->cpu is always an online CPU. So, they try to
>
> Are you sure? I had a quick look and failed to see that..
>
>> queue work there and use data structs of that CPU (even if they free it in
>> the STOP event since it went offline).
>
> So, it queues work on all policy->cpus, not policy->cpu.
> And the data structures
> are just allocated with a CPU number, its fine if its offline.
>
> And where are we freeing that stuff in STOP ?
>
> Sorry if I am really really tired and couldn't read it correctly.
Yeah, it is pretty convolution. But pretty much anywhere in the gov code
where policy->cpu is used could cause this. The specific crash I hit was
in this code:
static void od_dbs_timer(struct work_struct *work)
{
struct od_cpu_dbs_info_s *dbs_info =
container_of(work, struct od_cpu_dbs_info_s, cdbs.work.work);
unsigned int cpu = dbs_info->cdbs.cur_policy->cpu;
======= CPU is policy->cpu here.
struct od_cpu_dbs_info_s *core_dbs_info = &per_cpu(od_cpu_dbs_info,
cpu);
======= Picks the per CPU struct of an offline CPU
<snip>
mutex_lock(&core_dbs_info->cdbs.timer_mutex);
======= Dies trying to lock a destroyed mutex
>
>> Another option is to leave policy->cpu unchanged and then fix all the
>> governors. But this patch would get even more complicated. So, we can
>> leave this as is, or fix that up in a separate patch.
>
> Since we are simplifying it here, I think we should NOT change policy->cpu
> at all. It will make life simple (probably).
I agree, but then I would have to fix up the governors. In the interest
of keeping this patch small. I'll continue with what I'm doing and fix
it up in another patch.
-Saravana
--
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
hosted by The Linux Foundation
next prev parent reply other threads:[~2014-07-12 2:44 UTC|newest]
Thread overview: 158+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-07-10 2:37 [PATCH] cpufreq: Don't destroy/realloc policy/sysfs on hotplug/suspend Saravana Kannan
2014-07-10 2:37 ` Saravana Kannan
2014-07-11 4:18 ` [PATCH v2] " Saravana Kannan
2014-07-11 4:18 ` Saravana Kannan
2014-07-11 6:19 ` Viresh Kumar
2014-07-11 6:19 ` Viresh Kumar
2014-07-11 9:59 ` skannan
2014-07-11 9:59 ` skannan at codeaurora.org
2014-07-11 10:07 ` skannan
2014-07-11 10:07 ` skannan
2014-07-11 10:07 ` skannan at codeaurora.org
2014-07-11 10:52 ` Viresh Kumar
2014-07-11 10:52 ` Viresh Kumar
2014-07-12 2:44 ` Saravana Kannan [this message]
2014-07-12 2:44 ` Saravana Kannan
2014-07-14 6:09 ` Viresh Kumar
2014-07-14 6:09 ` Viresh Kumar
2014-07-14 19:08 ` Saravana Kannan
2014-07-14 19:08 ` Saravana Kannan
2014-07-15 4:35 ` Viresh Kumar
2014-07-15 4:35 ` Viresh Kumar
2014-07-15 5:36 ` Saravana Kannan
2014-07-15 5:36 ` Saravana Kannan
2014-07-15 5:52 ` Viresh Kumar
2014-07-15 5:52 ` Viresh Kumar
2014-07-15 6:58 ` Srivatsa S. Bhat
2014-07-15 6:58 ` Srivatsa S. Bhat
2014-07-15 6:58 ` Srivatsa S. Bhat
2014-07-15 17:35 ` skannan
2014-07-15 17:35 ` skannan at codeaurora.org
2014-07-16 7:44 ` Srivatsa S. Bhat
2014-07-16 7:44 ` Srivatsa S. Bhat
2014-07-16 5:44 ` Viresh Kumar
2014-07-16 5:44 ` Viresh Kumar
2014-07-16 7:49 ` Srivatsa S. Bhat
2014-07-16 7:49 ` Srivatsa S. Bhat
2014-07-12 3:06 ` Saravana Kannan
2014-07-12 3:06 ` Saravana Kannan
2014-07-14 6:13 ` Viresh Kumar
2014-07-14 6:13 ` Viresh Kumar
2014-07-14 19:10 ` Saravana Kannan
2014-07-14 19:10 ` Saravana Kannan
2014-07-11 7:43 ` Srivatsa S. Bhat
2014-07-11 7:43 ` Srivatsa S. Bhat
2014-07-11 10:02 ` skannan
2014-07-11 10:02 ` skannan at codeaurora.org
2014-07-15 22:47 ` [PATCH v3 0/2] Simplify hotplug/suspend handling Saravana Kannan
2014-07-15 22:47 ` Saravana Kannan
2014-07-15 22:47 ` [PATCH v3 1/2] cpufreq: Don't destroy/realloc policy/sysfs on hotplug/suspend Saravana Kannan
2014-07-15 22:47 ` Saravana Kannan
2014-07-16 0:28 ` Saravana Kannan
2014-07-16 0:28 ` Saravana Kannan
2014-07-16 8:30 ` Viresh Kumar
2014-07-16 8:30 ` Viresh Kumar
2014-07-16 19:19 ` Saravana Kannan
2014-07-16 19:19 ` Saravana Kannan
2014-07-16 19:19 ` Saravana Kannan
2014-07-16 8:24 ` Viresh Kumar
2014-07-16 8:24 ` Viresh Kumar
2014-07-16 11:16 ` Srivatsa S. Bhat
2014-07-16 11:16 ` Srivatsa S. Bhat
2014-07-16 13:13 ` Viresh Kumar
2014-07-16 13:13 ` Viresh Kumar
2014-07-16 18:04 ` Srivatsa S. Bhat
2014-07-16 18:04 ` Srivatsa S. Bhat
2014-07-16 19:56 ` Saravana Kannan
2014-07-16 19:56 ` Saravana Kannan
2014-07-17 5:51 ` Viresh Kumar
2014-07-17 5:51 ` Viresh Kumar
2014-07-16 19:56 ` Saravana Kannan
2014-07-16 19:56 ` Saravana Kannan
2014-07-17 5:35 ` Viresh Kumar
2014-07-17 5:35 ` Viresh Kumar
2014-07-18 3:25 ` Saravana Kannan
2014-07-18 3:25 ` Saravana Kannan
2014-07-18 4:19 ` Viresh Kumar
2014-07-18 4:19 ` Viresh Kumar
2014-07-16 20:25 ` Saravana Kannan
2014-07-16 20:25 ` Saravana Kannan
2014-07-16 21:45 ` Saravana Kannan
2014-07-16 21:45 ` Saravana Kannan
2014-07-17 6:24 ` Viresh Kumar
2014-07-17 6:24 ` Viresh Kumar
2014-07-16 14:29 ` Dirk Brandewie
2014-07-16 14:29 ` Dirk Brandewie
2014-07-16 15:28 ` Viresh Kumar
2014-07-16 15:28 ` Viresh Kumar
2014-07-16 19:42 ` Saravana Kannan
2014-07-16 19:42 ` Saravana Kannan
2014-07-15 22:47 ` [PATCH v3 2/2] cpufreq: Simplify and fix mutual exclusion with hotplug Saravana Kannan
2014-07-15 22:47 ` Saravana Kannan
2014-07-16 8:48 ` Viresh Kumar
2014-07-16 8:48 ` Viresh Kumar
2014-07-16 19:34 ` Saravana Kannan
2014-07-16 19:34 ` Saravana Kannan
2014-07-25 1:07 ` [PATCH v4 0/5] Simplify hotplug/suspend handling Saravana Kannan
2014-07-25 1:07 ` Saravana Kannan
2014-07-25 1:07 ` [PATCH v4 1/5] cpufreq: Don't wait for CPU to going offline to restart governor Saravana Kannan
2014-07-25 1:07 ` Saravana Kannan
2014-07-31 20:47 ` Saravana Kannan
2014-07-31 20:47 ` Saravana Kannan
2014-07-25 1:07 ` [PATCH v4 2/5] cpufreq: Keep track of which CPU owns the kobj/sysfs nodes separately Saravana Kannan
2014-07-25 1:07 ` Saravana Kannan
2014-08-07 9:02 ` Viresh Kumar
2014-08-07 9:02 ` Viresh Kumar
2014-07-25 1:07 ` [PATCH v4 3/5] cpufreq: Don't destroy/realloc policy/sysfs on hotplug/suspend Saravana Kannan
2014-07-25 1:07 ` Saravana Kannan
2014-07-31 21:56 ` Rafael J. Wysocki
2014-07-31 21:56 ` Rafael J. Wysocki
2014-07-31 22:15 ` Saravana Kannan
2014-07-31 22:15 ` Saravana Kannan
2014-07-31 23:48 ` Saravana Kannan
2014-07-31 23:48 ` Saravana Kannan
2014-07-31 23:48 ` Saravana Kannan
2014-08-07 10:51 ` Viresh Kumar
2014-08-07 10:51 ` Viresh Kumar
2014-08-12 9:17 ` Viresh Kumar
2014-08-12 9:17 ` Viresh Kumar
2014-08-07 10:48 ` Viresh Kumar
2014-08-07 10:48 ` Viresh Kumar
2014-08-11 22:13 ` Saravana Kannan
2014-08-11 22:13 ` Saravana Kannan
2014-08-12 8:51 ` Viresh Kumar
2014-08-12 8:51 ` Viresh Kumar
2014-07-25 1:07 ` [PATCH v4 4/5] cpufreq: Properly handle physical CPU hot-add/hot-remove Saravana Kannan
2014-07-25 1:07 ` Saravana Kannan
2014-07-25 1:07 ` Saravana Kannan
2014-08-07 11:02 ` Viresh Kumar
2014-08-07 11:02 ` Viresh Kumar
2014-08-11 22:15 ` Saravana Kannan
2014-08-11 22:15 ` Saravana Kannan
2014-07-25 1:07 ` [PATCH v4 5/5] cpufreq: Delete dead code related to policy save/restore Saravana Kannan
2014-07-25 1:07 ` Saravana Kannan
2014-08-07 11:06 ` Viresh Kumar
2014-08-07 11:06 ` Viresh Kumar
2014-07-29 5:52 ` [PATCH v4 0/5] Simplify hotplug/suspend handling skannan
2014-07-29 5:52 ` skannan
2014-07-29 5:52 ` skannan at codeaurora.org
2014-07-30 0:29 ` Rafael J. Wysocki
2014-07-30 0:29 ` Rafael J. Wysocki
2014-07-31 20:25 ` Saravana Kannan
2014-07-31 20:25 ` Saravana Kannan
2014-08-07 6:04 ` skannan
2014-08-07 6:04 ` skannan at codeaurora.org
2014-10-16 8:53 ` Viresh Kumar
2014-10-16 8:53 ` Viresh Kumar
2014-10-23 21:41 ` Saravana Kannan
2014-10-23 21:41 ` Saravana Kannan
2014-07-16 22:02 ` [PATCH] cpufreq: Don't destroy/realloc policy/sysfs on hotplug/suspend Rafael J. Wysocki
2014-07-16 22:02 ` Rafael J. Wysocki
2014-07-16 22:35 ` Saravana Kannan
2014-07-16 22:35 ` Saravana Kannan
2014-07-24 3:02 ` Saravana Kannan
2014-07-24 3:02 ` Saravana Kannan
2014-07-24 5:04 ` Viresh Kumar
2014-07-24 5:04 ` Viresh Kumar
2014-07-24 9:12 ` skannan
2014-07-24 9:12 ` skannan at codeaurora.org
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=53C0A12A.2060204@codeaurora.org \
--to=skannan@codeaurora.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=rjw@rjwysocki.net \
--cc=sboyd@codeaurora.org \
--cc=toddpoynor@google.com \
--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.