diff options
| author | Ingo Molnar <mingo@elte.hu> | 2006-03-27 04:16:27 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-03-27 11:44:49 -0500 |
| commit | 8f17d3a5049d32392b79925c73a0cf99ce6d5af0 (patch) | |
| tree | 3c2aa0cbe337684d353dd2cfb0c177b4ae15217c /kernel | |
| parent | 8fdd6c6df7889dc89df3d9fe0f5bbe6733e39f48 (diff) | |
[PATCH] lightweight robust futexes updates
- fix: initialize the robust list(s) to NULL in copy_process.
- doc update
- cleanup: rename _inuser to _inatomic
- __user cleanups and other small cleanups
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Arjan van de Ven <arjan@infradead.org>
Cc: Ulrich Drepper <drepper@redhat.com>
Cc: Andi Kleen <ak@muc.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/fork.c | 5 | ||||
| -rw-r--r-- | kernel/futex.c | 20 | ||||
| -rw-r--r-- | kernel/futex_compat.c | 7 |
3 files changed, 16 insertions, 16 deletions
diff --git a/kernel/fork.c b/kernel/fork.c index e0a2b449dea6..c49bd193b058 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
| @@ -1061,7 +1061,10 @@ static task_t *copy_process(unsigned long clone_flags, | |||
| 1061 | * Clear TID on mm_release()? | 1061 | * Clear TID on mm_release()? |
| 1062 | */ | 1062 | */ |
| 1063 | p->clear_child_tid = (clone_flags & CLONE_CHILD_CLEARTID) ? child_tidptr: NULL; | 1063 | p->clear_child_tid = (clone_flags & CLONE_CHILD_CLEARTID) ? child_tidptr: NULL; |
| 1064 | 1064 | p->robust_list = NULL; | |
| 1065 | #ifdef CONFIG_COMPAT | ||
| 1066 | p->compat_robust_list = NULL; | ||
| 1067 | #endif | ||
| 1065 | /* | 1068 | /* |
| 1066 | * sigaltstack should be cleared when sharing the same VM | 1069 | * sigaltstack should be cleared when sharing the same VM |
| 1067 | */ | 1070 | */ |
diff --git a/kernel/futex.c b/kernel/futex.c index feb724b2554e..9c9b2b6b22dd 100644 --- a/kernel/futex.c +++ b/kernel/futex.c | |||
| @@ -913,15 +913,15 @@ err_unlock: | |||
| 913 | * Process a futex-list entry, check whether it's owned by the | 913 | * Process a futex-list entry, check whether it's owned by the |
| 914 | * dying task, and do notification if so: | 914 | * dying task, and do notification if so: |
| 915 | */ | 915 | */ |
| 916 | int handle_futex_death(unsigned int *uaddr, struct task_struct *curr) | 916 | int handle_futex_death(u32 __user *uaddr, struct task_struct *curr) |
| 917 | { | 917 | { |
| 918 | unsigned int futex_val; | 918 | u32 uval; |
| 919 | 919 | ||
| 920 | repeat: | 920 | retry: |
| 921 | if (get_user(futex_val, uaddr)) | 921 | if (get_user(uval, uaddr)) |
| 922 | return -1; | 922 | return -1; |
| 923 | 923 | ||
| 924 | if ((futex_val & FUTEX_TID_MASK) == curr->pid) { | 924 | if ((uval & FUTEX_TID_MASK) == curr->pid) { |
| 925 | /* | 925 | /* |
| 926 | * Ok, this dying thread is truly holding a futex | 926 | * Ok, this dying thread is truly holding a futex |
| 927 | * of interest. Set the OWNER_DIED bit atomically | 927 | * of interest. Set the OWNER_DIED bit atomically |
| @@ -932,12 +932,11 @@ repeat: | |||
| 932 | * thread-death.) The rest of the cleanup is done in | 932 | * thread-death.) The rest of the cleanup is done in |
| 933 | * userspace. | 933 | * userspace. |
| 934 | */ | 934 | */ |
| 935 | if (futex_atomic_cmpxchg_inuser(uaddr, futex_val, | 935 | if (futex_atomic_cmpxchg_inatomic(uaddr, uval, |
| 936 | futex_val | FUTEX_OWNER_DIED) != | 936 | uval | FUTEX_OWNER_DIED) != uval) |
| 937 | futex_val) | 937 | goto retry; |
| 938 | goto repeat; | ||
| 939 | 938 | ||
| 940 | if (futex_val & FUTEX_WAITERS) | 939 | if (uval & FUTEX_WAITERS) |
| 941 | futex_wake((unsigned long)uaddr, 1); | 940 | futex_wake((unsigned long)uaddr, 1); |
| 942 | } | 941 | } |
| 943 | return 0; | 942 | return 0; |
| @@ -985,7 +984,6 @@ void exit_robust_list(struct task_struct *curr) | |||
| 985 | if (handle_futex_death((void *)entry + futex_offset, | 984 | if (handle_futex_death((void *)entry + futex_offset, |
| 986 | curr)) | 985 | curr)) |
| 987 | return; | 986 | return; |
| 988 | |||
| 989 | /* | 987 | /* |
| 990 | * Fetch the next entry in the list: | 988 | * Fetch the next entry in the list: |
| 991 | */ | 989 | */ |
diff --git a/kernel/futex_compat.c b/kernel/futex_compat.c index c153559ef289..9c077cf9aa84 100644 --- a/kernel/futex_compat.c +++ b/kernel/futex_compat.c | |||
| @@ -121,9 +121,9 @@ err_unlock: | |||
| 121 | return ret; | 121 | return ret; |
| 122 | } | 122 | } |
| 123 | 123 | ||
| 124 | asmlinkage long compat_sys_futex(u32 __user *uaddr, int op, int val, | 124 | asmlinkage long compat_sys_futex(u32 __user *uaddr, int op, u32 val, |
| 125 | struct compat_timespec __user *utime, u32 __user *uaddr2, | 125 | struct compat_timespec __user *utime, u32 __user *uaddr2, |
| 126 | int val3) | 126 | u32 val3) |
| 127 | { | 127 | { |
| 128 | struct timespec t; | 128 | struct timespec t; |
| 129 | unsigned long timeout = MAX_SCHEDULE_TIMEOUT; | 129 | unsigned long timeout = MAX_SCHEDULE_TIMEOUT; |
| @@ -137,6 +137,5 @@ asmlinkage long compat_sys_futex(u32 __user *uaddr, int op, int val, | |||
| 137 | if (op >= FUTEX_REQUEUE) | 137 | if (op >= FUTEX_REQUEUE) |
| 138 | val2 = (int) (unsigned long) utime; | 138 | val2 = (int) (unsigned long) utime; |
| 139 | 139 | ||
| 140 | return do_futex((unsigned long)uaddr, op, val, timeout, | 140 | return do_futex(uaddr, op, val, timeout, uaddr2, val2, val3); |
| 141 | (unsigned long)uaddr2, val2, val3); | ||
| 142 | } | 141 | } |
