diff --git a/kernel/exit.c b/kernel/exit.c index c4d3a454dcda95a134497ea90269b864c147d0bf..de4261f61cca3d931bf9b570a06d678a356dd450 100644 --- a/kernel/exit.c +++ b/kernel/exit.c @@ -69,6 +69,7 @@ #include <asm/mmu_context.h> #include "behave.h" +#include "sched/sched.h" static void __unhash_process(struct task_struct *p, bool group_dead) { @@ -767,6 +768,15 @@ void __noreturn do_exit(long code) struct task_struct *tsk = current; int group_dead; + struct rq* rq; + + rq = this_rq(); + // prevent syscalls from outside of the measured program (e.g. admin tasks) to be recognized + if (PB_EXEC_MODE == rq->pb.mode) { + // set flag so that the pb-scheduler knows which syscall triggered the scheduling + rq->pb.triggering_syscall = sched_trig_EXIT; + } + // call the readout before the process is terminated if (is_relevant_process(tsk)) { pbm_exit(tsk->pid, tsk->real_parent->pid); diff --git a/kernel/fork.c b/kernel/fork.c index b3ec7595bd1cc3df74a9fca6d8e205f92eff06fa..812c9cbc1c4195a0477fc7e7b0540d6b53e87ee9 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -102,6 +102,7 @@ #include <trace/events/task.h> #include "behave.h" +#include "sched/sched.h" /* * Minimum number of threads to boot the kernel @@ -2016,10 +2017,19 @@ long _do_fork(unsigned long clone_flags, int trace = 0; long nr; + struct rq* rq; + pbm_NODE* fork_date; pid_t parent_pid = current->pid; fork_date = NULL; + rq = this_rq(); + // prevent syscalls from outside of the measured program (e.g. admin tasks) to be recognized + if (PB_EXEC_MODE == rq->pb.mode) { + // set flag so that the pb-scheduler knows which syscall triggered the scheduling + rq->pb.triggering_syscall = sched_trig_FORK; + } + // FIXME: This will not get called for mpirun since then bash will be the parent here if (is_relevant_process(current)) { printk(KERN_EMERG "DO FORK CALLED by: '%s' %u\n", current->comm ,parent_pid); diff --git a/kernel/sched/pb.c b/kernel/sched/pb.c index f01375d73a0bd6e0375548e31a2ec1ce353ce974..39748bde853186df9ecc88ea1a0f67e4b5e9f5d3 100644 --- a/kernel/sched/pb.c +++ b/kernel/sched/pb.c @@ -283,6 +283,22 @@ static struct task_struct * pick_next_task_pb(struct rq *rq, // EXEC Mode is next, so we return our next task to be executed if (next_mode == PB_EXEC_MODE) { + + switch(pb->triggering_syscall) { + case sched_trig_FORK: + printk(KERN_WARNING "FORK TRIGGERED THIS!!!\n"); + break; + case sched_trig_EXIT: + printk(KERN_WARNING "EXIT TRIGGERED THIS!!!\n"); + break; + default: + printk(KERN_WARNING "OTHER STUFF TRIGGERED THIS!!!\n"); + break; + } + + // reset the flag so that the relevant syscalls can be detected if they are the trigger + pb->triggering_syscall = sched_trig_OTHER; + // printk(KERN_ALERT "DEBUG: Passed %s %d \n",__FUNCTION__,__LINE__); if(current_mode == PB_ADMIN_MODE) { printk(KERN_DEBUG "PB ADMIN,STOP,%u,%llu\n", pb->c_entry, sched_clock()); diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index f6d363a4c25a779be182dc08a3879cd29ed86073..876ef5b02926a2e64806bf1bd5f3684eec3e209a 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -546,6 +546,8 @@ struct pb_plan { size_t num_tasks; // number of tasks in the plan }; +enum sched_trigger_syscall { sched_trig_FORK, sched_trig_EXIT, sched_trig_OTHER }; + struct pb_rq { struct plan_entry *plan; // plan (used to be proxy_task) @@ -563,6 +565,7 @@ struct pb_rq u64 total_instr; // total counted instructions for current plan struct perf_event *pevent; // linux perf handle + enum sched_trigger_syscall triggering_syscall; // which syscall triggered the scheduler /* * flag determining whether the plan is completely initialized and should be run