From 0e7a1fb15539e27f43faec01c70062944913fe98 Mon Sep 17 00:00:00 2001 From: koichiimai Date: Sun, 12 Jan 2025 15:36:55 +0900 Subject: [PATCH 1/4] handle NUM_READY_WORKER correctly Signed-off-by: koichiimai --- kernel/src/main.rs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/kernel/src/main.rs b/kernel/src/main.rs index ff80bf2ec..e4b6d0688 100644 --- a/kernel/src/main.rs +++ b/kernel/src/main.rs @@ -83,6 +83,8 @@ fn main(kernel_info: KernelInfo) { SchedulerType::FIFO, ); + // Wait until all other CPUs have incremented NUM_CPU, otherwise the num_cpu() function below will return an incorrect value. + awkernel_lib::delay::wait_microsec(100); NUM_READY_WORKER.store(awkernel_lib::cpu::num_cpu() as u16 - 1, Ordering::SeqCst); PRIMARY_READY.store(true, Ordering::SeqCst); @@ -118,12 +120,12 @@ fn main(kernel_info: KernelInfo) { } // Non-primary CPUs. + while !PRIMARY_READY.load(Ordering::SeqCst) { + awkernel_lib::delay::wait_microsec(10); + } + #[cfg(not(feature = "std"))] { - while !PRIMARY_READY.load(Ordering::SeqCst) { - awkernel_lib::delay::wait_microsec(10); - } - awkernel_lib::interrupt::enable_irq(config::PREEMPT_IRQ); if let Some(irq) = awkernel_lib::timer::irq_id() { From 1e7954e52eb91407d0f3e206e84c05d9122478f9 Mon Sep 17 00:00:00 2001 From: koichiimai Date: Sun, 12 Jan 2025 16:14:16 +0900 Subject: [PATCH 2/4] replace fetch_sub with fetch_update Signed-off-by: koichiimai --- kernel/src/main.rs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/kernel/src/main.rs b/kernel/src/main.rs index e4b6d0688..bdf70fb66 100644 --- a/kernel/src/main.rs +++ b/kernel/src/main.rs @@ -133,7 +133,18 @@ fn main(kernel_info: KernelInfo) { } } - NUM_READY_WORKER.fetch_sub(1, Ordering::SeqCst); + //NUM_READY_WORKER.fetch_sub(1, Ordering::SeqCst); + if let Err(_) = NUM_READY_WORKER.fetch_update(Ordering::SeqCst, Ordering::SeqCst, |x| { + if x > 0 { + Some(x - 1) + } else { + None + } + }) { + panic!( + "NUM_READY_WORKER is already zero: num_cpu() must have returned incorrect CPU number" + ); + } unsafe { task::run() }; // Execute tasks. } From 9295d0ccf3181187358971ecd74ada336deddd10 Mon Sep 17 00:00:00 2001 From: koichiimai Date: Sun, 12 Jan 2025 16:17:31 +0900 Subject: [PATCH 3/4] delete comment Signed-off-by: koichiimai --- kernel/src/main.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/kernel/src/main.rs b/kernel/src/main.rs index bdf70fb66..d06ad3e33 100644 --- a/kernel/src/main.rs +++ b/kernel/src/main.rs @@ -133,7 +133,6 @@ fn main(kernel_info: KernelInfo) { } } - //NUM_READY_WORKER.fetch_sub(1, Ordering::SeqCst); if let Err(_) = NUM_READY_WORKER.fetch_update(Ordering::SeqCst, Ordering::SeqCst, |x| { if x > 0 { Some(x - 1) From e1fa3692f4feb6baad973745168833e7374ba50a Mon Sep 17 00:00:00 2001 From: koichiimai Date: Sun, 12 Jan 2025 16:21:18 +0900 Subject: [PATCH 4/4] apply clippy Signed-off-by: koichiimai --- kernel/src/main.rs | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/kernel/src/main.rs b/kernel/src/main.rs index d06ad3e33..8017d6746 100644 --- a/kernel/src/main.rs +++ b/kernel/src/main.rs @@ -133,13 +133,16 @@ fn main(kernel_info: KernelInfo) { } } - if let Err(_) = NUM_READY_WORKER.fetch_update(Ordering::SeqCst, Ordering::SeqCst, |x| { - if x > 0 { - Some(x - 1) - } else { - None - } - }) { + if NUM_READY_WORKER + .fetch_update(Ordering::SeqCst, Ordering::SeqCst, |x| { + if x > 0 { + Some(x - 1) + } else { + None + } + }) + .is_err() + { panic!( "NUM_READY_WORKER is already zero: num_cpu() must have returned incorrect CPU number" );