diff options
author | Nick Piggin <npiggin@kernel.dk> | 2010-08-17 14:37:33 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2010-08-18 08:35:46 -0400 |
commit | 2a4419b5b2a77f3f4537c14f7ad7df95770655dd (patch) | |
tree | ad66519a92b995920ecada788e4a08e265747545 /fs/exec.c | |
parent | 44672e4fbd40e2dda8bbce7d0f71d24dbfc7e00e (diff) |
fs: fs_struct rwlock to spinlock
fs: fs_struct rwlock to spinlock
struct fs_struct.lock is an rwlock with the read-side used to protect root and
pwd members while taking references to them. Taking a reference to a path
typically requires just 2 atomic ops, so the critical section is very small.
Parallel read-side operations would have cacheline contention on the lock, the
dentry, and the vfsmount cachelines, so the rwlock is unlikely to ever give a
real parallelism increase.
Replace it with a spinlock to avoid one or two atomic operations in typical
path lookup fastpath.
Signed-off-by: Nick Piggin <npiggin@kernel.dk>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/exec.c')
-rw-r--r-- | fs/exec.c | 4 |
1 files changed, 2 insertions, 2 deletions
@@ -1117,7 +1117,7 @@ int check_unsafe_exec(struct linux_binprm *bprm) | |||
1117 | bprm->unsafe = tracehook_unsafe_exec(p); | 1117 | bprm->unsafe = tracehook_unsafe_exec(p); |
1118 | 1118 | ||
1119 | n_fs = 1; | 1119 | n_fs = 1; |
1120 | write_lock(&p->fs->lock); | 1120 | spin_lock(&p->fs->lock); |
1121 | rcu_read_lock(); | 1121 | rcu_read_lock(); |
1122 | for (t = next_thread(p); t != p; t = next_thread(t)) { | 1122 | for (t = next_thread(p); t != p; t = next_thread(t)) { |
1123 | if (t->fs == p->fs) | 1123 | if (t->fs == p->fs) |
@@ -1134,7 +1134,7 @@ int check_unsafe_exec(struct linux_binprm *bprm) | |||
1134 | res = 1; | 1134 | res = 1; |
1135 | } | 1135 | } |
1136 | } | 1136 | } |
1137 | write_unlock(&p->fs->lock); | 1137 | spin_unlock(&p->fs->lock); |
1138 | 1138 | ||
1139 | return res; | 1139 | return res; |
1140 | } | 1140 | } |