From 6538d5972f177674b86a1964fbca67eccf322586 Mon Sep 17 00:00:00 2001
From: Stefan Moll <stefan@stefaus.de>
Date: Tue, 27 Sep 2022 12:05:15 +0200
Subject: [PATCH] return task back to cfs after plane is done

---
 kernel/sched/pb.c | 49 ++++++++++++++++++++++++++---------------------
 1 file changed, 27 insertions(+), 22 deletions(-)

diff --git a/kernel/sched/pb.c b/kernel/sched/pb.c
index bb786215bdaf..3fae16b3ec4f 100644
--- a/kernel/sched/pb.c
+++ b/kernel/sched/pb.c
@@ -157,30 +157,8 @@ EXPORT_SYMBOL(init_pb_rq);
 static void enqueue_task_pb(struct rq *rq, struct task_struct *p, int flags)
 {
 	struct pb_rq *pb = &(rq->pb);
-	bool premature_finish = false;
 
 	pb->waiting_on_io = 0;
-
-	pb->c_entry++;
-
-	/**
-		* Don't schedule a task that is dead. (e.g. plan was incorrect and program finished quicker)
-		* TODO: if we have multiple tasks structs try the next plan entry
-		*/
-	if (pb->c_entry < pb->size && pb->plan[pb->c_entry].task_struct->state == TASK_DEAD) {
-		premature_finish = true;
-		pb->is_initialized = 0;
-	}
-
-	if (pb->c_entry >= pb->size || premature_finish) {
-		if (premature_finish) {
-			printk(KERN_WARNING "PLAN TERMINATED PREMATURELY \n");
-		}
-		else {
-			printk(KERN_WARNING "PLAN DONE \n");
-		}
-	}
-	printk("DONE");
 }
 
 // task started IO and thus it is finished
@@ -191,6 +169,8 @@ static void dequeue_task_pb(struct rq *rq, struct task_struct *p, int flags)
 	u64 perf_counter;
 	u64 counter_diff;
 	u64 read_error;
+	bool premature_finish = false;
+
 
 	if (pb->waiting_on_io) {
 		return;
@@ -221,6 +201,31 @@ static void dequeue_task_pb(struct rq *rq, struct task_struct *p, int flags)
 
 		printk(KERN_WARNING "PB TASK %llu RAN %llu INSTRUCTIONS TOO LONG\n", pb->plan[pb->c_entry].task_id, over_time);
 	}
+
+
+	pb->c_entry++;
+
+	/**
+		* Don't schedule a task that is dead. (e.g. plan was incorrect and program finished quicker)
+		* TODO: if we have multiple tasks structs try the next plan entry
+		*/
+	if (pb->c_entry < pb->size && pb->plan[pb->c_entry].task_struct->state == TASK_DEAD) {
+		premature_finish = true;
+	}
+
+	if (pb->c_entry >= pb->size || premature_finish) {
+		if (premature_finish) {
+			printk(KERN_WARNING "PLAN TERMINATED PREMATURELY \n");
+		}
+		else {
+			printk(KERN_WARNING "PLAN DONE \n");
+		}
+
+		// set back to cfs for completion of task
+		pb->is_initialized = 0;
+		pb->plan[0].task_struct->sched_class = &fair_sched_class;
+		resched_curr(rq);
+	}
 }
 
 static void yield_task_pb(struct rq *rq)
-- 
GitLab