cee25393d8
- Fix P15-8-init-cycle-detection.patch: replace visiting+error with seen+silent-skip to eliminate 11 false-positive 'dependency cycle detected' errors on shared deps - Fix P0-daemon-fix-init-notify-unwrap.patch: remove eprintln! for missing INIT_NOTIFY (expected for oneshot_async services, ~7 daemons affected) - Fix driver-manager hotplug loop: add PERMANENTLY_SKIPPED static set shared between hotplug handler and DriverConfig::probe() to stop infinite re-probing of Fatal/NotSupported/deferred-exhausted device+driver pairs (e.g. ided) - Fix driver-manager log_timeline: suppress repeated EPIPE/ENOENT errors with AtomicI32 dedup and AtomicBool one-shot guards for boot timeline JSON - Add driver-manager SIGTERM handler, ACPI bus registration, --status mode, driver reap loop, graceful shutdown, and reduced deferred retries (30→3)
53 lines
2.0 KiB
Diff
53 lines
2.0 KiB
Diff
diff --git a/src/percpu.rs b/src/percpu.rs
|
|
index f4ad5e66..80ffb959 100644
|
|
--- a/src/percpu.rs
|
|
+++ b/src/percpu.rs
|
|
@@ -4,6 +4,7 @@ use alloc::{
|
|
};
|
|
use core::{
|
|
cell::{Cell, RefCell},
|
|
+ hint,
|
|
sync::atomic::{AtomicBool, AtomicPtr, Ordering},
|
|
};
|
|
|
|
@@ -104,11 +105,36 @@ pub fn shootdown_tlb_ipi(target: Option<LogicalCpuId>) {
|
|
|
|
crate::ipi::ipi_single(crate::ipi::IpiKind::Tlb, percpublock);
|
|
} else {
|
|
+ // Broadcast TLB shootdown: set flag on all other CPUs, then send a single
|
|
+ // IPI with "all except self" destination shorthand instead of N individual IPIs.
|
|
+ let my_percpublock = PercpuBlock::current();
|
|
for id in 0..crate::cpu_count() {
|
|
- // TODO: Optimize: use global counter and percpu ack counters, send IPI using
|
|
- // destination shorthand "all CPUs".
|
|
- shootdown_tlb_ipi(Some(LogicalCpuId::new(id)));
|
|
+ let target_id = LogicalCpuId::new(id);
|
|
+ if target_id == my_percpublock.cpu_id {
|
|
+ continue;
|
|
+ }
|
|
+ let Some(percpublock) = (unsafe {
|
|
+ ALL_PERCPU_BLOCKS[id as usize]
|
|
+ .load(Ordering::Acquire)
|
|
+ .as_ref()
|
|
+ }) else {
|
|
+ continue;
|
|
+ };
|
|
+ // Wait if this CPU still has a pending shootdown from a previous request
|
|
+ #[expect(clippy::bool_comparison)]
|
|
+ while percpublock
|
|
+ .wants_tlb_shootdown
|
|
+ .swap(true, Ordering::Release)
|
|
+ == true
|
|
+ {
|
|
+ while percpublock.wants_tlb_shootdown.load(Ordering::Relaxed) == true {
|
|
+ my_percpublock.maybe_handle_tlb_shootdown();
|
|
+ hint::spin_loop();
|
|
+ }
|
|
+ }
|
|
}
|
|
+ // Single broadcast IPI to all other CPUs using destination shorthand
|
|
+ crate::ipi::ipi(crate::ipi::IpiKind::Tlb, crate::ipi::IpiTarget::Other);
|
|
}
|
|
}
|
|
impl PercpuBlock {
|