From 173c4567cf4fb2276ef3f4614b69da7913fc8381 Mon Sep 17 00:00:00 2001 From: zwb0x00 <163394849+zwb0x00@users.noreply.github.com> Date: Fri, 26 Apr 2024 15:33:29 +0800 Subject: [PATCH] feat(sched): add sched_yield (#766) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 实现sched_yield系统调用 --- kernel/src/sched/mod.rs | 1 + kernel/src/sched/syscall.rs | 37 +++++++++++++++++++++++++++++++++++++ kernel/src/syscall/mod.rs | 2 ++ 3 files changed, 40 insertions(+) create mode 100644 kernel/src/sched/syscall.rs diff --git a/kernel/src/sched/mod.rs b/kernel/src/sched/mod.rs index 4b9961e5..7d2fb3f8 100644 --- a/kernel/src/sched/mod.rs +++ b/kernel/src/sched/mod.rs @@ -5,6 +5,7 @@ pub mod fair; pub mod idle; pub mod pelt; pub mod prio; +pub mod syscall; use core::{ intrinsics::{likely, unlikely}, diff --git a/kernel/src/sched/syscall.rs b/kernel/src/sched/syscall.rs new file mode 100644 index 00000000..3c3723e1 --- /dev/null +++ b/kernel/src/sched/syscall.rs @@ -0,0 +1,37 @@ +use system_error::SystemError; + +use crate::arch::cpu::current_cpu_id; +use crate::exception::InterruptArch; +use crate::process::ProcessManager; +use crate::sched::CurrentIrqArch; +use crate::sched::Scheduler; +use crate::syscall::Syscall; + +use super::fair::CompletelyFairScheduler; +use super::{cpu_rq, schedule, SchedMode}; + +impl Syscall { + pub fn do_sched_yield() -> Result { + // 禁用中断 + let irq_guard = unsafe { CurrentIrqArch::save_and_disable_irq() }; + + let pcb = ProcessManager::current_pcb(); + let rq = cpu_rq(pcb.sched_info().on_cpu().unwrap_or(current_cpu_id()).data() as usize); + let (rq, guard) = rq.self_lock(); + + // TODO: schedstat_inc(rq->yld_count); + + CompletelyFairScheduler::yield_task(rq); + + pcb.preempt_disable(); + + drop(guard); + drop(irq_guard); + + pcb.preempt_enable(); // sched_preempt_enable_no_resched(); + + schedule(SchedMode::SM_NONE); + + Ok(0) + } +} diff --git a/kernel/src/syscall/mod.rs b/kernel/src/syscall/mod.rs index 9b3aa87a..e6d03a67 100644 --- a/kernel/src/syscall/mod.rs +++ b/kernel/src/syscall/mod.rs @@ -1007,6 +1007,8 @@ impl Syscall { Self::fchmodat(dirfd, pathname, mode) } + SYS_SCHED_YIELD => Self::do_sched_yield(), + SYS_SCHED_GETAFFINITY => { let pid = args[0] as i32; let size = args[1];