public inbox for linux-kernel@vger.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: Tue, 22 Mar 2005 22:16:01 -0800	[thread overview]
Message-ID: <20050323061601.GE1294@us.ibm.com> (raw)
In-Reply-To: <20050322112856.GA25129@elte.hu>

On Tue, Mar 22, 2005 at 12:28:56PM +0100, Ingo Molnar wrote:
> 
> * Ingo Molnar <mingo@elte.hu> wrote:
> 
> > 
> > * Ingo Molnar <mingo@elte.hu> wrote:
> > 
> > > hm, another thing: i think call_rcu() needs to take the read-lock.
> > > Right now it assumes that it has the data structure private, but
> > > that's only statistically true on PREEMPT_RT: another CPU may have
> > > this CPU's RCU control structure in use. So IRQs-off (or preempt-off)
> > > is not a guarantee to have the data structure, the read lock has to be
> > > taken.
> > 
> > i've reworked the code to use the read-lock to access the per-CPU data
> > RCU structures, and it boots with 2 CPUs and PREEMPT_RT now. The
> > -40-05 patch can be downloaded from the usual place:
> 
> bah, it's leaking dentries at a massive scale. I'm giving up on this
> variant for the time being and have gone towards a much simpler variant,
> implemented in the -40-07 patch at:
> 
>    http://redhat.com/~mingo/realtime-preempt/
> 
> it's along the lines of Esben's patch, but with the conceptual bug fixed
> via the rcu_read_lock_nesting code from Paul's patch.

Fair enough!

> there's a new CONFIG_PREEMPT_RCU option. (always-enabled on PREEMPT_RT)
> It builds & boots fine on my 2-way box, doesnt leak dentries and
> networking is up and running.
> 
> first question, (ignoring the grace priod problem) is this a correct RCU
> implementation? The critical scenario is when a task gets migrated to
> another CPU, so that current->rcu_data is that of another CPU's. That is
> why ->active_readers is an atomic variable now. [ Note that while
> ->active_readers may be decreased from another CPU, it's always
> increased on the current CPU, so when a preemption-off section
> determines that a quiescent state has passed that determination stays
> true up until it enables preemption again. This is needed for correct
> callback processing. ]

+#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?

+	}
+}
+EXPORT_SYMBOL(rcu_read_lock);
+
+void rcu_read_unlock(void)
+{
+	int cpu;
+
+	if (--current->rcu_read_lock_nesting == 0) {
+		atomic_dec(&current->rcu_data->active_readers);
+		/*
+		 * Check whether we have reached quiescent state.
+		 * Note! This is only for the local CPU, not for
+		 * current->rcu_data's CPU [which typically is the
+		 * current CPU, but may also be another CPU].
+		 */
+		cpu = get_cpu();

And need an smp_mb() here, again for non-x86 CPUs.

+		rcu_qsctr_inc(cpu);
+		put_cpu();
+	}
+}
+EXPORT_SYMBOL(rcu_read_unlock);
+
+#endif

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.

> this implementation has the 'long grace periods' problem. Starvation
> should only be possible if a system has zero idle time for a long period
> of time, and even then it needs the permanent starvation of
> involuntarily preempted rcu-read-locked tasks. Is there any way to force
> such a situation? (which would turn this into a DoS)

If the sum of all the RCU read-side critical sections consumed much more
than 1/N of the CPU time, where N is the number of CPUs, then you would
see infinite grace periods just by statistics.  But my guess is that
you would be in the tens of CPUs before hitting this.  That said, I have
never measured this, since there has not been a reason to care.

> [ in OOM situations we could force quiescent state by walking all tasks
> and checking for nonzero ->rcu_read_lock_nesting values and priority
> boosting affected tasks (to RT prio 99 or RT prio 1), which they'd
> automatically drop when they decrease their rcu_read_lock_nesting
> counter to zero. ]

Makes sense to me.  If there are too-long RCU read-side critical sections,
they could cause other tasks to miss deadlines once boosted.
Of course, if RCU read-side critical sections are all short enough,
you would already just be disabling preemption across all of them.  ;-)

						Thanx, Paul

  parent reply	other threads:[~2005-03-23  6:19 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 [this message]
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
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=20050323061601.GE1294@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox