Atomics rewrite (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 8 Jun 2011 01:29:10 +0000 (18:29 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:36:04 +0000 (17:36 -0700)
commit6be3f3efd803419a844d8b7d7447904e40f1bfbf
tree5b358c7f3672dd186be6a9fcd312545a9bf43653
parent53128114d8acd5fbc40b77d5c9df097b16634d72
Atomics rewrite (XCC)

The atomics have been slowly drifting out of control, esp with 64-bit
unfriendliness; this patch ought to fix some things.

1) All atomic ops take an atomic_t*, and if there are values added or
subtracted, they are longs.  The atomic_t helps ensure we only use
atomic ops on atomic variables.

2) Atomic ops on other types have their own functions, denoting the
type, such as atomic_cas_u32().  Careful using these, since you may have
other references to those vars that aren't atomic.

3) BCQs use u32s for their buffer indexes.  If we have programs that are
32 bit on a 64 bit kernel, we would have trouble if we tried using 64
bit values.

4) k/i/atomic.h now is the source of the function prototypes.  They are
extern inlines, which requires -fgnu-89inline (which we've been using),
allowing arches to implement the functions however they'd like, such as
with static inlines or with a regular function (like x86's
spinlock_debug() or riscv's CAS ops).

5) Some users of atomic_swap were cleaned up to represent its status as
an atomic, mostly in userlevel locking code.  Userlevel condition
variables use swap_u32(), which may not be what people want.  That bit
of code is a bit unmaintained at this point.

6) Userspace does not unify its atomics in an inc/atomic.h, since glibc
has its own atomic.h.  There will be a reckoning for userspace at some
point, dealing with the collision of atomic naming with glibc.  It's not
really the kernel's concern.  Also note that I didn't want to force the
-fgnu89-inline on userspace.

7) Rebuild your cross compiler/glibc.  Everything compiles on sparc and
x86.  I haven't been able to try riscv yet.
20 files changed:
kern/arch/i686/atomic.h
kern/arch/riscv/atomic.c
kern/arch/riscv/atomic.h
kern/arch/sparc/atomic.h
kern/include/atomic.h
kern/include/ros/atomic.h
kern/include/ros/bcq.h
kern/include/ros/bcq_struct.h
kern/include/ros/syscall.h
kern/src/blockdev.c
kern/src/syscall.c
kern/src/testing.c
user/parlib/bthread.c
user/parlib/include/bthread.h
user/parlib/include/i686/atomic.h
user/parlib/include/sparc/atomic.h
user/parlib/mcs.c
user/parlib/uthread.c
user/pthread/pthread.c
user/pthread/pthread.h