Halt the idle CPUs

This commit is contained in:
Zhang Junyang
2025-03-05 11:31:56 +08:00
committed by Tate, Hongliang Tian
parent 265bc25dd7
commit 30ec0be210
6 changed files with 48 additions and 12 deletions

View File

@ -39,10 +39,7 @@ use ostd::{
use process::Process;
use sched::SchedPolicy;
use crate::{
prelude::*,
thread::{kernel_thread::ThreadOptions, Thread},
};
use crate::{prelude::*, thread::kernel_thread::ThreadOptions};
extern crate alloc;
extern crate lru;
@ -112,8 +109,10 @@ fn ap_init() {
let cpu_id = preempt_guard.current_cpu();
drop(preempt_guard);
log::info!("Kernel idle thread for CPU #{} started.", cpu_id.as_usize());
loop {
Thread::yield_now();
crate::thread::Thread::yield_now();
ostd::cpu::sleep_for_interrupt();
}
}
let preempt_guard = ostd::task::disable_preempt();
@ -154,9 +153,8 @@ fn init_thread() {
.expect("Run init process failed.");
// Wait till initproc become zombie.
while !initproc.status().is_zombie() {
// We don't have preemptive scheduler now.
// The long running init thread should yield its own execution to allow other tasks to go on.
Thread::yield_now();
crate::thread::Thread::yield_now();
ostd::cpu::sleep_for_interrupt();
}
// TODO: exit via qemu isa debug device should not be the only way.

View File

@ -213,9 +213,18 @@ impl Scheduler for ClassScheduler {
return None;
}
// Preempt if the new task has a higher priority.
let should_preempt = rq
.current
.as_ref()
.is_none_or(|((_, rq_current_thread), _)| {
thread.sched_attr().policy() < rq_current_thread.sched_attr().policy()
});
thread.sched_attr().set_last_cpu(cpu);
rq.enqueue_entity((task, thread), Some(flags));
Some(cpu)
should_preempt.then_some(cpu)
}
fn local_mut_rq_with(&self, f: &mut dyn FnMut(&mut dyn LocalRunQueue)) {