Add unlikely() to various core select() and poll() functions.
Since these functions show up as X server related during profiling
(which is quite obvious), I thought that adding some unlikely()
shouldn't hurt...
I also moved some error code setting into error path (please yell if
I shouldn't do that).
Compile-tested and run-tested on 2.6.18-rc4-mm1.
Signed-off-by: Andreas Mohr <[email protected]>
--- linux-2.6.18-rc4-mm1.orig/fs/select.c 2006-08-22 21:13:24.000000000 +0200
+++ linux-2.6.18-rc4-mm1/fs/select.c 2006-08-23 19:28:46.000000000 +0200
@@ -104,7 +104,7 @@
struct poll_table_page *new_table;
new_table = (struct poll_table_page *) __get_free_page(GFP_KERNEL);
- if (!new_table) {
+ if (unlikely(!new_table)) {
p->error = -ENOMEM;
__set_current_state(TASK_RUNNING);
return NULL;
@@ -317,9 +317,10 @@
/* Allocate small arguments on the stack to save memory and be faster */
long stack_fds[SELECT_STACK_ALLOC/sizeof(long)];
- ret = -EINVAL;
- if (n < 0)
+ if (unlikely(n < 0)) {
+ ret = -EINVAL;
goto out_nofds;
+ }
/* max_fdset can increase, so grab it once to avoid race */
rcu_read_lock();
@@ -338,10 +339,11 @@
bits = stack_fds;
if (size > sizeof(stack_fds) / 6) {
/* Not enough space in on-stack array; must use kmalloc */
- ret = -ENOMEM;
bits = kmalloc(6 * size, GFP_KERNEL);
- if (!bits)
+ if (unlikely(!bits)) {
+ ret = -ENOMEM;
goto out_nofds;
+ }
}
fds.in = bits;
fds.out = bits + size;
@@ -363,10 +365,10 @@
if (ret < 0)
goto out;
if (!ret) {
- ret = -ERESTARTNOHAND;
- if (signal_pending(current))
+ if (signal_pending(current)) {
+ ret = -ERESTARTNOHAND;
goto out;
- ret = 0;
+ }
}
if (set_fd_set(n, inp, fds.res_in) ||
@@ -392,7 +394,7 @@
if (copy_from_user(&tv, tvp, sizeof(tv)))
return -EFAULT;
- if (tv.tv_sec < 0 || tv.tv_usec < 0)
+ if (unlikely(tv.tv_sec < 0 || tv.tv_usec < 0))
return -EINVAL;
/* Cast to u64 to make GCC stop complaining */
@@ -447,7 +449,7 @@
if (copy_from_user(&ts, tsp, sizeof(ts)))
return -EFAULT;
- if (ts.tv_sec < 0 || ts.tv_nsec < 0)
+ if (unlikely(ts.tv_sec < 0 || ts.tv_nsec < 0))
return -EINVAL;
/* Cast to u64 to make GCC stop complaining */
@@ -461,7 +463,7 @@
if (sigmask) {
/* XXX: Don't preclude handling different sized sigset_t's. */
- if (sigsetsize != sizeof(sigset_t))
+ if (unlikely(sigsetsize != sizeof(sigset_t)))
return -EINVAL;
if (copy_from_user(&ksigmask, sigmask, sizeof(ksigmask)))
return -EFAULT;
@@ -628,7 +630,7 @@
if (*timeout < 0) {
/* Wait indefinitely */
__timeout = MAX_SCHEDULE_TIMEOUT;
- } else if (unlikely(*timeout >= (s64)MAX_SCHEDULE_TIMEOUT-1)) {
+ } else if (unlikely(*timeout >= (s64)MAX_SCHEDULE_TIMEOUT - 1)) {
/*
* Wait for longer than MAX_SCHEDULE_TIMEOUT. Do it in
* a loop
@@ -789,7 +791,7 @@
if (sigmask) {
/* XXX: Don't preclude handling different sized sigset_t's. */
- if (sigsetsize != sizeof(sigset_t))
+ if (unlikely(sigsetsize != sizeof(sigset_t)))
return -EINVAL;
if (copy_from_user(&ksigmask, sigmask, sizeof(ksigmask)))
return -EFAULT;
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[Index of Archives]
[Kernel Newbies]
[Netfilter]
[Bugtraq]
[Photo]
[Stuff]
[Gimp]
[Yosemite News]
[MIPS Linux]
[ARM Linux]
[Linux Security]
[Linux RAID]
[Video 4 Linux]
[Linux for the blind]
[Linux Resources]