Messages in this thread | | | Date | Fri, 14 Aug 2009 13:55:59 +0200 | From | Michael Schnell <> | Subject | Re: implementing Futex |
| |
Arnd Bergmann wrote:, >> From reading the code (futex_atomic_op_inuser() seems only to be called >> once (in futex.c) ), it seems that futex_atomic_op_inuser() is not >> really used at all. It seems that it'd only called for futex_wake, and >> here the "Operation" is derived from the last parameter of the system >> call, which the man page says is ignored. So, are all the operations >> implemented there really necessary or just "nice to have" ? > > You misread futex_wake_op(). The operation comes from the second parameter > of the syscall, not the last one.
Really ?
In futex.c, I see
static int futex_wake_op(u32 __user *uaddr1, int fshared, u32 __user *uaddr2, int nr_wake, int nr_wake2, int op) { .. retry_private: op_ret = futex_atomic_op_inuser(op, uaddr2); .. } ... long do_futex(u32 __user *uaddr, int op, u32 val, ktime_t *timeout, u32 __user *uaddr2, u32 val2, u32 val3) { .. case FUTEX_WAKE_OP: ret = futex_wake_op(uaddr, fshared, uaddr2, val, val2, val3); .. }; ... SYSCALL_DEFINE6(futex, u32 __user *, uaddr, int, op, u32, val, struct timespec __user *, utime, u32 __user *, uaddr2, u32, val3) { .. return do_futex(uaddr, op, val, tp, uaddr2, val2, val3); .. }
I don't see that the value in question is modified anywhere in that code.
What am I getting wrong ?
But I also don't see how this makes any sense.
-Michael
| |