| Commit message (Collapse) | Author | Age |
| |
|
|
|
|
|
| |
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.
|
|
|
|
|
| |
...and replace it with a more useful one. We don't directly modify
Linux run queues anymore since (at least) LITMUS^RT 2008.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
If no events are defined but Feater-Trace support is enabled, then the current
implementation generates a link error because the __event_table sections is
absent.
> arch/x86/built-in.o: In function `ft_disable_all_events':
> (.text+0x242af): undefined reference to `__start___event_table'
As a simple work around, we force zero-element array to always be "allocated"
in the __event_table section. This ensures that we end up with a zero-byte
section if no events are enabled, and does not affect the layout of the section
if events are present.
> bbb@ludwig:~/dev/litmus2010$ nm vmlinux | grep event_table
> ffffffff81950cdc D __event_table_dummy
> ffffffff81950cdc A __start___event_table
> ffffffff81950cdc A __stop___event_table
|
|
|
|
|
|
|
|
|
|
|
|
| |
If RELEASE_MASTER is not selected the "info" hrtimer_start_on_info
structure in release_heap structure is not visible and trying to access
"info" from reinit_release_heap() causes the following error:
error: 'struct release_heap' has no member named 'info'
info should not be referenced if RELEASE_MASTER is not used.
The problem was first reported by Glenn <gelliott@cs.unc.edu>
|
|
|
|
|
|
|
|
|
| |
Commit "0c527966 Make release master support optional" uses
__ARCH_HAS_SEND_PULL_TIMERS instead of CONFIG_ARCH_HAS_SEND_PULL_TIMERS
(introduced in commit 0fb33c99) to conditionally compile a pull timer
related code in rt_domain.c. This code is disabled and pull-timer's
state is no longer properly reset. Therefore, a pulled timer cannot be
armed anymore.
|
|
|
|
|
| |
litmus_sched_class wasn't declared static, but it's not used outside
sched.c, so change it's signature to static.
|
|
|
|
|
|
|
|
|
|
|
| |
Feather-Trace rewrites instructions in the kernel's .text segment.
This segment may be write-protected if CONFIG_DEBUG_RODATA is selected.
In this case, fall back to the default flag-based Feather-Trace
implementation. In the future, we could either adopt the ftrace method
of rewriting .text addresses using non-.text mappings or we could
consider replacing Feather-Trace with ftrace altogether.
For now, this patch avoids unexpected runtime errors.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The PFAIR plugin always implicitly assumed !NO_HZ (the schedule
is wrong if NO_HZ is enabled) and does not built if hrtimers are absent:
> litmus/built-in.o: In function `pfair_activate_plugin':
> sched_pfair.c:(.text+0x7f07): undefined reference to `cpu_stagger_offset'
> litmus/built-in.o: In function `init_pfair':
> sched_pfair.c:(.init.text+0x487): undefined reference to `cpu_stagger_offset'
cpu_stagger_offset() is only available if hrtimers are enabled.
This patch makes these dependencies explicit.
|
|
|
|
|
|
| |
C-EDF depends on intel_cacheinfo.c (for get_shared_cpu_map()) which is
only available on x86 architectures. Furthermore, get_shared_cpu_map()
is only available if SYSFS filesystem is present.
|
|
|
|
|
| |
There is currently no need to implement this in ARM.
So let's make it optional instead.
|
|
|
|
|
|
|
|
| |
Introduces CONFIG_RELEASE_MASTER and makes release
master support dependent on the new symbol. This is
useful because dedicated interrupt handling only applies
to "large" multicore platforms. This will allow us to
not implement smp_send_pull_timers() for all platforms.
|
|
|
|
|
|
| |
C-EDF only makes sense on multicore platforms that have shared caches.
Make it possible to disable it on other platforms, in particular,
on those that do not export get_shared_cpu_map().
|
|
|
|
|
|
|
|
|
| |
The idea of the Feather-Trace default implementation is that LITMUS^RT should
work without a specialized Feather-Trace implementation present. This was
actually broken.
Changes litmus/feather_trace.h to only include asm/feather_trace.h if actually
promised by the architecture.
|
|
|
|
|
| |
Insert PLUGIN_TICK_END tracing point in litmus_tick(). It was lost during
the porting of 2008.3 to 2010.1.
|
|
|
|
|
| |
- With the "ALL" cluster size option the behavior of C-EDF is
equivalent to G-EDF (one single cluster)
|
|
|
|
|
|
|
|
|
|
| |
NO_ENFORCEMENT - A job may execute beyond its declared execution time.
Jobs notify the kernel that they are complete via liblitmus's
sleep_next_period()
QUANTUM_ENFORCEMENT - The kernel terminates a job if its actual execution
time exceeds the declared execution time.
PRECISE_ENFORCEMENT - Hook declared, but not yet implemented. Plan to
support this policy through hrtimers. Error thrown if specified.
|
|
|
|
|
|
|
|
|
| |
- kfifo needs to be defined and used differently (see include/linux/kfifo.h)
- spinlock -> raw_spinlock
- include slab.h when using kmalloc and friends
This commit compiles and is the logical end of the merge of Litmus and
2.6.34.
|
|
|
|
|
|
|
|
| |
- get_rr_interval() changed signature
- load_balance() and move_one_tak() are no longer needed
- spinlock_t -> raw_spinlock_t
This commit does not compile.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Adapt to new schema for spinlock:
(tglx 20091217)
spinlock - the weakest one, which might sleep in RT
raw_spinlock - spinlock which always spins even on RT
arch_spinlock - the hardware level architecture dependent implementation
----
Most probably, all the spinlocks changed by this commit will be true
spinning lock (raw_spinlock) in PreemptRT (so hopefully we'll need few
changes when porting Litmmus to PreemptRT).
There are a couple of spinlock that the kernel still defines as
spinlock_t (therefore no changes reported in this commit) that might cause
us troubles:
- wait_queue_t lock is defined as spinlock_t; it is used in:
* fmlp.c -- sem->wait.lock
* sync.c -- ts_release.wait.lock
- rwlock_t used in fifo implementation in sched_trace.c
* this need probably to be changed to something always spinning in RT
at the expense of increased locking time.
----
This commit also fixes warnings and errors due to the need to include
slab.h when using kmalloc() and friends.
----
This commit does not compile.
|
|
|
|
|
|
| |
Improved C-EDF plugin. C-EDF now supports different cluster sizes (based
on L2 and L3 cache sharing) and supports dynamic changes of cluster size
(this requires reloading the plugin).
|
|
|
|
|
|
| |
Make sure the plugin is not used by any CPUs while switching.
The CPU performing the switch sends an IPI to all other CPUs forcing
them to synchronize on an atomic variable.
|
|
|
|
|
|
| |
hrtimers are properly rearmed during arm_release_timer() and no longer
after rescheduling (with the norqlock mechanism of 2008.3). This commit
accordingly updates the locations where measures are taken.
|
|
|
|
|
| |
Log task completions in job_completion() for PSN-EDF.
This fixes the problem of missing job-completion events for PSN-EDF.
|
|
|
|
|
|
|
|
|
| |
Requeue a task that is already scheduled will cause it to be effectively
in the runqueue twice since scheduled tasks are conceptually the head
of the queue. If a task is still scheduled, then schedule() will do the
right thing and do the requeuing if necessary.
This fixes crashes reported by Glenn and Andrea.
|
|
|
|
|
|
|
|
|
| |
This patch changes sched_trace.c to use the miscdevice API
instead of doing all the cdev management ourselves. This remove a
chunk of code and we get sysfs / udev integration for free.
On systems with default udev rules, this will result in a /dev/litmus/log
device being created automatically.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This fixes a bug found by liblitmus's regression test suite.
Before:
> ** LITMUS^RT test suite.
> ** Running tests for LINUX.
> ** Testing: don't open FMLP semaphores if FMLP is not supported...
> !! TEST FAILURE open_fmlp_sem(fd, 0) -> -16, Success (expected: EBUSY)
> at tests/fdso.c:21 (test_fmlp_not_active)
> ** Testing: reject invalid object descriptors... ok.
> ** Testing: reject invalid object types...
> !! TEST FAILURE od_open(0, -1, 0) -> -22, Bad file descriptor (expected: EINVAL)
> at tests/fdso.c:51 (test_invalid_obj_type)
> ** Testing: reject invalid rt_task pointers... ok.
> ** Result: 2 ok, 2 failed.
After:
> ** LITMUS^RT test suite.
> ** Running tests for LINUX.
> ** Testing: don't open FMLP semaphores if FMLP is not supported... ok.
> ** Testing: reject invalid object descriptors... ok.
> ** Testing: reject invalid object types... ok.
> ** Testing: reject invalid rt_task pointers... ok.
> ** Result: 4 ok, 0 failed.
|
|
|
|
|
|
|
|
| |
The od_table is strictly per-thread and should not be inherited across
a fork/clone. This caused memory corruption when a task exited, which
ultimately could lead to oopses in unrelated code.
Bug and testcase initially reported by Glenn.
|
|
|
|
|
|
|
|
| |
1) High priority task tied to FMLP semaphore in P-EDF scheduling is
incorrectly tracked for tasks acquiring the lock without
contention. (HP is always set to CPU 0 instead of proper CPU.)
2) Race in a print statement from P-EDF's pi_block() causes NULL
pointer dereference.
|
|
|
|
|
| |
This patch updates non-preemptive section support in
GSN- and PSN-EDF.
|
|
|
|
|
|
|
|
| |
Dealing with preemptions across CPUs in the presence of non-preemptive
sections can be tricky and should not be replicated across (event-driven) plugins.
This patch introduces a generic preemption function that handles
non-preemptive sections (hopefully) correctly.
|
|
|
|
|
|
|
|
|
|
|
|
| |
Re-introduce NP sections in the configuration and in litmus.h. Remove the old
np_flag from rt_param.
If CONFIG_NP_SECTION is disabled, then all non-preemptive section checks are
constant expressions which should get removed by the dead code elimination
during optimization.
Instead of re-implementing sys_exit_np(), we simply repurposed sched_yield()
for calling into the scheduler to trigger delayed preemptions.
|
|
|
|
|
|
|
|
|
| |
This device only supports mmap()'ing a single page.
This page is shared RW between the kernel and userspace.
It is inteded to allow near-zero-overhead communication
between the kernel and userspace. It's first use will be a
proper implementation of user-signaled
non-preemptable section support.
|