From 54bc672887e986bbcfc23ea95b9d8727582a1e60 Mon Sep 17 00:00:00 2001 From: derMihai <mihairenea@gmail.com> Date: Mon, 18 Mar 2019 19:51:50 +0100 Subject: [PATCH] Commented bugs, TODO's and things that are (at least for me) unclear --- kernel/sched/pb.c | 14 +++++++++++--- kernel/sched/perf_error_detection.c | 19 +++++++++++++++++-- kernel/sched/sched.h | 15 ++++++++++++++- 3 files changed, 42 insertions(+), 6 deletions(-) diff --git a/kernel/sched/pb.c b/kernel/sched/pb.c index 926432579cc5..ef82c517a410 100644 --- a/kernel/sched/pb.c +++ b/kernel/sched/pb.c @@ -122,9 +122,15 @@ static struct task_struct * pick_next_task_pb(struct rq *rq, if (next_mode == PB_EXEC_MODE) { if (current_mode == PB_EXEC_MODE){ - int perf_counter = terminate_perf_event(pb->pevent, pb->plan[pb->c_entry].task_id); + /* + * !!! perf_counter contains return value of perf_event_release_kernel(), not the event counter !!! + */ + // u64 pevent_cntval; + int perf_counter = terminate_perf_event(pb->pevent, pb->plan[pb->c_entry].task_id /*, &pevent_cntval */); //error detection + if (perf_counter < pb->plan[pb->c_entry].n_instr){ + // if (pevent_cntval < pb->plan[pb->c_entry].n_instr){ printk(KERN_WARNING "PB TASK %llu RAN TOO SHORT\n",pb->plan[pb->c_entry].task_id); } pb->c_entry++; @@ -143,7 +149,7 @@ static struct task_struct * pick_next_task_pb(struct rq *rq, } }else if(current_mode == PB_ADMIN_MODE){ printk(KERN_DEBUG "PB ADMIN,STOP,%u,%llu\n", pb->c_entry, sched_clock()); - }else{ + }else{ // PB_DISABLED_MODE int perf_init_res = init_perf_event(pb->plan[pb->c_entry], &pb->pevent); if(perf_init_res < 0){ @@ -177,7 +183,9 @@ static void set_curr_task_pb(struct rq *rq) // NOP } - +/* + * TODO: Make sure this does't interrupt determine_next_mode_pb() and pick_next_task_pb() + */ static void task_tick_pb(struct rq *rq, struct task_struct *p, int queued) { int next_mode; diff --git a/kernel/sched/perf_error_detection.c b/kernel/sched/perf_error_detection.c index 8f02f229f087..68b46e2776b6 100644 --- a/kernel/sched/perf_error_detection.c +++ b/kernel/sched/perf_error_detection.c @@ -3,6 +3,15 @@ #define PERF_SAMPLE_PERIOD_SIZE 100000 +/* + * Our understanding of perf so far. Please correct as needed. + * + * An event in perf's terms is an instruction in our case. + * A sample is a fixed number of events that CAN trigger a wakeup_event (but not the only way). + * An overflow event is triggered by a fixed number of wakeup_event. + * + */ + //initialize perf event for new task int init_perf_event(struct plan_entry plan_entry, struct perf_event **pevent){ struct perf_event_attr pe; @@ -34,8 +43,14 @@ int init_perf_event(struct plan_entry plan_entry, struct perf_event **pevent){ } //terminate perf event - return performance counter value -long long terminate_perf_event(struct perf_event *pevent, u64 task_id){ - +/* + * TODO: return the event counter value + * + */ +long long terminate_perf_event(struct perf_event *pevent, u64 task_id /*, u64 *pevent_cntval */){ + + // TODO: + // *pevent_cntval = get the counter value here return perf_event_release_kernel(pevent); } diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index dbbb652ab019..a451e57c0fab 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -537,7 +537,7 @@ struct pb_rq { // currently executed entry of the plan unsigned int c_entry; // pointer to the dummy task - struct task_struct *proxy_task; + struct task_struct *proxy_task; //TODO: We should comment this out and iterate the plan accordingly // amount of timer consecutive timer interrupts for pb tasks u64 n_pb_cycles; @@ -552,6 +552,8 @@ struct pb_rq { // one of PB_DISABLED_MODE, PB_EXEC_MODE, PB_ADMIN_MODE int mode; + + //TODO: Do we still need those? int measure_k; u64 kstart; u64 ktime; @@ -881,6 +883,11 @@ static inline int determine_next_mode_pb(struct rq *rq) { // initial switch if (pb->mode == PB_DISABLED_MODE && + //TODO: + /* + * We have to iterate the Plan, and think about a mechanism to signal that a plan is ready + * to be processed - maybe set pb->size 0 when the plan is done, n when a plan with n entries is ready. + */ pb->proxy_task != NULL) { return PB_EXEC_MODE; @@ -890,6 +897,9 @@ static inline int determine_next_mode_pb(struct rq *rq) if (pb->mode == PB_EXEC_MODE) { //stay for n timer interrupts cycles in exec mode + /* + * Is the tick interrupt active in this moment? + */ if(pb->count_pb_cycles > pb->n_pb_cycles){ mode = PB_ADMIN_MODE; pb->count_pb_cycles = 0; @@ -900,6 +910,9 @@ static inline int determine_next_mode_pb(struct rq *rq) else if (pb->mode == PB_ADMIN_MODE) { //stay for n timer interrupt cylces in uall mode for admin tasks + /* + * Is the tick interrupt active in this moment? + */ if(pb->count_admin_cycles > pb->n_admin_cycles){ mode = PB_EXEC_MODE; pb->count_admin_cycles = 0; -- GitLab