From 5059a40201b59ad8c8d7042ba14bcab5e9749b0c Mon Sep 17 00:00:00 2001 From: greatbridf Date: Wed, 21 Jan 2026 01:03:37 +0800 Subject: [PATCH] signal: don't disable preemption before handling SIGSTOP For some reason, we disabled preemptions before we set the waker and yield. This is prohibited since we can't go to sleep with preemption disabled. After examining the previous commit, I think we used to call Scheduler::schedule() to do context switches, which needs preemptions disabled. When we move on to the new method, we just forgot to change it. This should fix the issue. Fixes: e23c9eb1f24c ("runtime: new task sleep-wakeup method and some adaption") Fixes #52 Signed-off-by: greatbridf --- src/kernel/task/signal.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/kernel/task/signal.rs b/src/kernel/task/signal.rs index 5ef28ae6..ac2cfe95 100644 --- a/src/kernel/task/signal.rs +++ b/src/kernel/task/signal.rs @@ -229,10 +229,9 @@ impl SignalList { ); } - eonix_preempt::disable(); - // `SIGSTOP` can only be waken up by `SIGCONT` or `SIGKILL`. - // SAFETY: Preempt disabled above. + // Preemption must stay enabled here: `stackful` rejects + // blocking (returning `Pending`) with preemption disabled. Runtime::block_till_woken(|waker| { let mut inner = self.inner.lock(); let old_waker = inner.stop_waker.replace(waker.clone());