linux-pm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Srivatsa S. Bhat" <srivatsa.bhat@linux.vnet.ibm.com>
To: Oleg Nesterov <oleg@redhat.com>
Cc: tglx@linutronix.de, peterz@infradead.org,
	paulmck@linux.vnet.ibm.com, rusty@rustcorp.com.au,
	mingo@kernel.org, akpm@linux-foundation.org, namhyung@kernel.org,
	vincent.guittot@linaro.org, tj@kernel.org, sbw@mit.edu,
	amit.kucheria@linaro.org, rostedt@goodmis.org, rjw@sisk.pl,
	wangyun@linux.vnet.ibm.com, xiaoguangrong@linux.vnet.ibm.com,
	nikunj@linux.vnet.ibm.com, linux-pm@vger.kernel.org,
	linux-kernel@vger.kernel.org
Subject: Re: [RFC PATCH v4 1/9] CPU hotplug: Provide APIs to prevent CPU offline from atomic context
Date: Thu, 13 Dec 2012 20:56:07 +0530	[thread overview]
Message-ID: <50C9F38F.3020005@linux.vnet.ibm.com> (raw)
In-Reply-To: <50C8D739.6030903@linux.vnet.ibm.com>

On 12/13/2012 12:42 AM, Srivatsa S. Bhat wrote:
> On 12/13/2012 12:18 AM, Oleg Nesterov wrote:
>> On 12/13, Srivatsa S. Bhat wrote:
>>>
>>> On 12/12/2012 11:32 PM, Oleg Nesterov wrote:
>>>> And _perhaps_ get_ can avoid it too?
>>>>
>>>> I didn't really try to think, probably this is not right, but can't
>>>> something like this work?
>>>>
>>>> 	#define XXXX	(1 << 16)
>>>> 	#define MASK	(XXXX -1)
>>>>
>>>> 	void get_online_cpus_atomic(void)
>>>> 	{
>>>> 		preempt_disable();
>>>>
>>>> 		// only for writer
>>>> 		__this_cpu_add(reader_percpu_refcnt, XXXX);
>>>>
>>>> 		if (__this_cpu_read(reader_percpu_refcnt) & MASK) {
>>>> 			__this_cpu_inc(reader_percpu_refcnt);
>>>> 		} else {
>>>> 			smp_wmb();
>>>> 			if (writer_active()) {
>>>> 				...
>>>> 			}
>>>> 		}
>>>>
>>>> 		__this_cpu_dec(reader_percpu_refcnt, XXXX);
>>>> 	}
>>>>
>>>
>>> Sorry, may be I'm too blind to see, but I didn't understand the logic
>>> of how the mask helps us avoid disabling interrupts..
>>
>> Why do we need cli/sti at all? We should prevent the following race:
>>
>> 	- the writer already holds hotplug_rwlock, so get_ must not
>> 	  succeed.
>>
>> 	- the new reader comes, it increments reader_percpu_refcnt,
>> 	  but before it checks writer_active() ...
>>
>> 	- irq handler does get_online_cpus_atomic() and sees
>> 	  reader_nested_percpu() == T, so it simply increments
>> 	  reader_percpu_refcnt and succeeds.
>>
>> OTOH, why do we need to increment reader_percpu_refcnt the counter
>> in advance? To ensure that either we see writer_active() or the
>> writer should see reader_percpu_refcnt != 0 (and that is why they
>> should write/read in reverse order).
>>
>> The code above tries to avoid this race using the lower 16 bits
>> as a "nested-counter", and the upper bits to avoid the race with
>> the writer.
>>
>> 	// only for writer
>> 	__this_cpu_add(reader_percpu_refcnt, XXXX);
>>
>> If irq comes and does get_online_cpus_atomic(), it won't be confused
>> by __this_cpu_add(XXXX), it will check the lower bits and switch to
>> the "slow path".
>>
> 
> This is a very clever scheme indeed! :-) Thanks a lot for explaining
> it in detail.
> 
>>
>> But once again, so far I didn't really try to think. It is quite
>> possible I missed something.
>>
> 
> Even I don't spot anything wrong with it. But I'll give it some more
> thought..

Since an interrupt handler can also run get_online_cpus_atomic(), we
cannot use the __this_cpu_* versions for modifying reader_percpu_refcnt,
right?

