All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: Jens Axboe <jens.axboe@oracle.com>
Cc: Alexey Dobriyan <adobriyan@gmail.com>,
	torvalds@osdl.org, Andrew Morton <akpm@linux-foundation.org>,
	linux-kernel@vger.kernel.org
Subject: Re: 2.6.26-rc4: RIP __call_for_each_cic+0x20/0x50
Date: Tue, 27 May 2008 08:18:09 -0700	[thread overview]
Message-ID: <20080527151809.GA14296@linux.vnet.ibm.com> (raw)
In-Reply-To: <20080527133510.GV7712@kernel.dk>

On Tue, May 27, 2008 at 03:35:10PM +0200, Jens Axboe wrote:
> On Tue, May 27 2008, Alexey Dobriyan wrote:
> > On Sat, May 10, 2008 at 02:37:19PM +0400, Alexey Dobriyan wrote:
> > > > > > > @@ -41,8 +41,8 @@ int put_io_context(struct io_context *ioc)
> > > > > > >  		rcu_read_lock();
> > > > > > >  		if (ioc->aic && ioc->aic->dtor)
> > > > > > >  			ioc->aic->dtor(ioc->aic);
> > > > > > > -		rcu_read_unlock();
> > > > > > >  		cfq_dtor(ioc);
> > > > > > > +		rcu_read_unlock();
> > > > > > >  
> > > > > > >  		kmem_cache_free(iocontext_cachep, ioc);
> > > > > > >  		return 1;
> > > > > > 
> > > > > > This helps in sense that 3 times bulk cross-compiles finish to the end.
> > > > > > You'll hear me if another such oops will resurface.
> > > > > 
> > > > > Still looking good?
> > > > 
> > > > Yup!
> > > 
> > > And this with patch in mainline, again with PREEMPT_RCU.
> > 
> > Ping, this happened again with 2.6.26-rc4 and PREEMPT_RCU.
> 
> Worrisome... Paul, would you mind taking a quick look at cfq
> and see if you can detect why breaks with preempt rcu? It's
> clearly a use-after-free symptom, but I don't see how it can
> happen.

Some quick and probably off-the-mark questions...

o	What is the purpose of __call_for_each_cic()?  When called
	from call_for_each_cic(), it is under rcu_read_lock(), as
	required, but it is also called from cfq_free_io_context(),
	which is assigned to the ->dtor and ->exit members of the
	cfq_io_context struct.  What protects calls through these
	members?

	(This is for the ->cic_list field of the cfq_io_context structure.
	One possibility is that the io_context's ->lock member is held,
	but I don't see this.  Not that I looked all that hard...)

	My suggestion would be to simply change all invocations of
	__call_for_each_cic() to instead invoke call_for_each_cic().
	The rcu_read_lock()/rcu_read_unlock() pair is pretty
	lightweight, even in CONFIG_PREEMPT_RCU.

o	When calling cfq_slab_kill(), for example from cfq_exit(),
	what ensures that all previous RCU callbacks have completed?
	
	I suspect that you need an rcu_barrier() at the beginning
	of cfq_slab_kill(), but I could be missing something.

o	Updates to the ->ioc_data field of the cfq_io_context
	seem to be protected by the request_queue ->queue_lock
	field.  This seems very strange to me.  It is OK if every
	cfq_io_context is associated with only one request_queue
	structure -- is this the case?

o	What protects the first rcu_dereference() in cfq_cic_lookup()?
	There needs to be either an enclose rcu_read_lock() on the
	one hand or the ->queue_lock needs to be held.

	(My guess is the latter, given the later rcu_assign_pointer()
	in this same function, but I don't see a lock acquisition
	in the immediate vicinity -- might be further up the function
	call stack, though.)

o	Why is there no grace period associated with the ioc_data?
	For example, what happens to the old value of ->ioc_data
	after the rcu_assign_pointer() in cfq_cic_lookup()?  Readers
	might still be referencing the old version, right?  If so,
	how do we avoid messing them up?

	Or are we somehow leveraging the call_rcu() in cfq_cic_free()?

Any of this at all helpful?

							Thanx, Paul

  reply	other threads:[~2008-05-27 15:18 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-04-27 22:55 2.6.25-$sha1: RIP call_for_each_cic+0x25/0x50 Alexey Dobriyan
2008-04-28 12:01 ` Andrew Morton
2008-04-28 12:04   ` Jens Axboe
2008-04-28 19:55     ` Alexey Dobriyan
2008-04-29  6:21       ` Alexey Dobriyan
2008-04-29  9:06         ` Jens Axboe
2008-04-30 22:12           ` Alexey Dobriyan
2008-05-04 19:08             ` Jens Axboe
2008-05-04 20:15               ` Alexey Dobriyan
2008-05-04 19:25                 ` Jens Axboe
2008-05-04 21:17                   ` Alexey Dobriyan
2008-05-10 10:37                 ` 2.6.25-$sha1: RIP __call_for_each_cic+0x20/0x50 Alexey Dobriyan
2008-05-27  5:27                   ` 2.6.26-rc4: " Alexey Dobriyan
2008-05-27 13:35                     ` Jens Axboe
2008-05-27 15:18                       ` Paul E. McKenney [this message]
2008-05-28 10:07                         ` Jens Axboe
2008-05-28 10:30                           ` Paul E. McKenney
2008-05-28 12:44                             ` Jens Axboe
2008-05-28 13:20                               ` Paul E. McKenney
2008-05-29  4:38                                 ` Paul E. McKenney
2008-05-29  6:26                                   ` Jens Axboe
2008-05-29  6:42                                     ` Jens Axboe
2008-05-29  9:17                                       ` Paul E. McKenney
2008-05-29 10:13                                         ` Jens Axboe
2008-05-29 11:25                                           ` Paul E. McKenney
2008-05-29 11:44                                             ` Jens Axboe
2008-05-29 12:11                                               ` Paul E. McKenney
2008-05-29 12:13                                                 ` Jens Axboe
2008-05-30 11:04                                                   ` Paul E. McKenney
2008-05-30 13:16                                                     ` Paul E. McKenney
2008-05-30 18:34                               ` Alexey Dobriyan
2008-06-04  3:31                                 ` Paul E. McKenney
2008-06-04 18:32                                   ` Linus Torvalds
2008-06-05  4:23                                     ` Paul E. McKenney
2008-06-06 14:49                                   ` Paul E. McKenney
2008-05-28 11:52                           ` Fabio Checconi
2008-05-28 11:58                             ` Jens Axboe

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=20080527151809.GA14296@linux.vnet.ibm.com \
    --to=paulmck@linux.vnet.ibm.com \
    --cc=adobriyan@gmail.com \
    --cc=akpm@linux-foundation.org \
    --cc=jens.axboe@oracle.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=torvalds@osdl.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.