pub struct VerifierVmResult {
pub stats: Vec<ProgStats>,
pub scheduler_log: String,
pub attach: AttachOutcome,
pub dispatched: bool,
pub timed_out: bool,
}Expand description
Result of collecting verifier output from a VM run.
Fields§
§stats: Vec<ProgStats>Per-program verifier statistics from host-side memory
introspection (bpf_prog_aux->verified_insns).
scheduler_log: StringScheduler log (stdout+stderr) from the VM. Contains libbpf’s verifier instruction traces when BPF load fails.
attach: AttachOutcomeWhether the scheduler positively confirmed attach. Derived from
the guest’s lifecycle frames (AttachOutcome). Attach is
necessary but NOT sufficient for a cell PASS: this must be
AttachOutcome::Attached (the guest reached its post-attach
dispatch phase) AND Self::dispatched must be true. Verification
alone (non-empty stats) is not enough — a scheduler whose BPF
loads but never reaches sched_ext enabled, or a guest that
vanishes before the dispatch phase, is a real failure.
dispatched: boolWhether the guest confirmed the injected verifier workload
dispatched — a WorkloadDispatched lifecycle frame, emitted by
ktstr_guest_init Phase 5 when the SpinWait probe recorded a
worker with non-zero iterations under a confirmed SCHED_EXT
policy after attach (so a fair-class fallback cannot false-confirm).
A cell PASSes only
when this is true AND Self::attach is
AttachOutcome::Attached: a scheduler that turns on (sched_ext
enabled) but never dispatches a runnable task is a real, distinct
failure — worse than never attaching — that the attach verdict
alone cannot catch. Derived from the run’s lifecycle frames;
scheduler-agnostic — the probe runs as SCHED_EXT, so the BPF
scheduler dispatches it under any switch mode (full or
SCX_OPS_SWITCH_PARTIAL) and non-zero worker progress proves
dispatch, unlike an scx-specific nr_dispatched counter.
timed_out: boolThe host watchdog fired (hard-deadline hang) before the guest
exited. Orthogonal to Self::attach: the attach verdict already
fails a guest that vanished BEFORE the dispatch phase — an early
kernel panic reboots via panic=-1 (an i8042 reset →
ExitAction::Shutdown, timed_out == false) and is
AttachOutcome::Unconfirmed. This flag catches the remaining
case: a guest that wedges AFTER attaching (during teardown), which
leaves attach == Attached but never exits. A verifier cell FAILs
on it too — but NOT on the guest exit code, which is 1 even on
the verifier success path (no #[ktstr_test] body to dispatch).
Implementations§
Source§impl VerifierVmResult
impl VerifierVmResult
Sourcepub fn cell_verdict(&self) -> Result<(), String>
pub fn cell_verdict(&self) -> Result<(), String>
The verifier cell PASS/FAIL verdict: Ok(()) when the scheduler
verified its BPF, attached (sched_ext enabled), AND dispatched
the injected workload; Err(reason) naming the first failing gate
otherwise. Gate order — timed_out (a post-attach teardown hang),
then attach (did it turn on?), then dispatch (did it schedule a
task?) — so the root-cause failure is reported first: an attach
failure is named before the dispatch gate it necessarily also
trips. Does NOT key on the guest exit code, which is 1 even on
the verifier success path (no #[ktstr_test] body to dispatch).
Auto Trait Implementations§
impl Freeze for VerifierVmResult
impl RefUnwindSafe for VerifierVmResult
impl Send for VerifierVmResult
impl Sync for VerifierVmResult
impl Unpin for VerifierVmResult
impl UnwindSafe for VerifierVmResult
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more