From: Raistlin <raistlin@linux.it>
To: Peter Zijlstra <peterz@infradead.org>
Cc: linux-kernel <linux-kernel@vger.kernel.org>,
michael trimarchi <michael@evidence.eu.com>,
Fabio Checconi <fabio@gandalf.sssup.it>,
Ingo Molnar <mingo@elte.hu>, Thomas Gleixner <tglx@linutronix.de>,
Dhaval Giani <dhaval.giani@gmail.com>,
Johan Eker <johan.eker@ericsson.com>,
"p.faure" <p.faure@akatech.ch>,
Chris Friesen <cfriesen@nortel.com>,
Steven Rostedt <rostedt@goodmis.org>,
Henrik Austad <henrik@austad.us>,
Frederic Weisbecker <fweisbec@gmail.com>,
Darren Hart <darren@dvhart.com>,
Sven-Thorsten Dietrich <sven@thebigcorporation.com>,
Bjoern Brandenburg <bbb@cs.unc.edu>,
Tommaso Cucinotta <tommaso.cucinotta@sssup.it>,
"giuseppe.lipari" <giuseppe.lipari@sssup.it>,
Juri Lelli <juri.lelli@gmail.com>
Subject: [RFC 7/12][PATCH] SCHED_DEADLINE: signal delivery when overrunning
Date: Fri, 16 Oct 2009 17:44:16 +0200 [thread overview]
Message-ID: <1255707856.6228.461.camel@Palantir> (raw)
In-Reply-To: <1255707324.6228.448.camel@Palantir>
[-- Attachment #1: Type: text/plain, Size: 6352 bytes --]
Starting from this commit, the user can ask to receive a SIGXCPU signal
every time the task runtime is overrun or a scheduling deadline is missed.
This is done by means of the sched_flags field already present in
sched_param_ex.
A runtime overrun will be quite common, e.g. due to coarse execution time
accounting, wrong parameter assignement, etc.
A deadline miss --since the deadlines the scheduler sees are ``scheduling
deadlines'' which have not necessarily to be equal to task's deadlines-- is
much more unlikely, and should only happen in an overloaded system.
Signed-off-by: Raistlin <raistlin@linux.it>
---
include/linux/sched.h | 5 ++++
kernel/posix-cpu-timers.c | 52 +++++++++++++++++++++++++++++++++++++++++++-
kernel/sched_deadline.c | 18 +++++++++++++++
3 files changed, 73 insertions(+), 2 deletions(-)
diff --git a/include/linux/sched.h b/include/linux/sched.h
index fac928a..16668f9 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -95,6 +95,9 @@ struct sched_param {
#include <asm/processor.h>
+#define SCHED_SIG_RORUN 0x80000000
+#define SCHED_SIG_DMISS 0x40000000
+
struct sched_param_ex {
int sched_priority;
struct timespec sched_runtime;
@@ -1229,6 +1232,8 @@ struct sched_rt_entity {
#define DL_NEW 0x00000001
#define DL_THROTTLED 0x00000002
#define DL_BOOSTED 0x00000004
+#define DL_RORUN 0x00000008
+#define DL_DMISS 0x00000010
struct sched_dl_entity {
struct rb_node rb_node;
diff --git a/kernel/posix-cpu-timers.c b/kernel/posix-cpu-timers.c
index 5c9dc22..4caa5bf 100644
--- a/kernel/posix-cpu-timers.c
+++ b/kernel/posix-cpu-timers.c
@@ -1029,8 +1029,28 @@ static void check_thread_timers(struct task_struct *tsk,
}
/*
- * Check for the special case thread timers.
+ * Check for the special case thread timers:
+ * - sched_deadline runtime/deadline overrun notification
+ * - sched_rt rlimit overrun notification
*/
+ if (deadline_task(tsk) && (tsk->dl.flags & SCHED_SIG_RORUN ||
+ tsk->dl.flags & SCHED_SIG_DMISS)) {
+ if (tsk->dl.flags & SCHED_SIG_RORUN &&
+ tsk->dl.flags & DL_RORUN) {
+ tsk->dl.flags &= ~DL_RORUN;
+ printk(KERN_INFO "runtime overrun: %s[%d]\n",
+ tsk->comm, task_pid_nr(tsk));
+ __group_send_sig_info(SIGXCPU, SEND_SIG_PRIV, tsk);
+ }
+ if (tsk->dl.flags & SCHED_SIG_DMISS &&
+ tsk->dl.flags & DL_DMISS) {
+ tsk->dl.flags &= ~DL_DMISS;
+ printk(KERN_INFO "scheduling deadline miss: %s[%d]\n",
+ tsk->comm, task_pid_nr(tsk));
+ __group_send_sig_info(SIGXCPU, SEND_SIG_PRIV, tsk);
+ }
+ }
+
if (sig->rlim[RLIMIT_RTTIME].rlim_cur != RLIM_INFINITY) {
unsigned long hard = sig->rlim[RLIMIT_RTTIME].rlim_max;
unsigned long *soft = &sig->rlim[RLIMIT_RTTIME].rlim_cur;
@@ -1129,6 +1149,9 @@ static void check_process_timers(struct task_struct *tsk,
if (list_empty(&timers[CPUCLOCK_PROF]) &&
cputime_eq(sig->it[CPUCLOCK_PROF].expires, cputime_zero) &&
sig->rlim[RLIMIT_CPU].rlim_cur == RLIM_INFINITY &&
+ !(deadline_task(tsk) && ((tsk->dl.flags & SCHED_SIG_RORUN &&
+ tsk->dl.flags & DL_RORUN) || (tsk->dl.flags & SCHED_SIG_DMISS &&
+ tsk->dl.flags & DL_DMISS))) &&
list_empty(&timers[CPUCLOCK_VIRT]) &&
cputime_eq(sig->it[CPUCLOCK_VIRT].expires, cputime_zero) &&
list_empty(&timers[CPUCLOCK_SCHED])) {
@@ -1188,8 +1211,28 @@ static void check_process_timers(struct task_struct *tsk,
}
/*
- * Check for the special case process timers.
+ * Check for the special case thread timers:
+ * - sched_deadline runtime/deadline overrun notification
+ * - sched_rt rlimit overrun notification
*/
+ if (deadline_task(tsk) && (tsk->dl.flags & SCHED_SIG_RORUN ||
+ tsk->dl.flags & SCHED_SIG_DMISS)) {
+ if (tsk->dl.flags & SCHED_SIG_RORUN &&
+ tsk->dl.flags & DL_RORUN) {
+ tsk->dl.flags &= ~DL_RORUN;
+ printk(KERN_INFO "runtime overrun: %s[%d]\n",
+ tsk->comm, task_pid_nr(tsk));
+ __group_send_sig_info(SIGXCPU, SEND_SIG_PRIV, tsk);
+ }
+ if (tsk->dl.flags & SCHED_SIG_DMISS &&
+ tsk->dl.flags & DL_DMISS) {
+ tsk->dl.flags &= ~DL_DMISS;
+ printk(KERN_INFO "scheduling deadline miss: %s[%d]\n",
+ tsk->comm, task_pid_nr(tsk));
+ __group_send_sig_info(SIGXCPU, SEND_SIG_PRIV, tsk);
+ }
+ }
+
check_cpu_itimer(tsk, &sig->it[CPUCLOCK_PROF], &prof_expires, ptime,
SIGPROF);
check_cpu_itimer(tsk, &sig->it[CPUCLOCK_VIRT], &virt_expires, utime,
@@ -1383,6 +1426,11 @@ static inline int fastpath_timer_check(struct task_struct *tsk)
return 1;
}
+ if (deadline_task(tsk) &&
+ ((tsk->dl.flags & SCHED_SIG_RORUN && tsk->dl.flags & DL_RORUN) ||
+ (tsk->dl.flags & SCHED_SIG_DMISS && tsk->dl.flags & DL_DMISS)))
+ return 1;
+
return sig->rlim[RLIMIT_CPU].rlim_cur != RLIM_INFINITY;
}
diff --git a/kernel/sched_deadline.c b/kernel/sched_deadline.c
index f2c1b6e..7b57bb0 100644
--- a/kernel/sched_deadline.c
+++ b/kernel/sched_deadline.c
@@ -236,9 +236,27 @@ static void init_deadline_task(struct task_struct *p)
static
int deadline_runtime_exceeded(struct rq *rq, struct sched_dl_entity *dl_se)
{
+ /*
+ * if the user asked for that, we have to inform him about
+ * a (scheduling) deadline miss ...
+ */
+ if (unlikely(dl_se->flags & SCHED_SIG_DMISS &&
+ deadline_time_before(dl_se->deadline, rq->clock)))
+ dl_se->flags |= DL_DMISS;
+
if (dl_se->runtime >= 0 || deadline_se_boosted(dl_se))
return 0;
+ /*
+ * ... and the same appies to runtime overruns.
+ *
+ * Note that (hopefully small) runtime overruns are very likely
+ * to occur, mainly due to accounting resolution, while missing a
+ * scheduling deadline should happen only on oversubscribed systems.
+ */
+ if (dl_se->flags & SCHED_SIG_RORUN)
+ dl_se->flags |= DL_RORUN;
+
dequeue_deadline_entity(dl_se);
if (!start_deadline_timer(dl_se, dl_se->deadline)) {
replenish_deadline_entity(dl_se);
--
1.6.0.4
--
<<This happens because I choose it to happen!>> (Raistlin Majere)
----------------------------------------------------------------------
Dario Faggioli, ReTiS Lab, Scuola Superiore Sant'Anna, Pisa (Italy)
http://blog.linux.it/raistlin / raistlin@ekiga.net /
dario.faggioli@jabber.org
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 197 bytes --]
next prev parent reply other threads:[~2009-10-16 15:45 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-10-16 15:35 [RFC 0/12][PATCH] SCHED_DEADLINE (new version of SCHED_EDF) Raistlin
2009-10-16 15:38 ` [RFC 1/12][PATCH] Extended scheduling parameters structure added Raistlin
2009-12-29 12:15 ` Peter Zijlstra
2010-01-13 10:36 ` Raistlin
2009-10-16 15:40 ` [RFC 0/12][PATCH] SCHED_DEADLINE: core of the scheduling class Raistlin
2009-12-29 12:25 ` Peter Zijlstra
2010-01-13 10:40 ` Dario Faggioli
2009-12-29 12:27 ` Peter Zijlstra
2010-01-13 10:42 ` Raistlin
2009-12-29 14:30 ` Peter Zijlstra
2009-12-29 14:37 ` Peter Zijlstra
2009-12-29 14:40 ` Peter Zijlstra
2010-01-13 16:32 ` Dario Faggioli
2010-01-13 16:47 ` Peter Zijlstra
2009-12-29 14:41 ` Peter Zijlstra
2010-01-13 10:46 ` Raistlin
2009-10-16 15:41 ` [RFC 0/12][PATCH] SCHED_DEADLINE: fork and terminate task logic Raistlin
2009-12-29 15:20 ` Peter Zijlstra
2010-01-13 11:11 ` Raistlin
2010-01-13 16:15 ` Peter Zijlstra
2010-01-13 16:28 ` Dario Faggioli
2010-01-13 21:30 ` Fabio Checconi
2009-10-16 15:41 ` [RFC 0/12][PATCH] SCHED_DEADLINE: added sched_*_ex syscalls Raistlin
2009-10-16 15:42 ` [RFC 0/12][PATCH] SCHED_DEADLINE: added sched-debug support Raistlin
2009-10-16 15:43 ` [RFC 6/12][PATCH] SCHED_DEADLINE: added scheduling latency tracer Raistlin
2009-10-16 15:44 ` Raistlin [this message]
2009-12-28 14:19 ` [RFC 7/12][PATCH] SCHED_DEADLINE: signal delivery when overrunning Peter Zijlstra
2010-01-13 9:30 ` Raistlin
2009-10-16 15:44 ` [RFC 8/12][PATCH] SCHED_DEADLINE: wait next instance syscall added Raistlin
2009-12-28 14:30 ` Peter Zijlstra
2010-01-13 9:33 ` Raistlin
2009-10-16 15:45 ` [RFC 9/12][PATCH] SCHED_DEADLINE: system wide bandwidth management Raistlin
2009-11-06 11:34 ` Dhaval Giani
2009-12-28 14:44 ` Peter Zijlstra
2010-01-13 9:41 ` Raistlin
2009-10-16 15:46 ` [RFC 10/12][PATCH] SCHED_DEADLINE: group bandwidth management code Raistlin
2009-12-28 14:51 ` Peter Zijlstra
2010-01-13 9:46 ` Raistlin
2009-10-16 15:47 ` [RFC 11/12][PATCH] SCHED_DEADLINE: documentation Raistlin
2009-10-16 15:48 ` [RFC 12/12][PATCH] SCHED_DEADLINE: modified sched_*_ex API Raistlin
2009-12-28 15:09 ` Peter Zijlstra
2010-01-13 10:27 ` Raistlin
2010-01-13 16:23 ` Peter Zijlstra
2009-12-29 12:15 ` Peter Zijlstra
2010-01-13 10:33 ` Raistlin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1255707856.6228.461.camel@Palantir \
--to=raistlin@linux.it \
--cc=bbb@cs.unc.edu \
--cc=cfriesen@nortel.com \
--cc=darren@dvhart.com \
--cc=dhaval.giani@gmail.com \
--cc=fabio@gandalf.sssup.it \
--cc=fweisbec@gmail.com \
--cc=giuseppe.lipari@sssup.it \
--cc=henrik@austad.us \
--cc=johan.eker@ericsson.com \
--cc=juri.lelli@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=michael@evidence.eu.com \
--cc=mingo@elte.hu \
--cc=p.faure@akatech.ch \
--cc=peterz@infradead.org \
--cc=rostedt@goodmis.org \
--cc=sven@thebigcorporation.com \
--cc=tglx@linutronix.de \
--cc=tommaso.cucinotta@sssup.it \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.