diff options
| author | Bjoern Brandenburg <bbb@mpi-sws.org> | 2015-08-09 07:18:50 -0400 |
|---|---|---|
| committer | Bjoern Brandenburg <bbb@mpi-sws.org> | 2017-05-26 17:12:33 -0400 |
| commit | 3e53de728b191fbd0de09cc2283878e76afa7917 (patch) | |
| tree | 868207eedb9ea5f7433b90b9bf410fb28d52c460 /kernel | |
| parent | b5506ae89a16f96120e68a994ade593366551849 (diff) | |
Hook into fork(), exec(), and exit()
Allow LITMUS^RT to do some work when a process is created or
terminated.
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/exit.c | 4 | ||||
| -rw-r--r-- | kernel/fork.c | 6 | ||||
| -rw-r--r-- | kernel/sched/core.c | 9 |
3 files changed, 18 insertions, 1 deletions
diff --git a/kernel/exit.c b/kernel/exit.c index 3076f3089919..89ea9c8a7305 100644 --- a/kernel/exit.c +++ b/kernel/exit.c | |||
| @@ -60,6 +60,8 @@ | |||
| 60 | #include <asm/pgtable.h> | 60 | #include <asm/pgtable.h> |
| 61 | #include <asm/mmu_context.h> | 61 | #include <asm/mmu_context.h> |
| 62 | 62 | ||
| 63 | extern void exit_od_table(struct task_struct *t); | ||
| 64 | |||
| 63 | static void __unhash_process(struct task_struct *p, bool group_dead) | 65 | static void __unhash_process(struct task_struct *p, bool group_dead) |
| 64 | { | 66 | { |
| 65 | nr_threads--; | 67 | nr_threads--; |
| @@ -809,6 +811,8 @@ void __noreturn do_exit(long code) | |||
| 809 | tty_audit_exit(); | 811 | tty_audit_exit(); |
| 810 | audit_free(tsk); | 812 | audit_free(tsk); |
| 811 | 813 | ||
| 814 | exit_od_table(tsk); | ||
| 815 | |||
| 812 | tsk->exit_code = code; | 816 | tsk->exit_code = code; |
| 813 | taskstats_exit(tsk, group_dead); | 817 | taskstats_exit(tsk, group_dead); |
| 814 | 818 | ||
diff --git a/kernel/fork.c b/kernel/fork.c index 59faac4de181..a8b40275b136 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
| @@ -86,6 +86,9 @@ | |||
| 86 | 86 | ||
| 87 | #include <trace/events/sched.h> | 87 | #include <trace/events/sched.h> |
| 88 | 88 | ||
| 89 | #include <litmus/litmus.h> | ||
| 90 | #include <litmus/sched_plugin.h> | ||
| 91 | |||
| 89 | #define CREATE_TRACE_POINTS | 92 | #define CREATE_TRACE_POINTS |
| 90 | #include <trace/events/task.h> | 93 | #include <trace/events/task.h> |
| 91 | 94 | ||
| @@ -386,6 +389,9 @@ void __put_task_struct(struct task_struct *tsk) | |||
| 386 | cgroup_free(tsk); | 389 | cgroup_free(tsk); |
| 387 | task_numa_free(tsk); | 390 | task_numa_free(tsk); |
| 388 | security_task_free(tsk); | 391 | security_task_free(tsk); |
| 392 | |||
| 393 | exit_litmus(tsk); | ||
| 394 | |||
| 389 | exit_creds(tsk); | 395 | exit_creds(tsk); |
| 390 | delayacct_tsk_free(tsk); | 396 | delayacct_tsk_free(tsk); |
| 391 | put_signal_struct(tsk->signal); | 397 | put_signal_struct(tsk->signal); |
diff --git a/kernel/sched/core.c b/kernel/sched/core.c index abdf10c424f0..d1a8feda6918 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c | |||
| @@ -2415,6 +2415,8 @@ int sched_fork(unsigned long clone_flags, struct task_struct *p) | |||
| 2415 | */ | 2415 | */ |
| 2416 | p->prio = current->normal_prio; | 2416 | p->prio = current->normal_prio; |
| 2417 | 2417 | ||
| 2418 | litmus_fork(p); | ||
| 2419 | |||
| 2418 | /* | 2420 | /* |
| 2419 | * Revert to default priority/policy on fork if requested. | 2421 | * Revert to default priority/policy on fork if requested. |
| 2420 | */ | 2422 | */ |
| @@ -2436,7 +2438,9 @@ int sched_fork(unsigned long clone_flags, struct task_struct *p) | |||
| 2436 | p->sched_reset_on_fork = 0; | 2438 | p->sched_reset_on_fork = 0; |
| 2437 | } | 2439 | } |
| 2438 | 2440 | ||
| 2439 | if (dl_prio(p->prio)) { | 2441 | if (is_realtime(p)) { |
| 2442 | p->sched_class = &litmus_sched_class; | ||
| 2443 | } else if (dl_prio(p->prio)) { | ||
| 2440 | put_cpu(); | 2444 | put_cpu(); |
| 2441 | return -EAGAIN; | 2445 | return -EAGAIN; |
| 2442 | } else if (rt_prio(p->prio)) { | 2446 | } else if (rt_prio(p->prio)) { |
| @@ -2593,6 +2597,9 @@ void wake_up_new_task(struct task_struct *p) | |||
| 2593 | struct rq_flags rf; | 2597 | struct rq_flags rf; |
| 2594 | struct rq *rq; | 2598 | struct rq *rq; |
| 2595 | 2599 | ||
| 2600 | if (is_realtime(p)) | ||
| 2601 | litmus->task_new(p, 1, 0); | ||
| 2602 | |||
| 2596 | raw_spin_lock_irqsave(&p->pi_lock, rf.flags); | 2603 | raw_spin_lock_irqsave(&p->pi_lock, rf.flags); |
| 2597 | p->state = TASK_RUNNING; | 2604 | p->state = TASK_RUNNING; |
| 2598 | #ifdef CONFIG_SMP | 2605 | #ifdef CONFIG_SMP |
