summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorLuca Barbieri <ldb@ldb.ods.org>2002-11-17 19:07:22 -0800
committerDavid S. Miller <davem@nuts.ninka.net>2002-11-17 19:07:22 -0800
commit8ab9bc8e5df1d3dea764e081d580b18d38f27953 (patch)
treecdfc81a9417637598ffe52fd5140229b473de58d /kernel
parent4b95a3f79a98535791fd200a3dd5365418e3f11f (diff)
[PATCH] Small futex improvement
This patch makes the futex code check utime only when waiting. This makes it possible to do futex wakes without clearing the register containing the utime parameter. The code also becomes cleaner.
Diffstat (limited to 'kernel')
-rw-r--r--kernel/futex.c27
1 files changed, 18 insertions, 9 deletions
diff --git a/kernel/futex.c b/kernel/futex.c
index 268b64ba2551..16775292bdc4 100644
--- a/kernel/futex.c
+++ b/kernel/futex.c
@@ -315,6 +315,23 @@ out:
return ret;
}
+static inline int futex_wait_utime(unsigned long uaddr,
+ int offset,
+ int val,
+ struct timespec* utime)
+{
+ unsigned long time = MAX_SCHEDULE_TIMEOUT;
+
+ if (utime) {
+ struct timespec t;
+ if (copy_from_user(&t, utime, sizeof(t)) != 0)
+ return -EFAULT;
+ time = timespec_to_jiffies(&t) + 1;
+ }
+
+ return futex_wait(uaddr, offset, val, time);
+}
+
static int futex_close(struct inode *inode, struct file *filp)
{
struct futex_q *q = filp->private_data;
@@ -422,17 +439,9 @@ out:
asmlinkage int sys_futex(unsigned long uaddr, int op, int val, struct timespec *utime)
{
- unsigned long time = MAX_SCHEDULE_TIMEOUT;
unsigned long pos_in_page;
int ret;
- if (utime) {
- struct timespec t;
- if (copy_from_user(&t, utime, sizeof(t)) != 0)
- return -EFAULT;
- time = timespec_to_jiffies(&t) + 1;
- }
-
pos_in_page = uaddr % PAGE_SIZE;
/* Must be "naturally" aligned */
@@ -441,7 +450,7 @@ asmlinkage int sys_futex(unsigned long uaddr, int op, int val, struct timespec *
switch (op) {
case FUTEX_WAIT:
- ret = futex_wait(uaddr, pos_in_page, val, time);
+ ret = futex_wait_utime(uaddr, pos_in_page, val, utime);
break;
case FUTEX_WAKE:
ret = futex_wake(uaddr, pos_in_page, val);