PATCH futex on fusyn (Was: RE: [RFC/PATCH] FUSYN Realtime & robust mutexes for Linux, v2.3.1)

From: Perez-Gonzalez, Inaky
Date: Wed Aug 18 2004 - 21:09:53 EST


> From: Ingo Molnar [mailto:mingo@xxxxxxx]
>
> i believe the key to integration of this feature is to try to make it
> used by normal (non-RT) apps as much as possible. I.e. try to make
> current futexes a subset of fusyn.c and to merge the two APIs if
> possible (essentially renaming your fusyn.c to futex.c and implementing
> the futex API). Is this possible without noticeable performance overhead
> (and without too many special-cases)?

Ok, here we go with a first cut -- sorry for the time it took, came
back from vacation and had the usual big-pile-o-crap waiting for me.

There are two patches, first one, fusyn-2.3.1-00-misc-requeue (-p1)
contains the few fixes on top of 2.3.1 that are needed to be able to
map futexes on top of fusyn. Mainly is adding fuqueue_requeue() [before
I only had fulock requeue from a fuqueue], splitting sys_ufuqueue_wake()
and fixing some stupid mistakes.

Second patch, fusyn-2.3.1-01-futex-switch.patch implements a sysctl-based
futex switch. Echo 1 to /proc/sys/kernel/futex_uses_fusyn and new futexes
will be based on fusyns. Echo 0 and we are back to normal.

caveat emperors:

- 01-futex-switch is a crappy quick hack. If there where applications waiting
on futexes and you flip the switch, they will wait for ever in there...
a 'kill -CONT' might help.

- FUTEX_FD is not implemented--too much work for a proof of concept.

- ufuqueue_requeue() is more limited than futex's in that it will always
requeue everybody, not just the number of passed waiters. There is a
reason for it, and is it is only used for broadcast and broadcast means
everybody. It makes it simpler to do it in a O(1) way [that by the way,
I had to hack around because it was broken--fix in the works...someday].

So, there are WARN_ONs to catch cases of calls not doing the args as
expected--but so far, I haven't caught any.

Performance:

I used my favorite stress microbenchmark, str03 [1] which is a program I
stole I don't remember where from that does a lot of conditional variable
and mutexing. Running it like:

$ (ulimit -s 32; /usr/bin/time -f %e ./str03 -b 5 -d 5)

creates a good 3900 threads that need to talk among them to finish and
communicate via mutexes and condvars.

In my test machine, 2xP3 (Coppermine) 933MHz w/ 2 GiB Ram, I get the
average of ten runs as:

Environment Seconds (10 continuous runs averaged)
----------- -------------------
plain NPTL and futexes 0.97
plain NPTL, futexes use fuqueues 1.15
Under RTNPTL, using fulocks 1.48

So using fuqueues instead of fusyns is slightly slower on heavy use--I
expected it due to the extra overhead. I am off to do a full Volanomark
run, see how it behaves [this takes more time--won't be ready until
tomorrow].

Patches inlined below in two following messages. They should also show
up at the CVS snapshots that we get at our OSDL site.

[1] http://developer.osdl.org/dev/robustmutexes/fusyn/2.3.1/
rtnptl-test-misc-2.3.tar.gz, in src/

Iñaky Pérez-González -- Not speaking for Intel -- all opinions are my own (and my fault)
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/