All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Paul E. McKenney" <paulmck@us.ibm.com>
To: Ingo Molnar <mingo@elte.hu>
Cc: linux-kernel@vger.kernel.org, Esben Nielsen <simlo@phys.au.dk>
Subject: Re: [patch] Real-Time Preemption, -RT-2.6.12-rc1-V0.7.41-07
Date: Wed, 23 Mar 2005 21:28:54 -0800	[thread overview]
Message-ID: <20050324052854.GA1298@us.ibm.com> (raw)
In-Reply-To: <20050323063317.GB31626@elte.hu>

On Wed, Mar 23, 2005 at 07:33:17AM +0100, Ingo Molnar wrote:
> 
> * Paul E. McKenney <paulmck@us.ibm.com> wrote:
> 
> > +#ifdef CONFIG_PREEMPT_RCU
> > +
> > +void rcu_read_lock(void)
> > +{
> > +	if (current->rcu_read_lock_nesting++ == 0) {
> > +		current->rcu_data = &get_cpu_var(rcu_data);
> > +		atomic_inc(&current->rcu_data->active_readers);
> > +		put_cpu_var(rcu_data);
> > 
> > Need an smp_mb() here for non-x86 CPUs.  Otherwise, the CPU can
> > re-order parts of the critical section to precede the rcu_read_lock().
> > Could precede the put_cpu_var(), but why increase latency?
> 
> ok. It's enough to put a barrier into the else branch here, because the
> atomic op in the main brain is a barrier by itself.

For x86, the atomic op is a barrier, but not for other architectures.
You don't need a barrier in the else branch, because in that case
you are already in an enclosing RCU read-side critical section, so
any bleeding of code will be into this enclosing section, thus still
safe.

> > +void rcu_read_unlock(void)
> > +{
> [...]
> > And need an smp_mb() here, again for non-x86 CPUs.
> 
> ok.
> 
> > Assuming that the memory barriers are added, I can see a bunch of ways
> > for races to extend grace periods, but none so far that result in the
> > fatal too-short grace period.  Since rcu_qsctr_inc() refuses to
> > increment the quiescent-state counter on any CPU that started an RCU
> > read-side critical section that has not yet completed, any long
> > critical section will have a corresponding CPU that will refuse to go
> > through a quiescent state.  And that will prevent the grace period
> > from completing.
> 
> i'm worried about the following scenario: what happens when a task is
> migrated from CPU#1 to CPU#2, while in an RCU read section that it
> acquired on CPU#1, and queues a callback. E.g. d_free() does a
> call_rcu(), to queue the freeing of the dentry.
> 
> That callback will be queued on CPU#2 - while the task still keeps
> current->rcu_data of CPU#1. It also means that CPU#2's read counter did
> _not_ get increased - and a too short grace period may occur.

Let me make sure I understand the sequence of events:

	CPU#1				CPU#2

	task1: rcu_read_lock()

	task1: migrate to CPU#2

					task1: call_rcu()

					task1: rcu_read_unlock()

This sequence will be safe because CPU#1's active_readers field will
be non-zero throughout, so that CPU#1 will refuse to record any
quiescent state from the time that task1 does the rcu_read_lock()
on CPU#1 until the time that it does the rcu_read_unlock() on CPU#2.

Now, it is true that CPU#2 might record a quiescent state during this
time, but this will have no effect because -all- CPUs must pass through
a quiescent state before any callbacks will be invoked.  Since CPU#1
is refusing to record a quiescent state, grace periods will be blocked
for the full extent of task 1's RCU read-side critical section.

Or am I misunderstanding your scenario?  Or, for that matter, your code?

> it seems to me that that only safe method is to pick an 'RCU CPU' when
> first entering the read section, and then sticking to it, no matter
> where the task gets migrated to. Or to 'migrate' the +1 read count from
> one CPU to the other, within the scheduler.

This would work too, but I don't believe it is necessary given what
you are already doing.

> the 'migrate read count' solution seems more promising, as it would keep
> other parts of the RCU code unchanged. [ But it seems to break the nice
> 'flip pointers' method you found to force a grace period. If a 'read
> section' can migrate from one CPU to another then it can migrate back as
> well, at which point it cannot have the 'old' pointer. Maybe it would
> still work better than no flip pointers. ]

Well, I do believe that suppressing migration of tasks during RCU read-side
critical sections would simplify the flip-pointers/counters code.  But
that is easy to say in advance of actually producing this code.  ;-)

							Thanx, Paul

  parent reply	other threads:[~2005-03-24  5:29 UTC|newest]

Thread overview: 92+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-03-19 19:16 [patch] Real-Time Preemption, -RT-2.6.12-rc1-V0.7.41-00 Ingo Molnar
2005-03-20  0:24 ` Lee Revell
2005-03-21 15:42   ` K.R. Foley
2005-03-20  1:33 ` Lee Revell
2005-03-20  1:50   ` K.R. Foley
2005-03-20  4:32     ` Lee Revell
2005-03-20 22:40       ` Paul E. McKenney
2005-03-20 17:45 ` Paul E. McKenney
2005-03-21  8:53   ` Ingo Molnar
2005-03-21  9:01     ` Ingo Molnar
2005-03-21  9:06       ` [patch] Real-Time Preemption, -RT-2.6.12-rc1-V0.7.41-01 Ingo Molnar
2005-03-21 23:10         ` Magnus Naeslund(t)
2005-03-22  5:40           ` Paul E. McKenney
2005-03-22  8:50             ` Ingo Molnar
2005-03-22 13:56             ` Magnus Naeslund(t)
2005-03-23  5:46               ` Paul E. McKenney
2005-03-22  5:43         ` Paul E. McKenney
2005-03-22  7:24           ` Ingo Molnar
2005-03-22  9:23             ` Ingo Molnar
2005-03-22  9:32               ` Ingo Molnar
2005-03-22 10:01                 ` [patch] Real-Time Preemption, -RT-2.6.12-rc1-V0.7.41-05 Ingo Molnar
2005-03-22 11:28                   ` [patch] Real-Time Preemption, -RT-2.6.12-rc1-V0.7.41-07 Ingo Molnar
2005-03-22 15:06                     ` K.R. Foley
2005-03-22 18:05                     ` Magnus Naeslund(t)
2005-03-23  6:16                     ` Paul E. McKenney
2005-03-23  6:33                       ` Ingo Molnar
2005-03-23  6:37                         ` Ingo Molnar
2005-03-24  6:06                           ` Paul E. McKenney
2005-03-23  7:16                         ` Ingo Molnar
2005-03-23  7:54                           ` Steven Rostedt
2005-03-23  7:58                             ` Ingo Molnar
2005-03-23  8:29                           ` Peter Zijlstra
2005-03-23  9:03                             ` Ingo Molnar
2005-03-24  6:45                               ` Paul E. McKenney
2005-03-23 21:46                           ` Ingo Molnar
2005-03-24  6:59                             ` Paul E. McKenney
2005-03-24  6:38                           ` Paul E. McKenney
2005-03-23  9:38                         ` Herbert Xu
2005-03-23  9:49                           ` Herbert Xu
2005-03-24  6:52                             ` Paul E. McKenney
2005-03-24  5:28                         ` Paul E. McKenney [this message]
2005-03-24  5:34                           ` Ingo Molnar
2005-03-24  7:46                             ` Paul E. McKenney
2005-03-24  8:31                             ` Steven Rostedt
2005-03-24  8:47                               ` Steven Rostedt
2005-03-24 10:45                                 ` Ingo Molnar
2005-03-24 11:39                                 ` Ingo Molnar
2005-03-24 14:33                                   ` Steven Rostedt
2005-03-24 17:51                                     ` Ingo Molnar
2005-03-24 18:17                                     ` Ingo Molnar
2005-03-24 23:05                                   ` Esben Nielsen
2005-03-25  6:19                                     ` Ingo Molnar
2005-03-26 16:31                                       ` Steven Rostedt
2005-03-26 19:11                                         ` Ingo Molnar
2005-03-26 16:04                                     ` Steven Rostedt
2005-03-30  6:31                                       ` Steven Rostedt
2005-03-30  6:50                                         ` Ingo Molnar
2005-03-30 16:46                                           ` Steven Rostedt
2005-03-30 19:44                                             ` Esben Nielsen
2005-03-30 19:56                                               ` Steven Rostedt
2005-03-30 21:39                                                 ` Steven Rostedt
2005-03-30 21:43                                                   ` Steven Rostedt
2005-03-31 11:03                                                   ` Ingo Molnar
2005-03-31 12:03                                                     ` Esben Nielsen
2005-03-31 12:14                                                       ` Steven Rostedt
2005-03-31 13:33                                                         ` Ingo Molnar
2005-03-31 12:22                                                     ` Steven Rostedt
2005-03-31 12:36                                                     ` Steven Rostedt
2005-03-31 12:58                                                       ` Steven Rostedt
2005-03-31 13:28                                                         ` Ingo Molnar
2005-03-31 12:49                                                     ` Steven Rostedt
2005-03-31 14:10                                                       ` Ingo Molnar
2005-03-31 17:41                                                         ` Steven Rostedt
2005-03-31 17:49                                                           ` Ingo Molnar
2005-03-31 18:17                                                             ` Gene Heskett
2005-03-31 21:00                                                               ` [patch] Real-Time Preemption, -RT-2.6.12-rc1-V0.7.41-07 (update) Gene Heskett
2005-03-31 20:22                                                             ` [patch] Real-Time Preemption, -RT-2.6.12-rc1-V0.7.41-07 Steven Rostedt
2005-04-01  0:59                                                             ` Steven Rostedt
2005-04-01  4:43                                                               ` Ingo Molnar
2005-04-01  5:13                                                                 ` Steven Rostedt
2005-04-01  5:19                                                                   ` Ingo Molnar
2005-04-01 12:27                                                                     ` Steven Rostedt
2005-04-07 21:21                                                                       ` Steven Rostedt
2005-04-10 10:31                                                                         ` Ingo Molnar
2005-04-10 15:06                                                                           ` Steven Rostedt
2005-03-24 10:42                               ` Ingo Molnar
2005-03-23  9:40                       ` Herbert Xu
2005-03-23  9:48                         ` Herbert Xu
2005-03-23  5:23                   ` [patch] Real-Time Preemption, -RT-2.6.12-rc1-V0.7.41-05 Paul E. McKenney
2005-03-23  4:48                 ` [patch] Real-Time Preemption, -RT-2.6.12-rc1-V0.7.41-01 Paul E. McKenney
2005-03-23  6:21                   ` Ingo Molnar
2005-03-22  8:59           ` Ingo Molnar

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=20050324052854.GA1298@us.ibm.com \
    --to=paulmck@us.ibm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=simlo@phys.au.dk \
    /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.