Re: [PATCH] Fast Userspace Mutexes III.

From: Robert Love (rml@tech9.net)
Date: Mon Mar 04 2002 - 14:49:51 EST


On Sun, 2002-03-03 at 22:55, Rusty Russell wrote:
> 1) Use mmap/mprotect bits, not new syscall (thanks RTH, Erik Biederman)
> 2) Fix wakeup race in kernel (thanks Martin Wirth, Paul Mackerras)
> 3) Simplify locking to a single atomic (no more arch specifics!)
> 4) Use wake-one by handcoding queues.
> 5) Comments added.
>
> Thanks to all for feedback and review: I'd appreciate a comment from
> those arch's which need to do something with the PROT_SEM bit.
>
> Once again, tested on 2.4.18 UP PPC, compiles on 2.5.6-pre1.
>
> Bad news is that we're up to 206 lines again.
> Rusty.

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/



This archive was generated by hypermail 2b29 : Thu Mar 07 2002 - 21:00:35 EST