5export module lib.softirq.core;
6import zxfoundation.base.types;
15 enum class softirq_vec : u8 {
32 static_assert(
static_cast<u32>(softirq_vec::_count) <= 32U,
33 "softirq vector count must fit the u32 pending bitmap");
38 [[nodiscard]]
constexpr auto softirq_bit(softirq_vec v)
noexcept -> u32 {
39 return 1U <<
static_cast<u32>(v);
45 [[nodiscard]]
constexpr auto softirq_index(softirq_vec v)
noexcept -> u32 {
46 return static_cast<u32>(v);
50 inline constexpr u32 NR_SOFTIRQS =
static_cast<u32>(softirq_vec::_count);
54 using softirq_fn =
auto (*)(
void* data)
noexcept ->
void;
57 struct softirq_entry {
58 softirq_fn action{
nullptr};
62 std::atomic<u32> generation{0U};
65 static_assert(
sizeof(softirq_entry) <= 24U,
66 "softirq_entry must fit one cache line stride (no false sharing)");
69 struct softirq_state {
71 std::atomic<u32> pending{0U};
77 u64 dispatch_count{0U};
83 inline constexpr softirq_vec SOFTIRQ_VEC_NONE =
static_cast<softirq_vec>(0xFFU);
91 [[nodiscard]]
auto open_softirq(
95 )
noexcept -> std::expected<
void, lib::kernel_error>;
99 auto raise_softirq(softirq_vec v)
noexcept ->
void;
104 auto raise_softirq_on(u16 cpu, softirq_vec v)
noexcept ->
void;
108 [[nodiscard]]
auto softirq_pending()
noexcept ->
bool;
111 auto do_softirq()
noexcept ->
void;
116 [[nodiscard]]
auto softirq_clear(softirq_vec v)
noexcept ->
bool;
120 [[nodiscard]]
auto softirq_test(softirq_vec v)
noexcept ->
bool;
124 [[nodiscard]]
auto softirq_stats()
noexcept -> std::pair<u64, u64>;
130 [[nodiscard]]
auto softirq_entry_for(softirq_vec v)
noexcept ->
const softirq_entry&;