KRN-WQ - Work Queues and Delayed Work¶
Group KRN-WQ. Design: docs/specs/SPEC-006-notifications-and-work-queues.md §4, §5. Related groups: KRN-NOTIF (the K_WORK bit), KRN-TIM (delayed work is a timer; timer callbacks are work items), KRN-THR (the queue’s thread), KRN-SYNC (mutex ownership across handlers).
KRN-WQ-001 to 004 originate in docs/architecture/03-kernel-architecture.md §6.2. All are restated here as the authoritative copy. New requirements start at 005.
Requirements¶
KRN-WQ-001 Intrusive, static, ISR-safe submit¶
Statement. Work items shall be intrusive and statically allocatable; submission shall be ISR-safe and O(1).
Rationale. A bottom half is submitted from interrupts; it must cost one push and one bit set.
Status. Accepted 2026-10-07
Verification. Test: wq/submit_from_isr; Analysis: no allocation and no list walk in emb_work_submit.
Trace. SPEC-006 §4.3
KRN-WQ-002 FIFO per queue in thread context¶
Statement. Work executes in FIFO order per queue in thread context.
Rationale. Deterministic order; handlers may use thread-only API.
Status. Accepted 2026-10-07
Verification. Test: wq/fifo_order, wq/handler_may_block.
Trace. SPEC-006 §4.3
KRN-WQ-003 Delayed work over software timers¶
Statement. Delayed work shall be implemented over software timers, not a separate timing mechanism.
Rationale. One timeout structure (ADR-010); one set of accuracy rules.
Status. Accepted 2026-10-07
Verification. Analysis: emb_dwork_t embeds emb_timer_storage_t; no other timing code in kernel/work/.
Trace. SPEC-006 §4.1, §4.3; SPEC-003 §7
KRN-WQ-004 Cancellation reports the state¶
Statement. Cancellation shall report whether the item was pending, running, or idle.
Rationale. The caller must know whether a handler may still run.
Status. Accepted 2026-10-07
Verification. Test: wq/cancel_pending, wq/cancel_running, wq/cancel_idle.
Trace. SPEC-006 §4.3
KRN-WQ-005 Submit outcomes¶
Statement. Submitting a queued item shall return EMB_EEXIST and change nothing; submitting an item running on the same queue shall return EMB_OK and re-append it after its handler returns; submitting an item running on another queue shall return EMB_EBUSY; an item shall never run concurrently with itself.
Rationale. Idempotent submission without lost re-submissions and without handler re-entrancy (Zephyr’s v2 rule, R-001 §6).
Status. Accepted 2026-10-07
Verification. Test: wq/submit_queued_eexist, wq/resubmit_while_running_runs_again, wq/submit_other_queue_ebusy.
Trace. SPEC-006 §4.3, §12.5
KRN-WQ-006 Synchronous cancel and flush¶
Statement. cancel_sync shall wait until a running handler has returned; flush shall return when every item queued before the call has run; calling either from the queue’s own thread shall be misuse.
Rationale. Teardown needs a point after which no handler touches the caller’s state.
Status. Accepted 2026-10-07
Verification. Test: wq/cancel_sync_waits, wq/flush, misuse/wq_flush_from_handler.
Trace. SPEC-006 §4.3, §6
KRN-WQ-007 Delayed work scheduling¶
Statement. dwork_schedule on a pending item shall return EMB_EEXIST and change nothing; reschedule shall replace a pending delay; cancel shall stop an armed timer or remove a queued item and report PENDING for both; the timer’s expiry shall submit the item in O(1) from the expiry path.
Rationale. One queue hop per delayed item; deterministic re-arm semantics.
Status. Accepted 2026-10-07
Verification. Test: wq/dwork_schedule_pending, wq/dwork_reschedule, wq/dwork_cancel_states.
Trace. SPEC-006 §4.3, §12.6, §12.7
KRN-WQ-008 System work queue¶
Statement. With CONFIG_EMB_SYSTEM_WORKQ the system work queue shall exist from kernel start at CONFIG_EMB_SYSTEM_WORKQ_PRIO with CONFIG_EMB_SYSTEM_WORKQ_STACK; it shall be the default queue of software timers; the tiny profile shall default to no system queue.
Rationale. Timer callbacks need a thread; the tiny profile cannot afford one by default.
Status. Accepted 2026-10-07
Verification. Test: wq/system_queue_exists; footprint test of the tiny profile without it.
Trace. SPEC-006 §4.3, §8; SPEC-003 §7.3; ADR-019
KRN-WQ-009 Work queue thread¶
Statement. A work queue’s thread shall wait on the K_WORK notification bit, drain the FIFO one item at a time with the item marked RUNNING outside the critical section, and run handlers at the queue’s priority.
Rationale. Fixes the implementation shape so that latency is the thread’s dispatch latency plus the handlers ahead.
Status. Accepted 2026-10-07
Verification. Analysis: kernel/work/ review; Test: wq/latency_measured with the trace events.
Trace. SPEC-006 §4.1, §4.3, §4.4
KRN-WQ-010 Lifecycle misuse¶
Statement. Destroying a queue with queued or running items, flushing or synchronously cancelling from the queue’s own thread, and returning from a handler while owning a mutex shall be misuse per SPEC-001 §5.3.
Rationale. Each would leave work or locks in an undefined owner.
Status. Accepted 2026-10-07
Verification. Test: misuse/wq_* in checked and release configurations (TEST-010).
Trace. SPEC-006 §6
KRN-WQ-011 Trace and statistics¶
Statement. Submit, start with submit-to-start latency, end with duration, cancel, and delayed scheduling shall be trace events; maximum FIFO length, worst latency, and longest handler with its address shall be optional statistics per queue. Rationale. Work queue latency is the latency of every timer callback and bottom half. Status. Accepted 2026-10-07 Verification. Test: trace decoder; statistics API test. Trace. SPEC-006 §7; OBS-005