SchedPolicy

Enum SchedPolicy 

Source
pub enum SchedPolicy {
    Normal,
    Batch,
    Idle,
    Fifo(u32),
    RoundRobin(u32),
    Deadline {
        runtime: Duration,
        deadline: Duration,
        period: Duration,
    },
    Ext,
}
Expand description

Linux scheduling policy for a worker process.

Fifo, RoundRobin, and Deadline all require CAP_SYS_NICE (user_check_sched_setscheduler in kernel/sched/syscalls.c routes rt_policy and dl_policy through req_priv). Normal, Batch, and (entering) Idle are unprivileged transitions for fair-policy tasks. Priority values for Fifo/RoundRobin are clamped to 1-99.

Variants§

§

Normal

SCHED_NORMAL (CFS/EEVDF).

§

Batch

SCHED_BATCH.

§

Idle

SCHED_IDLE.

§

Fifo(u32)

SCHED_FIFO with the given priority (1-99).

§

RoundRobin(u32)

SCHED_RR with the given priority (1-99).

§

Deadline

SCHED_DEADLINE with explicit runtime, deadline, and period. Applied via sched_setattr(2).

Each field is a Duration — the nanosecond representation the kernel requires is materialised at the syscall site, so callers express intent in idiomatic Rust units (Duration::from_micros(100), Duration::from_millis(1), etc.) and don’t have to thread integer-nanosecond literals through their test fixtures.

Constraints (from __checkparam_dl in kernel/sched/deadline.c):

  • deadline != Duration::ZERO.
  • runtime must be at least 1024 ns (the kernel’s DL_SCALE floor); shorter runtimes are silently truncated inside the kernel and break bandwidth accounting.
  • runtime <= deadline.
  • period == Duration::ZERO is legal — the kernel substitutes deadline for the period when zero. When non-zero, deadline <= period.
  • The effective period (period if non-zero, else deadline) is checked against /proc/sys/kernel/sched_deadline_period_min_us (default 100us = 100_000 ns) and /proc/sys/kernel/sched_deadline_period_max_us (default 1 << 22 us = 4_194_304_000 ns), inclusive. Both sysctls are runtime-tunable; this crate does not pre-validate the sysctl range and lets the kernel surface out-of-range values as EINVAL.
  • The nanosecond count of deadline and period must each fit in 63 bits (< 1 << 63, i.e. <= i64::MAX ns ≈ 292 years) — the kernel uses bit 63 internally. Any longer Duration is rejected at the syscall site.

Transitions to/from Deadline always require CAP_SYS_NICE. Tasks set to Deadline get exclusive bandwidth on the admission-controlled root domain; oversubscription returns EBUSY (see sched_dl_overflow in kernel/sched/deadline.c).

set_sched_policy validates the structural constraints (zero-deadline, DL_SCALE floor, ordering, top-bit) before invoking sched_setattr so a malformed Deadline fails fast in user space rather than tunneling an EINVAL through the syscall.

Fields

§runtime: Duration

Runtime budget per period.

§deadline: Duration

Relative deadline from period start.

§period: Duration

Period. Duration::ZERO means “use deadline as the period” per the kernel’s __checkparam_dl substitution.

§

Ext

SCHED_EXT — routes the worker through the loaded sched_ext BPF scheduler. Applied via sched_setattr(2) with sched_policy = SCHED_EXT (7); glibc does not wrap SCHED_EXT, so set_sched_policy issues the raw syscall. SCHED_EXT is a valid policy whenever the kernel is built with CONFIG_SCHED_CLASS_EXT, so the syscall SUCCEEDS whether or not a scheduler is attached: attached, the task routes to ext_sched_class; with none attached task_should_scx is false so it silently falls back to fair_sched_class (still policy == SCHED_EXT). It EINVALs only on a kernel built WITHOUT CONFIG_SCHED_CLASS_EXT. scx_check_setscheduler (kernel/sched/ext.c) returns EACCES when the task carries scx.disallow. No priority or deadline parameters apply.

Unlike Normal under a switch-all scheduler — which the kernel reroutes to the ext class via task_should_scx WITHOUT changing the task’s policy — Ext sets policy == SCHED_EXT explicitly, so the task is BPF-scheduled even under a SCX_OPS_SWITCH_PARTIAL scheduler that leaves SCHED_OTHER tasks in fair. That is what makes a SCHED_EXT worker a switch-mode-agnostic “the BPF scheduler dispatched me” probe.

Implementations§

Source§

impl SchedPolicy

Source

pub const fn fifo(priority: u32) -> Self

SCHED_FIFO with the given priority (1-99).

Source

pub const fn round_robin(priority: u32) -> Self

SCHED_RR with the given priority (1-99).

Source

pub const fn deadline( runtime: Duration, deadline: Duration, period: Duration, ) -> Self

SCHED_DEADLINE with the given runtime / deadline / period. See SchedPolicy::Deadline for parameter constraints.

All three arguments share the same Duration type. The canonical order is (runtime, deadline, period) — runtime budget first, then the relative deadline, then the period. For tests that need to make the order obvious at the call site, prefer the struct-literal form SchedPolicy::Deadline { runtime: ..., deadline: ..., period: ... } which carries the field names through the reader’s eye.

// Convenience constructor — canonical (runtime, deadline, period) order.
let p = SchedPolicy::deadline(
    Duration::from_micros(500), // runtime
    Duration::from_millis(1),   // deadline
    Duration::from_millis(10),  // period
);
// Struct-literal form — names elide positional confusion.
let q = SchedPolicy::Deadline {
    runtime: Duration::from_micros(500),
    deadline: Duration::from_millis(1),
    period: Duration::from_millis(10),
};
assert!(matches!(p, SchedPolicy::Deadline { .. }));
assert!(matches!(q, SchedPolicy::Deadline { .. }));

Trait Implementations§

Source§

impl Clone for SchedPolicy

Source§

fn clone(&self) -> SchedPolicy

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 SchedPolicy

Source§

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

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

impl Default for SchedPolicy

Source§

fn default() -> SchedPolicy

Returns the “default value” for a type. Read more
Source§

impl<'de> Deserialize<'de> for SchedPolicy

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Hash for SchedPolicy

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 SchedPolicy

Source§

fn eq(&self, other: &SchedPolicy) -> 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 Serialize for SchedPolicy

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Copy for SchedPolicy

Source§

impl Eq for SchedPolicy

Source§

impl StructuralPartialEq for SchedPolicy

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

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

§

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

§

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