diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-06-22 12:23:15 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-06-22 12:23:15 -0700 |
commit | 55d8538498f62ec72b5ba67aa386c7726f630475 (patch) | |
tree | 15ebcc7a51fdf1ff2bf76ade337a637c0990055d /fs/select.c | |
parent | 481c5346d0981940ee63037eb53e4e37b0735c10 (diff) | |
download | lwn-55d8538498f62ec72b5ba67aa386c7726f630475.tar.gz lwn-55d8538498f62ec72b5ba67aa386c7726f630475.zip |
Fix performance regression on lmbench select benchmark
Christian Borntraeger reported that reinstating cond_resched() with
CONFIG_PREEMPT caused a performance regression on lmbench:
For example select file 500:
23 microseconds
32 microseconds
and that's really because we totally unnecessarily do the cond_resched()
in the innermost loop of select(), which is just silly.
This moves it out from the innermost loop (which only ever loops ove the
bits in a single "unsigned long" anyway), which makes the performance
regression go away.
Reported-and-tested-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/select.c')
-rw-r--r-- | fs/select.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/fs/select.c b/fs/select.c index 8dda969614a9..da0e88201c3a 100644 --- a/fs/select.c +++ b/fs/select.c @@ -249,7 +249,6 @@ int do_select(int n, fd_set_bits *fds, s64 *timeout) retval++; } } - cond_resched(); } if (res_in) *rinp = res_in; @@ -257,6 +256,7 @@ int do_select(int n, fd_set_bits *fds, s64 *timeout) *routp = res_out; if (res_ex) *rexp = res_ex; + cond_resched(); } wait = NULL; if (retval || !*timeout || signal_pending(current)) |