asterinas/kernel/comps/softirq/src/stats.rs

49 lines
1.6 KiB
Rust

// SPDX-License-Identifier: MPL-2.0
use aster_util::per_cpu_counter::PerCpuCounter;
use ostd::cpu::CpuId;
use spin::Once;
use super::SoftIrqLine;
/// The maximum number of IRQ lines we track (256 should have covered most common hardware).
pub(super) const NR_IRQ_LINES: usize = 256;
/// Counters of each IRQ line for the number of executions.
pub(super) static IRQ_COUNTERS: Once<[PerCpuCounter; NR_IRQ_LINES]> = Once::new();
/// Iterates all IRQ lines for the number of executions across all CPUs.
pub fn iter_irq_counts_across_all_cpus() -> impl Iterator<Item = usize> {
let irq_counters = IRQ_COUNTERS.get().unwrap();
irq_counters.iter().map(|counter| counter.sum_all_cpus())
}
pub(super) fn process_statistic(irq_num: u8) {
// No races because we are in IRQs.
IRQ_COUNTERS.get().unwrap()[irq_num as usize].add_on_cpu(CpuId::current_racy(), 1);
}
/// Iterates all softirq lines for the number of executions across all CPUs.
pub fn iter_softirq_counts_across_all_cpus() -> impl Iterator<Item = usize> {
(0..SoftIrqLine::NR_LINES).map(|i| {
let soft_irq_line = SoftIrqLine::get(i);
soft_irq_line
.counter
.get()
.map(PerCpuCounter::sum_all_cpus)
.unwrap_or(0)
})
}
/// Iterates all softirq lines for the number of executions on a specific CPU.
pub fn iter_softirq_counts_on_cpu(cpuid: CpuId) -> impl Iterator<Item = usize> {
(0..SoftIrqLine::NR_LINES).map(move |i| {
let soft_irq_line = SoftIrqLine::get(i);
soft_irq_line
.counter
.get()
.map(|c| c.get_on_cpu(cpuid))
.unwrap_or(0)
})
}