diff options
| author | Livio Soares <livio@eecg.toronto.edu> | 2007-12-18 09:21:13 -0500 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2007-12-18 09:21:13 -0500 |
| commit | c7af77b584b02d3e321b00203a618a9c93782121 (patch) | |
| tree | e7a8d5995e34065aa1bd610cb92684c5e5856119 | |
| parent | 051a1d1afa47206e23ae03f781c6795ce870e3d5 (diff) | |
sched: mark rwsem functions as __sched for wchan/profiling
This following commit
http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=fdf8cb0909b531f9ae8f9b9d7e4eb35ba3505f07
un-inlined a low-level rwsem function, but did not mark it as __sched.
The result is that it now shows up as thread wchan (which also affects
/proc/profile stats). The following simple patch fixes this by properly
marking rwsem_down_failed_common() as a __sched function.
Also in this patch, which is up for discussion, marks down_read() and
down_write() proper as __sched. For profiling, it is pretty much
useless to know that a semaphore is beig help - it is necessary to know
_which_ one. By going up another frame on the stack, the information
becomes much more useful.
In summary, the below change to lib/rwsem.c should be applied; the
changes to kernel/rwsem.c could be applied if other kernel hackers agree
with my proposal that down_read()/down_write() in the profile is not
enough.
[ akpm@linux-foundation.org: build fix ]
Signed-off-by: Livio Soares <livio@eecg.toronto.edu>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
| -rw-r--r-- | kernel/rwsem.c | 5 | ||||
| -rw-r--r-- | lib/rwsem.c | 2 |
2 files changed, 4 insertions, 3 deletions
diff --git a/kernel/rwsem.c b/kernel/rwsem.c index 1ec620c03064..cae050b05f5e 100644 --- a/kernel/rwsem.c +++ b/kernel/rwsem.c | |||
| @@ -6,6 +6,7 @@ | |||
| 6 | 6 | ||
| 7 | #include <linux/types.h> | 7 | #include <linux/types.h> |
| 8 | #include <linux/kernel.h> | 8 | #include <linux/kernel.h> |
| 9 | #include <linux/sched.h> | ||
| 9 | #include <linux/module.h> | 10 | #include <linux/module.h> |
| 10 | #include <linux/rwsem.h> | 11 | #include <linux/rwsem.h> |
| 11 | 12 | ||
| @@ -15,7 +16,7 @@ | |||
| 15 | /* | 16 | /* |
| 16 | * lock for reading | 17 | * lock for reading |
| 17 | */ | 18 | */ |
| 18 | void down_read(struct rw_semaphore *sem) | 19 | void __sched down_read(struct rw_semaphore *sem) |
| 19 | { | 20 | { |
| 20 | might_sleep(); | 21 | might_sleep(); |
| 21 | rwsem_acquire_read(&sem->dep_map, 0, 0, _RET_IP_); | 22 | rwsem_acquire_read(&sem->dep_map, 0, 0, _RET_IP_); |
| @@ -42,7 +43,7 @@ EXPORT_SYMBOL(down_read_trylock); | |||
| 42 | /* | 43 | /* |
| 43 | * lock for writing | 44 | * lock for writing |
| 44 | */ | 45 | */ |
| 45 | void down_write(struct rw_semaphore *sem) | 46 | void __sched down_write(struct rw_semaphore *sem) |
| 46 | { | 47 | { |
| 47 | might_sleep(); | 48 | might_sleep(); |
| 48 | rwsem_acquire(&sem->dep_map, 0, 0, _RET_IP_); | 49 | rwsem_acquire(&sem->dep_map, 0, 0, _RET_IP_); |
diff --git a/lib/rwsem.c b/lib/rwsem.c index cdb4e3d05607..7d02700a4b0e 100644 --- a/lib/rwsem.c +++ b/lib/rwsem.c | |||
| @@ -146,7 +146,7 @@ __rwsem_do_wake(struct rw_semaphore *sem, int downgrading) | |||
| 146 | /* | 146 | /* |
| 147 | * wait for a lock to be granted | 147 | * wait for a lock to be granted |
| 148 | */ | 148 | */ |
| 149 | static struct rw_semaphore * | 149 | static struct rw_semaphore __sched * |
| 150 | rwsem_down_failed_common(struct rw_semaphore *sem, | 150 | rwsem_down_failed_common(struct rw_semaphore *sem, |
| 151 | struct rwsem_waiter *waiter, signed long adjustment) | 151 | struct rwsem_waiter *waiter, signed long adjustment) |
| 152 | { | 152 | { |
