summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDennis Kobert <dennis@kobert.dev>2025-03-31 16:42:17 +0200
committerDennis Kobert <dennis@kobert.dev>2025-03-31 16:42:17 +0200
commit90dc696e41db726cb43b5783212bd76872c108b7 (patch)
tree1ad4da5066d1d79f09c304a8d3007a071f4e98ef
parent5572834e86dc24284e8bd9e063936004adf02894 (diff)
Peridiodcally intersperse tasks from no budget queue
-rw-r--r--src/scheduler.rs9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/scheduler.rs b/src/scheduler.rs
index e0530b5..05a4986 100644
--- a/src/scheduler.rs
+++ b/src/scheduler.rs
@@ -31,6 +31,7 @@ pub struct Scheduler<'a> {
no_budget_task_queue: VecDeque<QueuedTask>,
managed_tasks: HashMap<Pid, Task>,
maximum_budget: u64,
+ tasks_scheduled: u64,
own_pid: Pid,
p_cores: Range<i32>,
e_cores: Range<i32>,
@@ -117,6 +118,7 @@ impl<'a> Scheduler<'a> {
maximum_budget: u64::MAX,
own_pid: process::id() as i32,
p_cores,
+ tasks_scheduled: 0,
e_cores,
topology,
e_core_selector: selector,
@@ -186,6 +188,7 @@ impl<'a> Scheduler<'a> {
}
fn dispatch_next_task(&mut self) {
+ self.tasks_scheduled += 1;
if let Some(task) = self.task_queue.pop_front() {
let mut dispatched_task = DispatchedTask::new(&task);
//TODO: do we have to migrate tasks back from e cores?
@@ -212,7 +215,11 @@ impl<'a> Scheduler<'a> {
self.bpf.notify_complete(
self.task_queue.len() as u64 + self.no_budget_task_queue.len() as u64,
);
- } else if let Some(task) = self.no_budget_task_queue.pop_front() {
+ }
+ if !(self.task_queue.is_empty() || self.tasks_scheduled % 10 == 0) {
+ return;
+ }
+ if let Some(task) = self.no_budget_task_queue.pop_front() {
let mut dispatched_task = DispatchedTask::new(&task);
// Low budget tasks go to e-cores