All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: Al Viro <viro@ZenIV.linux.org.uk>
Cc: Linus Torvalds <torvalds@linux-foundation.org>,
	linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org
Subject: Re: [PATCH][RFC] %pd - for printing dentry name
Date: Mon, 1 Feb 2010 22:53:41 -0800	[thread overview]
Message-ID: <20100202065341.GF6292@linux.vnet.ibm.com> (raw)
In-Reply-To: <20100201231847.GC12882@ZenIV.linux.org.uk>

On Mon, Feb 01, 2010 at 11:18:47PM +0000, Al Viro wrote:
> On Mon, Feb 01, 2010 at 02:37:32PM -0800, Linus Torvalds wrote:
> 
> > > * don't use %pd under dentry->d_lock, use dentry->d_name.name instead; in
> > > that case it *is* safe.  Incidentally, ->d_lock isn't held a lot.
> > 
> > I realize we can just call it a rule, and yes, d_lock is held much less 
> > than something like console_lock etc that we've had ABBA issues with, but 
> > still..
> 
> > Quite frankly, I'd _much_ rather see something like just always freeing 
> > the dentry names (when they aren't inlined) using RCU. The VFS layer quite 
> > possibly would want to do that anyway at some point (eg Nick's VFS 
> > scalability patches), and then we could make it just a RCU read-lock or 
> > whatever (interrupt disable, what-not) instead.
> > 
> > And I'm much happier with printk doing that kind of thing, and wouldn't 
> > have issues with that kind of much weaker locking.
> 
> Ehh...  RCU will save you from stepping on freed memory, but it still will
> leave the joy of half-updated string with length out of sync with it, etc.
> We probably can get away with that, but we'll have to be a lot more careful
> with the order of updating these suckers in d_move_locked et.al.
> 
> I don't know...  Note that if we end up adding something extra to struct
> dentry, we might as well just add *another* spinlock, taken only under
> ->d_lock and only in two places in dcache.c that change d_name.  That kind
> of thing is trivial to enforce (just grep over the tree once in a while)
> and if it shares the cacheline with d_lock, we shouldn't get any real overhead
> in d_move()/d_materialise_unique().  I'm not particulary fond of that variant,
> but it's at least guaranteed to be devoid of subtleties.
> 
> If RCU folks can come up with a sane suggestions that would be robust and
> wouldn't bloat dentry - sure, I'm all for it.  If not...

Here is an approximation that might inspire someone to come up with a
real solution.

One approach would be to store the name length with the name, so that
struct qstr loses the "len" field, and so that its "name" field points
to a struct that has a "len" field followed by an array of const
unsigned char.  That way, the name and length are closely associated.
When you pick up a struct qstr's "name" pointer, you are guaranteed to
get a length that matches the name.

Unfortunately:

o	In theory, this leaves the length of the dentry unchanged, but
	alignment is a problem on 64-bit systems.  Also, the long names
	gain an extra four bytes.

o	If you get a pointer to the d_iname small-name field, rename
	might still change the name out from under you.  This could in
	theory be fixed by refusing to re-use the d_iname field until
	an RCU grace period had elapsed (using an external structure
	instead).  In practice, not sure if this is really a reasonable
	approach.

Thoughts?

							Thanx, Paul

  parent reply	other threads:[~2010-02-02  6:53 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-02-01 22:25 [PATCH][RFC] %pd - for printing dentry name Al Viro
2010-02-01 22:34 ` Al Viro
2010-02-01 22:37 ` Linus Torvalds
2010-02-01 23:18   ` Al Viro
2010-02-02  1:06     ` Al Viro
2010-02-02  5:55       ` Eric W. Biederman
2010-02-02 17:01         ` Al Viro
2010-02-02 18:10           ` Olivier Galibert
2010-02-02 19:19           ` Eric W. Biederman
2010-02-03  3:04             ` Al Viro
2010-02-04  4:53               ` Al Viro
2010-02-02  4:22     ` Linus Torvalds
2010-02-02  5:00       ` Al Viro
2010-02-02  6:36         ` Nick Piggin
2010-02-04  6:02           ` Al Viro
2010-02-04  7:40             ` Nick Piggin
2010-02-02  6:53     ` Paul E. McKenney [this message]
2010-02-02  7:09       ` Al Viro
2010-02-02 13:32         ` Matthew Wilcox
2010-02-02 15:56           ` Linus Torvalds
2010-02-02 16:13             ` Matthew Wilcox
2010-02-02 16:43           ` Al Viro
2010-02-03 10:52         ` Paul E. McKenney
2010-02-03  2:49       ` Paul E. McKenney
2010-02-04 15:29         ` Linus Torvalds
2010-02-04 16:02           ` Paul E. McKenney
2010-02-04 17:13             ` Linus Torvalds
2010-02-04 17:36               ` Al Viro
2010-02-07 16:34                 ` Paul E. McKenney
2010-02-01 22:45 ` Joe Perches

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=20100202065341.GF6292@linux.vnet.ibm.com \
    --to=paulmck@linux.vnet.ibm.com \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=torvalds@linux-foundation.org \
    --cc=viro@ZenIV.linux.org.uk \
    /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.