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: 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:26:52 +0530	[thread overview]
Message-ID: <51E50AD4.6040208@linux.vnet.ibm.com> (raw)
In-Reply-To: <CAKohpo=tfd_CXDBkbE23=UdEF99ZK-17NM_cvpGJ_e9wXGzsZQ@mail.gmail.com>

On 07/16/2013 11:45 AM, Viresh Kumar wrote:
> On 15 July 2013 15:35, Srivatsa S. Bhat
> <srivatsa.bhat@linux.vnet.ibm.com> wrote:
>> Actually even I was wondering about this while writing the patch and
>> I even tested shutdown after multiple suspend/resume cycles, to verify that
>> the refcount is messed up. But surprisingly, things worked just fine.
>>
>> Logically there should've been a refcount mismatch and things should have
>> failed, but everything worked fine during my tests. Apart from suspend/resume
>> and shutdown tests, I even tried mixing a few regular CPU hotplug operations
>> (echo 0/1 to sysfs online files), but nothing stood out.
>>
>> Sorry, I forgot to document this in the patch. Either the patch is wrong
>> or something else is silently fixing this up. Not sure what is the exact
>> situation.
> 
> 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.

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 :)
 
> And so things work as expected. That's why your code isn't breaking anything I
> believe.
> 

Thanks a lot for the code inspection and your detailed analysis!

> But can no. of cpus change inbetween suspend/resume? Then count would be
> tricky as we are using the same policy structure.
> 

No, number of CPUs won't change in between suspend/resume. Even if somebody
tried that, that would be an eccentric case and we won't handle that.
Besides, *many more* things will break than just cpufreq, if somebody actually
tries that out!

Regards,
Srivatsa S. Bhat


  reply	other threads:[~2013-07-16  9:00 UTC|newest]

Thread overview: 53+ 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 [this message]
2013-07-16  9:10           ` Viresh Kumar
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:25   ` 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  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=51E50AD4.6040208@linux.vnet.ibm.com \
    --to=srivatsa.bhat@linux.vnet.ibm.com \
    --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=stern@rowland.harvard.edu \
    --cc=tianyu.lan@intel.com \
    --cc=toralf.foerster@gmx.de \
    --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.