WatchBpfMap

Struct WatchBpfMap 

Source
pub struct WatchBpfMap { /* private fields */ }
Expand description

Host-side, observer-effect-free read of a NAMED scheduler BPF-map field, surfaced as an assertable run-level metric.

The free-running host monitor resolves the field once (lazily, after the scheduler attaches and its maps appear) via BTF, then reads it each monitor tick WITHOUT freezing the guest — turning “the scheduler computed X” into an assertable metric. Read via crate::vmm::result::VmResult::run_metric under the key <scheduler-obj>_<label> (scalar, scalar-counter, or per-CPU-counter) or <scheduler-obj>_<label>_{avg,max} (per-CPU gauge), e.g. scx_lavd_avg_lat_cri, scx_lavd_lat_headroom_avg. <scheduler-obj> is libbpf’s object name for the active scheduler, which can differ from its source / ops name (e.g. scx-ktstr’s object is bpf_bpf). Each target’s label must be unique within a test: duplicate labels resolve to one metric key and are rejected at VM build time.

Construct with WatchBpfMap::new, which const-asserts the field formats at compile time. Direct struct-literal construction is rejected (fields are crate-private) so every constructed value passes the gate.

Implementations§

Source§

impl WatchBpfMap

Source

pub const fn new( map_name_suffix: &'static str, field: &'static str, agg: BpfMapAgg, label: &'static str, ) -> Self

Const constructor for use in static/const context.

map_name_suffix matches a loaded BPF map by ends_with (kernel map names truncate to 15 bytes). Unlike BpfMapWrite::new it does NOT require a leading .: a watched map may be a section map (.bss) OR a named map (cpu_ctx_stor). field is a dot-path into the map’s value type (sys_stat.avg_lat_cri, or a bare lat_headroom). label is the metric-key leaf appended to the scheduler-obj prefix.

§Panics

Panics at compile time when any of map_name_suffix / field / label is empty or carries whitespace, a path separator (/, \), or a non-printable / control / high-bit byte. Additionally field may not have a leading/trailing . or a doubled .. (an empty path segment the resolver could never match), and label may not contain . at all (it is a single metric-key leaf, not a path).

Source

pub const fn map_name_suffix(&self) -> &'static str

The validated map-name suffix to match (via ends_with) against loaded BPF maps (e.g. ".bss", "cpu_ctx_stor").

Source

pub const fn field(&self) -> &'static str

The dot-path into the map’s value type (e.g. "sys_stat.avg_lat_cri" or "lat_headroom").

Source

pub const fn agg(&self) -> BpfMapAgg

How the per-tick reads aggregate into run-level metric key(s).

Source

pub const fn label(&self) -> &'static str

The metric-key leaf appended to the scheduler-obj prefix.

Trait Implementations§

Source§

impl Clone for WatchBpfMap

Source§

fn clone(&self) -> WatchBpfMap

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for WatchBpfMap

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for WatchBpfMap

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for WatchBpfMap

Source§

fn eq(&self, other: &WatchBpfMap) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Copy for WatchBpfMap

Source§

impl Eq for WatchBpfMap

Source§

impl StructuralPartialEq for WatchBpfMap

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> PolicyExt for T
where T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

impl<T> MaybeSend for T
where T: Send,

§

impl<T> MaybeSend for T
where T: Send,