diff options
| author | Nick Piggin <[email protected]> | 2010-08-17 18:37:33 +0000 |
|---|---|---|
| committer | Al Viro <[email protected]> | 2010-08-18 12:35:46 +0000 |
| commit | 2a4419b5b2a77f3f4537c14f7ad7df95770655dd (patch) | |
| tree | ad66519a92b995920ecada788e4a08e265747545 /fs/exec.c | |
| parent | apparmor: use task path helpers (diff) | |
| download | kernel-2a4419b5b2a77f3f4537c14f7ad7df95770655dd.tar.gz kernel-2a4419b5b2a77f3f4537c14f7ad7df95770655dd.zip | |
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 <[email protected]>
Signed-off-by: Al Viro <[email protected]>
Diffstat (limited to 'fs/exec.c')
| -rw-r--r-- | fs/exec.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/fs/exec.c b/fs/exec.c index 7761837e4500..5adab2c93eca 100644 --- a/fs/exec.c +++ b/fs/exec.c @@ -1117,7 +1117,7 @@ int check_unsafe_exec(struct linux_binprm *bprm) bprm->unsafe = tracehook_unsafe_exec(p); n_fs = 1; - write_lock(&p->fs->lock); + spin_lock(&p->fs->lock); rcu_read_lock(); for (t = next_thread(p); t != p; t = next_thread(t)) { if (t->fs == p->fs) @@ -1134,7 +1134,7 @@ int check_unsafe_exec(struct linux_binprm *bprm) res = 1; } } - write_unlock(&p->fs->lock); + spin_unlock(&p->fs->lock); return res; } |
