[PATCH -mm] add some unlikely() to fs/select.c

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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]
  Powered by Linux