Commit c1530019 authored by Tim Chen's avatar Tim Chen Committed by Linus Torvalds

vfs: Fix absolute RCU path walk failures due to uninitialized seq number

During RCU walk in path_lookupat and path_openat, the rcu lookup
frequently failed if looking up an absolute path, because when root
directory was looked up, seq number was not properly set in nameidata.

We dropped out of RCU walk in nameidata_drop_rcu due to mismatch in
directory entry's seq number.  We reverted to slow path walk that need
to take references.

With the following patch, I saw a 50% increase in an exim mail server
benchmark throughput on a 4-socket Nehalem-EX system.
Signed-off-by: default avatarTim Chen <tim.c.chen@linux.intel.com>
Reviewed-by: default avatarAndi Kleen <ak@linux.intel.com>
Cc: stable@kernel.org (v2.6.38)
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 5853b4f0
...@@ -697,6 +697,7 @@ static __always_inline void set_root_rcu(struct nameidata *nd) ...@@ -697,6 +697,7 @@ static __always_inline void set_root_rcu(struct nameidata *nd)
do { do {
seq = read_seqcount_begin(&fs->seq); seq = read_seqcount_begin(&fs->seq);
nd->root = fs->root; nd->root = fs->root;
nd->seq = __read_seqcount_begin(&nd->root.dentry->d_seq);
} while (read_seqcount_retry(&fs->seq, seq)); } while (read_seqcount_retry(&fs->seq, seq));
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment