Age | Commit message (Collapse) | Author |
|
|
|
These new macros take care of disabling/restoring interrupts in the
appropriate order.
|
|
|
|
|
|
Processor registration assumes no deferred work could be queued before,
which may not be true at boot time, after initializing the llsync module
but before starting the scheduler.
|
|
|
|
|
|
This turns assert.h into a standard header.
|
|
Make kernel code obtain definitions for the printf family of functions
through the inclusion of the standard stdio.h header.
|
|
The printk functions are close enough to the printf ones to bear the
same names.
|
|
Now that event counters have been replaced with system counters, drop
the convention of naming the counter as the event it tracks.
|
|
The syscnt module supports more generic counters, in addition to atomic
access from any context on any architecture.
|
|
Instead of mixing standard headers and internal redefinitions of standard
types, completely rely on the compiler for what is guaranteed for a free
standing environment. This results in the removal of kern/stddef.h and
kern/stdint.h. The kern/types.h header is reintroduced for the different
(and saner) purpose of defining types not specified in standard C,
namely ssize_t for now.
|
|
|
|
This change was done using astyle, with a few manual editing here and
there.
|
|
|
|
|
|
|
|
Use a global checkpoint identifier as a generation counter and remove
reset interrupts.
For some reason I can't remember, using reset interrupts was thought to
be more efficient, perhaps because accessing a global variable on each
checkpoint looked expensive. But it's really not scalable, and a
read-mostly global variable can get cached locally and not incur expensive
access.
In addition, add a decent amount of documentation about the semantics
with regard to the rest of the system. Explicitely state that checkpoints
are triggered by context switches and that it's not allowed to block
inside read-side critical sections. Make periodic events attempt to trigger
checkpoints too. Add a thread-local read-side critical section nesting
counter so that it can be reliably determined whether the processor is
running a read-side critical section or not.
|
|
Remove trailing space character.
|
|
|
|
|
|
|
|
This change slightly affects the interface by making users directly pass
work objects.
|
|
Make passing attributes and passing a thread name mandatory.
|
|
|
|
This minor change groups the reset/commit and register/unregister functions
together for better discoverability.
|
|
This change makes reset requests write both the per-processor flag as well as
the checkpoint bitmap atomically, and adjusts the module logic accordingly.
It fixes a race between checkpoint reset and system timer interrupts where
the timer interrupt would make the local processor commit its checkpoint
although it can't be reliably determined that it reached a checkpoint since
the last global checkpoint, because the reset interrupt wasn't received yet.
This problem would rarely happen on real hardware because of the near-instant
handling of IPIs, but it was observed on virtual machines.
|
|
Intuitively, registering the first processor should trigger a global
checkpoint to get the lockless synchronization system started. It is
possible, however, that this case occurs frequently on idle systems,
where processors are normally not registered, and only perform load
balancing. It can also happen that a processor determines itself as
the only registered one whereas reset interrupts have not yet been
processed, in which case a global checkpoint should just not occur.
The real condition for a global checkpoint is the number of pending
checkpoints reaching 0.
|
|
Move code handling the unregistration of the last processor in the global
checkpoint processing function, where list management actually occurs.
|
|
Not strictly required, but makes things simpler at virtually no cost.
|
|
|
|
Keep a local copy of a processor registration state to avoid acquiring the
global lock when attempting to commit a checkpoint from an unregistered
processor.
|
|
|
|
|
|
This module provides lockless synchronization so that reads can safely occur
during updates, without holding a lock. It is based on passive serialization
as described in US patent 4809168, and achieves a goal similar to Linux RCU
(Read-Copy Update).
|