Use PDR locks for glibc's internal locks (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 9 Sep 2016 18:49:06 +0000 (14:49 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 16 Sep 2016 18:35:09 +0000 (14:35 -0400)
commit2279485d8726658cabb9b1517ecd276e9d67fd07
tree1820fb2548b2aca569092ae9cd0970cab2001422
parent183980f10906aaad88e6267e6fd630f3aa2dd5d0
Use PDR locks for glibc's internal locks (XCC)

Our glibc port was using a simple spinlock for its LLL (low-level lock).
The problem with this is that the lock could be grabbed by vcore context
code, and in general is not safe from preemption.

The fix is to use PDR locks.  There are a couple nasty details.

One is that glibc mostly assumes a lock is an int.  We could hack up the
sysdeps completely (note that the INITIALIZER is compared to 0 directly),
but that's a mess.  Instead, we rely on the fact that spin PDR locks are 32
bits.

The other detail is that ld.so uses the locks, and it doesn't link with
parlib.  Even if it did, or if we moved the PDR locks to glibc directly,
it'd possibly be a mess, since ld grabs the locks before any of our parlib
constructors (I think).  The way it works now is that ld.so uses the
internal versions of the locks, and anything that links against parlib
(i.e. a binary that ld loads) should get the parlib version.  This might
not be working exactly as I think: see my notes in parlib-compat.c for
details.

A minor point to note is the removal of parlib/common.h from x86/atomic.h.
The common.h header pulls in way too much, and now that glibc's LLL needs
parlib/spinlock.h, we run into build issues.  So don't add things to
low-level parlib header files unnecessarily.

Rebuild the world.  AFAIK, even dynamically linked apps need to be rebuilt,
otherwise they may use the version of the locks that ld.so uses.  For
single-threaded apps, this is probably okay.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/Versions
tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/lowlevellock.h
tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/parlib-compat.c
user/parlib/include/parlib/x86/atomic.h
user/parlib/spinlock.c