mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-24 01:43:22 +00:00
Halt the idle CPUs
This commit is contained in:
committed by
Tate, Hongliang Tian
parent
265bc25dd7
commit
30ec0be210
@ -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.
|
||||
|
@ -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)) {
|
||||
|
Reference in New Issue
Block a user