| Commit message (Collapse) | Author | Age |
|
|
|
|
| |
C-EDF needs to check to see if affinity is not NULL before
checking if affinity-selected CPU is in current cluster.
|
| |
|
|
|
|
|
|
|
|
|
|
| |
Given a choice between several available CPUs (unlinked) on which
to schedule a task, let the scheduler select the CPU closest to
where that task was previously scheduled. Hopefully, this will
reduce cache migration penalties.
TODO: If a lower-priority task must be preempted and there are several
scheduled tasks with the same low priority, then preempt the closest.
|
| |
|
|
|
|
|
| |
Otherwise, the release master CPU may try to reschedule in an infinite
loop.
|
|
|
|
|
|
|
|
|
|
| |
The next owner of a FMLP-protected resource is dequeued from
the FMLP FIFO queue by unlock() (when the resource is freed by
the previous owner) instead of performing the dequeue by the next
owner immediately after it has been woken up.
This simplifies the code a little bit and also reduces potential
spinlock contention.
|
|
|
|
|
| |
Instead of having an extra flag, Pfair should just infer sporadic
release based on deadlines like other plugins, too.
|
|
|
|
|
|
|
| |
Just like C-EDF is a global scheduler that is split across several
clusters, Pfair can be applied on a per-cluster basis. This patch
changes the Pfair implementation to enable clustering based on the
recently added generic clustering support.
|
|
|
|
|
| |
Inspired by the existing C-EDF code, this generic version will build
clusters of CPUs based on a given cache level.
|
|
|
|
|
| |
Make the cluster size configuration in C-EDF generic so that it can be
used by other clustered schedulers.
|
|
|
|
|
| |
Since we don't expect to trace more than one lock type at a time,
having protocol-specific trace points is not required.
|
|
|
|
|
|
|
|
|
|
|
|
| |
As Glenn pointed out, it is useful for some protocols (e.g.,
k-exclusion protocols) to know the userspace configuration at object
creation time. This patch changes the fdso API to pass the parameter
to the object constructor, which is then in turn passed to the lock
allocater. The return code from the lock allocater is passed to
userspace in return.
This also fixes some null pointer dereferences in the FDSO code found
by the test suite in liblitmus.
|
|
|
|
| |
This introduces the global FMLP based on the generic locking layer.
|
|
|
|
|
| |
Implement the partitioned FMLP with priority boosting based on the
generic lock API.
|
|
|
|
| |
While we are at it, simplify edf_higher_prio() a bit.
|
| |
|
|
|
|
|
| |
This re-enables SRP support under PSN-EDF and demonstrates how the new
locking API should be used.
|
|
|
|
|
| |
This renders the FMLP and SRP unfunctional until they are ported to
the new locking API.
|
|
|
|
|
| |
Provide a unified userspace interface for plugin-specific locking
protocols.
|
|
|
|
|
|
|
|
|
| |
As the number of supported locking protocols is expected to rise,
hard-coding things like priority inheritance in the plugin interface
doesn't scale. Instead, use a new generic lock-ops approach. With this
approach, each plugin can define its own protocol implementation (or
use a generic one), and plugins can support multiple protocols without
having to change the plugin interface for each protocol.
|
|
|
|
| |
Passing the object type explicitly will enable generic lock constructors.
|
| |
|
|
|
|
|
|
|
|
| |
It has always been LITMUS^RT policy that children of real-time tasks
may not skip the admissions test, etc. This used to be enforced, but
was apparently dropped during some port. This commit re-introduces
this policy. This fixes a kernel panic that occurred when "real-time
children" exited without proper initilization.
|
|
|
|
|
|
| |
We read in a line from userspace and remove the trailing newline in a
number of places. This function extracts the common code to avoid
future duplication.
|
| |
|
|
|
|
|
|
| |
This patch changes Feather-Trace to allocate memory for the minor
devices dynamically, which addresses a long-standing FIXME. It also
provides clean module exit and error conditions for Feather-Trace.
|
|
|
|
|
|
|
|
|
|
| |
This patch implements support for Feather-Trace devices to use the sysfs
file system and, consequently, udev support.
This allows us to allocate major/minor numbers for Feather-Trace
devices dynamically, which is desirable because our old static
allocations tend to create conflicts on modern distributions and/or
when there are many cores.
|
|
|
|
|
|
|
| |
Refactor the code that determines the C-EDF cluster size.
- Use an enum with symbolic constants instead of magic int values.
- Complain and fail to switch if an unsupported cluster size is requested.
- Default to ALL as suggested by Glenn and Andrea.
|
|
|
|
|
|
|
|
|
| |
Do not use the "scheduled_on" field to address the cpus structure
within a cluster. cpus may contain less items than num_online_cpus and
we may cause an out-of-bound access. Instead, use "scheduled_on" to
directly access the per-cpu cpu_entry_t structure.
Reported-by: Jonathan Herman <hermanjl@cs.unc.edu>
|
|
|
|
|
|
|
| |
Make sure to check for maximum index value when accessing cedf_domain_t
array in cedf_activate_plugin().
Reported-by: Jeremy Erickson <jerickso@cs.unc.edu>
|
|
|
|
|
|
|
|
|
|
|
| |
Add information to each trace message that makes it easier to locate
where it came from. It is disabled by default since this adds a lot of
clutter. Example:
81281 P1 [gsnedf_schedule@litmus/sched_gsn_edf.c:406]: (rtspin/1483:1) blocks:0 out_of_time:0 np:0 sleep:1 preempt:0 state:0 sig:0
81282 P1 [job_completion@litmus/sched_gsn_edf.c:303]: (rtspin/1483:1) job_completion().
81283 P1 [__add_release@litmus/rt_domain.c:344]: (rtspin/1483:2) add_release(), rel=41941764351
81284 P1 [gsnedf_schedule@litmus/sched_gsn_edf.c:453]: (rtspin/1483:2) scheduled_on = NO_CPU
|
|
|
|
|
|
|
|
|
|
|
| |
The CPU triggering the plugin switch should wait until all other CPUs
are in a proper state (synch_on_plugin_switch()) before performing the
actual switch.
Based on the original patch from Jeremy Erickson <jerickso@cs.unc.edu>.
This should solve (for most practical cases) the C-EDF-related
plugin-switch problem reported on the ML.
|
|
|
|
|
| |
It's not being allocated per cpu anymore. Further, provide a hint to
the user where to find the data in userspace.
|
|
|
|
|
|
|
|
|
|
|
| |
Let the user choose an appropriate buffer size (instead of scaling
with NR_CPUS). The kfifo api requires the buffer to be a power of
two, so enforce this constraint in the configuration.
This fixes a previously-existing compile-time error for values of
NR_CPU that are not a power of two.
Based on a patch by Mac Mollison <mollison@cs.unc.edu>.
|
|
|
|
|
|
| |
Linux now has a macro of the same name, which causes namespace
collisions. Since our version is only being used in two places that
haven't triggered in several years, let's just remove it.
|
|
|
|
|
| |
The specifier %u doesn't match sizeof() if sizeof() returns a 64bit
quantity on x86_64. Always cast it to int to avoid the warning.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Since the intial rebased from .24 to .32, the TRACE() implementation
was a hybrid between our old ringbuffer implementation and the new
generic kfifo API. This was a) ugly and b) not save for TRACE()
invoctations during early boot.
This patch rips out the old parts and replaces the actual buffer with a static kfifo.
This also increases TRACE() buffer size considerably. As we avoid a
dynamic allocation, this a larger size is less problematic for debug
builds. This helps a bit with holes in the debug log if the
buffer-flushing task is starved.
|
|
|
|
|
|
|
|
|
|
|
|
| |
To date, Litmus has just hooked into the smp_send_reschedule() IPI
handler and marked tasks as having to reschedule to implement remote
preemptions. This was never particularly clean, but so far we got away
with it. However, changes in the underlying Linux, and peculartities
of the ARM code (interrupts enabled before context switch) break this
naive approach. This patch introduces new state-machine based remote
preemption support. By examining the local state before calling
set_tsk_need_resched(), we avoid confusing the underlying Linux
scheduler. Further, this patch avoids sending unncessary IPIs.
|
|
|
|
|
|
|
|
|
|
| |
The TRACE() functionality doesn't need all of litmus.h. Currently,
it's impossible to use TRACE() in sched.h due to a circular
dependency. This patch moves TRACE() and friends to
litmus/sched_debug.h, which can be included in sched.h.
While at it, also fix some minor include ugliness that was revealed by
this change.
|
|
|
|
|
| |
Large sched_trace buffers cause boot problems on the ARM box. Allow
the user to specify smaller buffers.
|
|
|
|
|
|
|
| |
Make use of the new per-plugin proc file infrastructure to avoid
littering the global namespace. While at it, also move all the
relevant bits to sched_cedf.c. In the future, each plugin's parameters
should be handled in the respective plugin file.
|
| |
|
|
|
|
|
|
| |
Change the Litmus proc layout so that loaded plugins are visible in
/proc/litmus/plugins/loaded and add Litmus functions make_plugin_proc_dir()
and remove_plugin_proc_dir() to add per-plugin proc directories.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Conflicts:
Makefile
arch/x86/include/asm/unistd_32.h
arch/x86/kernel/syscall_table_32.S
kernel/sched.c
kernel/time/tick-sched.c
Relevant API and functions changes (solved in this commit):
- (API) .enqueue_task() (enqueue_task_litmus),
dequeue_task() (dequeue_task_litmus),
[litmus/sched_litmus.c]
- (API) .select_task_rq() (select_task_rq_litmus)
[litmus/sched_litmus.c]
- (API) sysrq_dump_trace_buffer() and sysrq_handle_kill_rt_tasks()
[litmus/sched_trace.c]
- struct kfifo internal buffer name changed (buffer -> buf)
[litmus/sched_trace.c]
- add_wait_queue_exclusive_locked -> __add_wait_queue_tail_exclusive
[litmus/fmlp.c]
- syscall numbers for both x86_32 and x86_64
|
|
|
|
|
| |
Allow all kinds of budget enforcement settings now that we have the
supporting infrastructure.
|
|
|
|
| |
Update the budget enforcement timer after each scheduling decision.
|
|
|
|
|
|
|
| |
Simple logic: if a task requires precise enforcement, then program a
hr-timer to fire when the task must be descheduled. When the timer
fires, simply activate the scheduler. When we switch to a different
task, either reprogram the timer or cancel it.
|
|
|
|
|
|
|
|
|
| |
Having tasks that are !is_running() in shared structures is
very confusing during development and debugging, and can likely
mask bugs and/or create races.
It seems like a strange choice that Linux changes a task's state
only _after_ activating it. For LITMUS^RT tasks, we change this order.
|
|
|
|
|
|
|
| |
These messages are highly useful when debugging races,
but they quickly litter the log when looking for something else.
We keep them around, but by default they shouldn't show up.
|
|
|
|
|
|
|
|
| |
This API addition allows the calling code to override
the release master for a given rt_domain_t object. This
is particularly useful if a job is supposed to migrate
to a particular CPU. This need arises for example in semi-
partitioned schedulers.
|