From: Viresh Kumar <viresh.kumar@linaro.org>
To: "Srivatsa S. Bhat" <srivatsa.bhat@linux.vnet.ibm.com>
Cc: rjw@sisk.pl, toralf.foerster@gmx.de, robert.jarzmik@intel.com,
durgadoss.r@intel.com, tianyu.lan@intel.com,
lantianyu1986@gmail.com, dirk.brandewie@gmail.com,
stern@rowland.harvard.edu, linux-pm@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH 7/8] cpufreq: Preserve policy structure across suspend/resume
Date: Tue, 16 Jul 2013 14:40:50 +0530 [thread overview]
Message-ID: <CAKohponOeqptU2mz4XCFZKoEs5EBTTx0A3Dvev5k-BJiW_2McA@mail.gmail.com> (raw)
In-Reply-To: <51E50AD4.6040208@linux.vnet.ibm.com>
On 16 July 2013 14:26, Srivatsa S. Bhat
<srivatsa.bhat@linux.vnet.ibm.com> wrote:
> On 07/16/2013 11:45 AM, Viresh Kumar wrote:
>> To understand it I actually applied your patches to get better view of the code.
>> (Haven't tested it though).. And found that your code is doing the right thing
>> and we shouldn't get a mismatch.. This is the sequence of events I can draw:
>>
>> - __cpu_add_dev() for first cpu. sets the refcount to 'x', where x are
>> the no. of
>> cpus in its clock domain.
>> - _cpu_add_dev() for other cpus: doesn't change anything in refcount
>>
>> - Suspend:
>> - cpu_remove_dev() for all cpus, due to frozen flag we don't touch the value
>> of count
>> - Resume:
>> - cpu_add_dev() for all cpus, due to frozen flag we don't touch the
>> value of count.
>>
>
> Actually this one is tricky (I took a look again). So we have this code in the
> beginning of _cpufreq_add_dev():
>
>
> 1008 #ifdef CONFIG_SMP
> 1009 /* check whether a different CPU already registered this
> 1010 * CPU because it is in the same boat. */
> 1011 policy = cpufreq_cpu_get(cpu);
> 1012 if (unlikely(policy)) {
> 1013 cpufreq_cpu_put(policy);
> 1014 return 0;
> 1015 }
>
> The _get() is not controlled by the frozen flag, but it still doesn't take a
> refcount because of a subtle reason: per_cpu(cpufreq_cpu_data, cpu) was set to
> NULL in __cpufreq_remove_dev() and the memory was saved away in fallback storage.
> So, when __cpufreq_cpu_get() executes, it sees:
>
> 204 /* get the CPU */
> 205 data = per_cpu(cpufreq_cpu_data, cpu);
> 206
> 207 if (!data)
> 208 goto err_out_put_module;
>
> Thus, since data is NULL, cpufreq_cpu_get() won't take a refcount and will return
> silently.
Even if this wouldn't have happened, refcount wouldn't have been
touched due to this code:
> 1012 if (unlikely(policy)) {
> 1013 cpufreq_cpu_put(policy);
> 1014 return 0;
> 1015 }
i.e. If we get a valid policy structure, we siimply put the policy again
and so decrement the incremented refcount.
So, even if you don't keep the fallback storage, things should work
without any issue (probably worth trying as this will get rid of a per
cpu variable :))
> Further down in __cpufreq_add_dev(), we restore the original memory, using
> the frozen flag:
>
> 1037 if (frozen)
> 1038 /* Restore the saved policy when doing light-weight init */
> 1039 policy = cpufreq_policy_restore(cpu);
> 1040 else
> 1041 policy = cpufreq_policy_alloc();
>
>
> So that is how we manage to fool cpufreq_cpu_get() into not taking a fresh
> refcount while resuming :)
next prev parent reply other threads:[~2013-07-16 9:10 UTC|newest]
Thread overview: 51+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-07-11 22:15 [PATCH 0/8] Cpufreq, cpu hotplug, suspend/resume related fixes Srivatsa S. Bhat
2013-07-11 22:15 ` [PATCH 1/8] cpufreq: Revert commit a66b2e to fix cpufreq regression during suspend/resume Srivatsa S. Bhat
2013-07-12 7:18 ` Viresh Kumar
2013-07-13 12:46 ` Paul Bolle
2013-07-15 6:18 ` Srivatsa S. Bhat
2013-07-11 22:15 ` [PATCH 2/8] cpufreq: Fix misplaced call to cpufreq_update_policy() Srivatsa S. Bhat
2013-07-12 7:06 ` Viresh Kumar
2013-07-15 6:20 ` Srivatsa S. Bhat
2013-07-15 11:37 ` Rafael J. Wysocki
2013-07-11 22:16 ` [PATCH 3/8] cpufreq: Add helper to perform alloc/free of policy structure Srivatsa S. Bhat
2013-07-12 7:09 ` Viresh Kumar
2013-07-15 6:24 ` Srivatsa S. Bhat
2013-07-11 22:16 ` [PATCH 4/8] cpufreq: Extract non-interface related stuff from cpufreq_add_dev_interface Srivatsa S. Bhat
2013-07-12 7:17 ` Viresh Kumar
2013-07-11 22:16 ` [PATCH 5/8] cpufreq: Extract the handover of policy cpu to a helper function Srivatsa S. Bhat
2013-07-12 7:19 ` Viresh Kumar
2013-07-11 22:16 ` [PATCH 6/8] cpufreq: Introduce a flag ('frozen') to separate full vs temporary init/teardown Srivatsa S. Bhat
2013-07-12 7:31 ` Viresh Kumar
2013-07-11 22:17 ` [PATCH 7/8] cpufreq: Preserve policy structure across suspend/resume Srivatsa S. Bhat
2013-07-15 9:55 ` Viresh Kumar
2013-07-15 10:05 ` Srivatsa S. Bhat
2013-07-15 10:21 ` Viresh Kumar
2013-07-15 11:52 ` Srivatsa S. Bhat
2013-07-15 11:35 ` Rafael J. Wysocki
2013-07-15 11:53 ` Srivatsa S. Bhat
2013-07-16 6:15 ` Viresh Kumar
2013-07-16 8:56 ` Srivatsa S. Bhat
2013-07-16 9:10 ` Viresh Kumar [this message]
2013-07-16 9:29 ` Srivatsa S. Bhat
2013-07-16 9:35 ` Viresh Kumar
2013-07-16 9:54 ` Srivatsa S. Bhat
2013-07-11 22:17 ` [PATCH 8/8] cpufreq: Perform light-weight init/teardown during suspend/resume Srivatsa S. Bhat
2013-07-11 22:25 ` [PATCH 0/8] Cpufreq, cpu hotplug, suspend/resume related fixes Jarzmik, Robert
2013-07-11 22:33 ` Rafael J. Wysocki
2013-07-11 22:23 ` Srivatsa S. Bhat
2013-07-16 15:15 ` Toralf Förster
2013-07-16 21:32 ` Rafael J. Wysocki
2013-07-17 5:03 ` Srivatsa S. Bhat
2013-07-17 15:27 ` Toralf Förster
2013-07-17 15:49 ` Srivatsa S. Bhat
2013-07-21 8:43 ` Srivatsa S. Bhat
2013-07-21 9:40 ` Toralf Förster
2013-07-21 10:38 ` Srivatsa S. Bhat
2013-07-21 12:59 ` Rafael J. Wysocki
2013-07-15 17:38 ` Toralf Förster
2013-07-15 23:25 ` Rafael J. Wysocki
2013-07-13 9:23 ` Toralf Förster
2013-07-13 13:50 ` Toralf Förster
2013-07-15 6:40 ` Srivatsa S. Bhat
2013-07-15 8:27 ` Lan Tianyu
2013-07-15 8:43 ` 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=CAKohponOeqptU2mz4XCFZKoEs5EBTTx0A3Dvev5k-BJiW_2McA@mail.gmail.com \
--to=viresh.kumar@linaro.org \
--cc=dirk.brandewie@gmail.com \
--cc=durgadoss.r@intel.com \
--cc=lantianyu1986@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=rjw@sisk.pl \
--cc=robert.jarzmik@intel.com \
--cc=srivatsa.bhat@linux.vnet.ibm.com \
--cc=stern@rowland.harvard.edu \
--cc=tianyu.lan@intel.com \
--cc=toralf.foerster@gmx.de \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).