All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ingo Molnar <mingo@elte.hu>
To: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
Cc: Lai Jiangshan <laijs@cn.fujitsu.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Dipankar Sarma <dipankar@in.ibm.com>,
	Thomas Gleixner <tglx@linutronix.de>
Subject: Re: [PATCH] rcupdate: fix bug of rcu_barrier*()
Date: Mon, 20 Oct 2008 15:41:09 +0200	[thread overview]
Message-ID: <20081020134109.GC32363@elte.hu> (raw)
In-Reply-To: <20081017145854.GD6706@linux.vnet.ibm.com>


* Paul E. McKenney <paulmck@linux.vnet.ibm.com> wrote:

> On Fri, Oct 17, 2008 at 02:40:30PM +0800, Lai Jiangshan wrote:
> > 
> > current rcu_barrier_bh() is like this:
> > 
> > void rcu_barrier_bh(void)
> > {
> > 	BUG_ON(in_interrupt());
> > 	/* Take cpucontrol mutex to protect against CPU hotplug */
> > 	mutex_lock(&rcu_barrier_mutex);
> > 	init_completion(&rcu_barrier_completion);
> > 	atomic_set(&rcu_barrier_cpu_count, 0);
> > 	/*
> > 	 * The queueing of callbacks in all CPUs must be atomic with
> > 	 * respect to RCU, otherwise one CPU may queue a callback,
> > 	 * wait for a grace period, decrement barrier count and call
> > 	 * complete(), while other CPUs have not yet queued anything.
> > 	 * So, we need to make sure that grace periods cannot complete
> > 	 * until all the callbacks are queued.
> > 	 */
> > 	rcu_read_lock();
> > 	on_each_cpu(rcu_barrier_func, (void *)RCU_BARRIER_BH, 1);
> > 	rcu_read_unlock();
> > 	wait_for_completion(&rcu_barrier_completion);
> > 	mutex_unlock(&rcu_barrier_mutex);
> > }
> > 
> > The inconsistency of the code and the comments show a bug here.
> > rcu_read_lock() cannot make sure that "grace periods for RCU_BH
> > cannot complete until all the callbacks are queued".
> > it only make sure that race periods for RCU cannot complete
> > until all the callbacks are queued.
> > 
> > so we must use rcu_read_lock_bh() for rcu_barrier_bh().
> > like this:
> > 
> > void rcu_barrier_bh(void)
> > {
> > 	......
> > 	rcu_read_lock_bh();
> > 	on_each_cpu(rcu_barrier_func, (void *)RCU_BARRIER_BH, 1);
> > 	rcu_read_unlock_bh();
> > 	......
> > }
> > 
> > and also rcu_barrier() rcu_barrier_sched() are implemented like this.
> > it will bring a lot of duplicate code. My patch uses another way to
> > fix this bug, please see the comment of my patch.
> > Thank Paul E. McKenney for he rewrote the comment.
> 
> Still looks good to me!  Thank you again, Jiangshan, for finding and
> fixing this one!!!
> 
> 							Thanx, Paul
> 
> > Signed-off-by: Lai Jiangshan <laijs@cn.fujitsu.com>
> > Reviewed-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>

applied to tip/core/urgent, thanks!

	Ingo

      reply	other threads:[~2008-10-20 13:41 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-10-17  6:40 [PATCH] rcupdate: fix bug of rcu_barrier*() Lai Jiangshan
2008-10-17 14:58 ` Paul E. McKenney
2008-10-20 13:41   ` Ingo Molnar [this message]

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=20081020134109.GC32363@elte.hu \
    --to=mingo@elte.hu \
    --cc=dipankar@in.ibm.com \
    --cc=laijs@cn.fujitsu.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=paulmck@linux.vnet.ibm.com \
    --cc=tglx@linutronix.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 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.