diff options
author | Paul Jackson <pj@sgi.com> | 2005-09-12 04:30:30 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-09-12 09:16:27 -0700 |
commit | b3426599af9524104be6938bcb1fcaab314781c7 (patch) | |
tree | c6d354bddb5b8cd298d139b60a9257ebd8323b90 /kernel/cpuset.c | |
parent | f24ec7f6c6278c0ea4c00efe96d50b1e66796c44 (diff) | |
download | lwn-b3426599af9524104be6938bcb1fcaab314781c7.tar.gz lwn-b3426599af9524104be6938bcb1fcaab314781c7.zip |
[PATCH] cpuset semaphore depth check optimize
Optimize the deadlock avoidance check on the global cpuset
semaphore cpuset_sem. Instead of adding a depth counter to the
task struct of each task, rather just two words are enough, one
to store the depth and the other the current cpuset_sem holder.
Thanks to Nikita Danilov for the idea.
Signed-off-by: Paul Jackson <pj@sgi.com>
[ We may want to change this further, but at least it's now
a totally internal decision to the cpusets code ]
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'kernel/cpuset.c')
-rw-r--r-- | kernel/cpuset.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/kernel/cpuset.c b/kernel/cpuset.c index 407b5f0a8c8e..79866bc6b3a1 100644 --- a/kernel/cpuset.c +++ b/kernel/cpuset.c @@ -180,6 +180,8 @@ static struct super_block *cpuset_sb = NULL; */ static DECLARE_MUTEX(cpuset_sem); +static struct task_struct *cpuset_sem_owner; +static int cpuset_sem_depth; /* * The global cpuset semaphore cpuset_sem can be needed by the @@ -200,16 +202,19 @@ static DECLARE_MUTEX(cpuset_sem); static inline void cpuset_down(struct semaphore *psem) { - if (current->cpuset_sem_nest_depth == 0) + if (cpuset_sem_owner != current) { down(psem); - current->cpuset_sem_nest_depth++; + cpuset_sem_owner = current; + } + cpuset_sem_depth++; } static inline void cpuset_up(struct semaphore *psem) { - current->cpuset_sem_nest_depth--; - if (current->cpuset_sem_nest_depth == 0) + if (--cpuset_sem_depth == 0) { + cpuset_sem_owner = NULL; up(psem); + } } /* |