A brief guide to creating a new scheduling plugin in LITMUS^RT (based on version 2012.2.)
As an example, we are going to implement a simple semi-partitioned EDF scheduler that migrates jobs among CPUs in a round-robin fashion every 500us of execution. While this is not an overly practical scheduler, it's a good example because it allows to demonstrate how to implement migrations, per-processor state, and custom scheduling timers.
Prerequisites
- A testing environment (i.e., KVM/Qemu or Bochs).
- Strong C programming skills.
- Ideally, some exposure to OS kernel development.
General Guidelines
Work in a checked-out git repository. Do not use the tarball from the web page. This will make keeping track of your edits and incorporating upstream changes much easier.
Commit early, commit often. Make many small commits a you go along. You can clean them up later using git rebase.
Do not commit to the master branch. This will make incorporating upstream changes much easier.
Follow the kernel coding standard defined in Documentation/CodingStyle, even when writing “throw away” code.
Step 0: Checkout and Compile the Kernel
First, obtain a copy of the LITMUSRT kernel.
$ git clone http://www.litmus-rt.org/src/litmus-rt.git
Next, obtain a copy of liblitmus, the corresponding userspace library
$ git clone http://www.litmus-rt.org/src/liblitmus.git Cloning into liblitmus... $ cd liblitmus/ $ ls INSTALL Makefile README arch bin inc include setsched showsched src tests
Step 1: Dummy File
Create a new file and add it to the build system.
Create the file litmus/sched_demo.c (all file names are relative to the kernel repository).
Edit the file litmus/Makefile to add sched_demo.o to the list named obj-y.
- Compile the kernel to see if everything works.
Step 2: Dummy Plugin
Edit the file litmus/sched_demo.c to declare a dummy plugin (that implements no particular policy and that rejects all tasks).
Step 3: Define the Per-Processor State
In this step, we define the scheduler state on each processor.
Step 4: Augment the Per-Task State
Our scheduler needs to keep track of...
Step 5: Initialize the Scheduler Plugin
Step 6: Initialize new Tasks
Step 7: Enable Admission of Tasks
Step 8: Boot the Kernel in KVM
kvm -gdb tcp::3008 -smp 4 -hda /RTS/litmus-rt/work/kvm-images/bbb-litmus-rt.img -m 2000 -net nic,model=e1000 -net user -k en-us -kernel /home/bbb/ldev/litmus-rt/arch/x86/boot/bzImage -append console=ttyS0 ro root=/dev/hda1 no_timer_check no_timer_check -nographic -redir tcp:2104::22
Step 9: Observe the Debugging TRACE() Log
Step 10: Trace Task Execution
Step 11: Visualize the Trace
Step 12: Record Scheduling Overheads