To maintain the integrity of the update itself, we will have to use the
this_cpu_* variant, which basically plays spoil-sport on this whole
scheme... :-(

But still, this scheme is better, because the reader doesn't have to spin
on the read_lock() with interrupts disabled. That way, interrupt handlers
that are not hotplug readers can continue to run on this CPU while taking
another CPU offline.

Regards,
Srivatsa S. Bhat


  reply	other threads:[~2012-12-13 15:27 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-12-11 14:03 [RFC PATCH v4 0/9] CPU hotplug: stop_machine()-free CPU hotplug Srivatsa S. Bhat
2012-12-11 14:04 ` [RFC PATCH v4 1/9] CPU hotplug: Provide APIs to prevent CPU offline from atomic context Srivatsa S. Bhat
2012-12-12 17:17   ` Oleg Nesterov
2012-12-12 17:24     ` Oleg Nesterov
2012-12-12 18:11       ` Srivatsa S. Bhat
2012-12-12 18:23         ` Oleg Nesterov
2012-12-12 18:42           ` Srivatsa S. Bhat
2012-12-12 17:53     ` Srivatsa S. Bhat
2012-12-12 18:02       ` Oleg Nesterov
2012-12-12 18:30         ` Srivatsa S. Bhat
2012-12-12 18:48           ` Oleg Nesterov
2012-12-12 19:12             ` Srivatsa S. Bhat
2012-12-13 15:26               ` Srivatsa S. Bhat [this message]
2012-12-13 16:17                 ` Oleg Nesterov
2012-12-13 16:32                   ` Srivatsa S. Bhat
2012-12-14 18:03                     ` Oleg Nesterov
2012-12-18 15:53                       ` Srivatsa S. Bhat
2012-12-18 19:43                         ` Oleg Nesterov
2012-12-18 20:06                           ` Srivatsa S. Bhat
2012-12-19 16:39                             ` Oleg Nesterov
2012-12-19 18:16                               ` Srivatsa S. Bhat
2012-12-19 19:14                                 ` Oleg Nesterov
2012-12-19 19:49                                   ` Srivatsa S. Bhat
2012-12-20 13:42                                     ` Oleg Nesterov
2012-12-20 14:06                                       ` Srivatsa S. Bhat
2012-12-22 20:17                                       ` Srivatsa S. Bhat
2012-12-23 16:42                                         ` Oleg Nesterov
2012-12-24 15:50                                           ` Srivatsa S. Bhat
2012-12-13 16:32                   ` Tejun Heo
2012-12-12 19:36         ` Oleg Nesterov
2012-12-12 19:43           ` Srivatsa S. Bhat
2012-12-12 21:10             ` Oleg Nesterov
2012-12-11 14:04 ` [RFC PATCH v4 2/9] CPU hotplug: Convert preprocessor macros to static inline functions Srivatsa S. Bhat
2012-12-11 14:04 ` [RFC PATCH v4 3/9] smp, cpu hotplug: Fix smp_call_function_*() to prevent CPU offline properly Srivatsa S. Bhat
2012-12-11 14:04 ` [RFC PATCH v4 4/9] smp, cpu hotplug: Fix on_each_cpu_*() " Srivatsa S. Bhat
2012-12-11 14:05 ` [RFC PATCH v4 5/9] sched, cpu hotplug: Use stable online cpus in try_to_wake_up() & select_task_rq() Srivatsa S. Bhat
2012-12-11 14:05 ` [RFC PATCH v4 6/9] kick_process(), cpu-hotplug: Prevent offlining of target CPU properly Srivatsa S. Bhat
2012-12-11 14:05 ` [RFC PATCH v4 7/9] yield_to(), cpu-hotplug: Prevent offlining of other CPUs properly Srivatsa S. Bhat
2012-12-11 14:05 ` [RFC PATCH v4 8/9] kvm, vmx: Add atomic synchronization with CPU Hotplug Srivatsa S. Bhat
2012-12-11 14:05 ` [RFC PATCH v4 9/9] cpu: No more __stop_machine() in _cpu_down() 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=50C9F38F.3020005@linux.vnet.ibm.com \
    --to=srivatsa.bhat@linux.vnet.ibm.com \
    --cc=akpm@linux-foundation.org \
    --cc=amit.kucheria@linaro.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=namhyung@kernel.org \
    --cc=nikunj@linux.vnet.ibm.com \
    --cc=oleg@redhat.com \
    --cc=paulmck@linux.vnet.ibm.com \
    --cc=peterz@infradead.org \
    --cc=rjw@sisk.pl \
    --cc=rostedt@goodmis.org \
    --cc=rusty@rustcorp.com.au \
    --cc=sbw@mit.edu \
    --cc=tglx@linutronix.de \
    --cc=tj@kernel.org \
    --cc=vincent.guittot@linaro.org \
    --cc=wangyun@linux.vnet.ibm.com \
    --cc=xiaoguangrong@linux.vnet.ibm.com \
    /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).