Skip to content

Commit

Permalink
sched/deadline: Add period support for SCHED_DEADLINE tasks
Browse files Browse the repository at this point in the history
Make it possible to specify a period (different or equal than
deadline) for -deadline tasks. Relative deadlines (D_i) are used on
task arrivals to generate new scheduling (absolute) deadlines as "d =
t + D_i", and periods (P_i) to postpone the scheduling deadlines as "d
= d + P_i" when the budget is zero.

This is in general useful to model (and schedule) tasks that have slow
activation rates (long periods), but have to be scheduled soon once
activated (short deadlines).

Signed-off-by: Harald Gustafsson <harald.gustafsson@ericsson.com>
Signed-off-by: Dario Faggioli <raistlin@linux.it>
Signed-off-by: Juri Lelli <juri.lelli@gmail.com>
Signed-off-by: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/1383831828-15501-7-git-send-email-juri.lelli@gmail.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
  • Loading branch information
Harald Gustafsson authored and Ingo Molnar committed Jan 13, 2014
1 parent 239be4a commit 755378a
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 5 deletions.
1 change: 1 addition & 0 deletions include/linux/sched.h
Original file line number Diff line number Diff line change
Expand Up @@ -1102,6 +1102,7 @@ struct sched_dl_entity {
*/
u64 dl_runtime; /* maximum runtime for each instance */
u64 dl_deadline; /* relative deadline of each instance */
u64 dl_period; /* separation of two instances (period) */

/*
* Actual scheduling parameters. Initialized with the values above,
Expand Down
10 changes: 8 additions & 2 deletions kernel/sched/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -1723,6 +1723,7 @@ static void __sched_fork(unsigned long clone_flags, struct task_struct *p)
hrtimer_init(&p->dl.dl_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
p->dl.dl_runtime = p->dl.runtime = 0;
p->dl.dl_deadline = p->dl.deadline = 0;
p->dl.dl_period = 0;
p->dl.flags = 0;

INIT_LIST_HEAD(&p->rt.run_list);
Expand Down Expand Up @@ -3026,6 +3027,7 @@ __setparam_dl(struct task_struct *p, const struct sched_attr *attr)
init_dl_task_timer(dl_se);
dl_se->dl_runtime = attr->sched_runtime;
dl_se->dl_deadline = attr->sched_deadline;
dl_se->dl_period = attr->sched_period ?: dl_se->dl_deadline;
dl_se->flags = attr->sched_flags;
dl_se->dl_throttled = 0;
dl_se->dl_new = 1;
Expand Down Expand Up @@ -3067,19 +3069,23 @@ __getparam_dl(struct task_struct *p, struct sched_attr *attr)
attr->sched_priority = p->rt_priority;
attr->sched_runtime = dl_se->dl_runtime;
attr->sched_deadline = dl_se->dl_deadline;
attr->sched_period = dl_se->dl_period;
attr->sched_flags = dl_se->flags;
}

/*
* This function validates the new parameters of a -deadline task.
* We ask for the deadline not being zero, and greater or equal
* than the runtime.
* than the runtime, as well as the period of being zero or
* greater than deadline.
*/
static bool
__checkparam_dl(const struct sched_attr *attr)
{
return attr && attr->sched_deadline != 0 &&
(s64)(attr->sched_deadline - attr->sched_runtime) >= 0;
(attr->sched_period == 0 ||
(s64)(attr->sched_period - attr->sched_deadline) >= 0) &&
(s64)(attr->sched_deadline - attr->sched_runtime ) >= 0;
}

/*
Expand Down
10 changes: 7 additions & 3 deletions kernel/sched/deadline.c
Original file line number Diff line number Diff line change
Expand Up @@ -289,7 +289,7 @@ static void replenish_dl_entity(struct sched_dl_entity *dl_se)
* arbitrary large.
*/
while (dl_se->runtime <= 0) {
dl_se->deadline += dl_se->dl_deadline;
dl_se->deadline += dl_se->dl_period;
dl_se->runtime += dl_se->dl_runtime;
}

Expand Down Expand Up @@ -329,9 +329,13 @@ static void replenish_dl_entity(struct sched_dl_entity *dl_se)
*
* This function returns true if:
*
* runtime / (deadline - t) > dl_runtime / dl_deadline ,
* runtime / (deadline - t) > dl_runtime / dl_period ,
*
* IOW we can't recycle current parameters.
*
* Notice that the bandwidth check is done against the period. For
* task with deadline equal to period this is the same of using
* dl_deadline instead of dl_period in the equation above.
*/
static bool dl_entity_overflow(struct sched_dl_entity *dl_se, u64 t)
{
Expand All @@ -355,7 +359,7 @@ static bool dl_entity_overflow(struct sched_dl_entity *dl_se, u64 t)
* of anything below microseconds resolution is actually fiction
* (but still we want to give the user that illusion >;).
*/
left = (dl_se->dl_deadline >> 10) * (dl_se->runtime >> 10);
left = (dl_se->dl_period >> 10) * (dl_se->runtime >> 10);
right = ((dl_se->deadline - t) >> 10) * (dl_se->dl_runtime >> 10);

return dl_time_before(right, left);
Expand Down

0 comments on commit 755378a

Please sign in to comment.