[linux-audio-dev] new realtime scheduling policy
Roger Larsson
roger.larsson at skelleftea.mail.telia.com
Tue Mar 18 12:22:00 UTC 2003
On Tuesday 18 March 2003 08:45, rm wrote:
> hi all,
>
> so i've tried to make a new scheduling policy for linux. i've
> called it SCHED_USERFIFO. the intent is basically to allow a process
> ask for x amount of processor time out of every y jiffies. (the user
> part is in the hope that the administrator can set rlimits on the
> amount of percentage of time requested and allow non-priviledged users
> to use this policy without being able to complete hang the box).
With 2.4 kernels there are very few jiffies to share, 2.5 kernels have more.
But jiffies are not a good unit...
The second problem is that this patch adds code to hot areas in the kernel -
it will slow down context switching for all processes.
This can be made slightly better if you add unlikely/likely from
linux/compiler.h
> - - -
> here is the kernel patch.
>
> --- pristine/linux-2.4.20/kernel/sched.c 2003-03-17 23:24:02.000000000 -0500
> +++ linux/kernel/sched.c 2003-03-17 22:11:13.000000000 -0500
> @@ -188,7 +188,42 @@
> * runqueue (taking priorities within processes
> * into account).
> */
> +
> + if (p->policy == SCHED_USERFIFO) {
> +
> + /*
> + * check if we are in the right time period
> + *
> + * XXX if it burns though it's entire period and
> + * into the next ?
> + *
> + */
> + if (jiffies >= p->t_period_end) {
this wont work when jiffies wrap... I think there are functions/macros
that can check this - time_after_eq?
linux/include/linux/timer.h
> @@ -964,6 +999,15 @@
> retval = 0;
> p->policy = policy;
> p->rt_priority = lp.sched_priority;
> +
> + if (policy == SCHED_USERFIFO) {
> + /* FIXME: no checks, doesn't handle jiffy rollover */
> + p->t_period_length = lp.period_length;
> + p->t_period_reserved = lp.period_reserved;
> + p->t_period_start = jiffies;
> + p->t_period_end = p->t_period_length + p->t_period_start;
> + p->t_period_remain = p->t_period_reserved;
jiffies frequency depends on architecture and compilation options.
At least you should scale with HZ in some way for wall clock parameters.
(micro/nano seconds?)
> --- pristine/linux-2.4.20/include/linux/sched.h 2003-03-17
> @@ -419,6 +422,15 @@
>
> /* journalling filesystem info */
> void *journal_info;
> +
> +
> + /* our extra stuff */
> +
> + unsigned long t_period_end;
> + unsigned long t_period_start;
> + unsigned long t_period_remain;
> + unsigned long t_period_length;
> + unsigned long t_period_reserved;
This will not be liked - growing task_struct with 4*5=20 bytes for every
task... (This is probably the most important issue)
Could this data be made CPU local?
Assume that SCHED_USERFIFO were handled in a strict FIFO manner, no
priorities, then a running process of that class can only be suspended by a
SCHED_FIFO or SCHED_RR
Anyway, I think this patch has its place on linux-kernel. It will most likely
be rejected but it shows that people are interested in these issues...
(Who knows Ingo might get another bright idea... :-)
/RogerL
--
Roger Larsson
Skellefteå
Sweden
More information about the Linux-audio-dev
mailing list