Good work. I likee.
I have a couple comments and question:
> +static spinlock_t futex_lock = SPIN_LOCK_UNLOCKED;
Could we make this per-waitqueue?
> +asmlinkage int sys_futex(void *uaddr, int op)
< [...]
> + switch (op) {
> + case 1:
> + ret = futex_up(head, page_address(page) + pos_in_page);
> + break;
> + case -1:
We should do:
#define FUTEX_UP 1
#define FUTEX_DOWN -1
and put them in a common header (i.e. include/linux so both the kernel
and glibc will use it) and use that in our code and the kernel code.
Just a finishing detail ...
> +static inline int __update_count(atomic_t *count, int incr)
> +{
> + int old_count, tmp;
> +
> + /* preempt_disable() */
> + old_count = atomic_read(count);
> + tmp = old_count > 0 ? old_count : 0;
> + atomic_set(count, tmp + incr);
> + return old_count;
> +}
You will want to do:
int old_count, tmp;
preempt_disable();
old count = atomic_read(count);
tmp = old_count > 0 ? old_count : 0;
atomic_set(count, tmp + incr);
preempt_enable();
return old_count;
here. The preempt statements compile away if CONFIG_PREEMPT is not set,
so you can just put them in, even on arches that don't do preemption
yet.
... oh, and I would love an example of using it in userspace ;)
Nice work, Rusty.
Robert Love
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/