use anyhow::Result;
use btf_rs::Btf;
use super::{find_struct, member_byte_offset};
#[derive(Debug, Clone)]
pub struct SchedDomainOffsets {
pub rq_sd: usize,
pub sd_parent: usize,
pub sd_level: usize,
pub sd_name: usize,
pub sd_flags: usize,
pub sd_span_weight: usize,
pub sd_balance_interval: usize,
pub sd_nr_balance_failed: usize,
pub sd_newidle_call: Option<usize>,
pub sd_newidle_success: Option<usize>,
pub sd_newidle_ratio: Option<usize>,
pub sd_max_newidle_lb_cost: usize,
pub stats_offsets: Option<SchedDomainStatsOffsets>,
}
#[derive(Debug, Clone)]
pub struct SchedDomainStatsOffsets {
pub sd_lb_count: usize,
pub sd_lb_failed: usize,
pub sd_lb_balanced: usize,
pub sd_lb_imbalance_load: usize,
pub sd_lb_imbalance_util: usize,
pub sd_lb_imbalance_task: usize,
pub sd_lb_imbalance_misfit: usize,
pub sd_lb_gained: usize,
pub sd_lb_hot_gained: usize,
pub sd_lb_nobusyg: usize,
pub sd_lb_nobusyq: usize,
pub sd_alb_count: usize,
pub sd_alb_failed: usize,
pub sd_alb_pushed: usize,
pub sd_sbe_count: usize,
pub sd_sbe_balanced: usize,
pub sd_sbe_pushed: usize,
pub sd_sbf_count: usize,
pub sd_sbf_balanced: usize,
pub sd_sbf_pushed: usize,
pub sd_ttwu_wake_remote: usize,
pub sd_ttwu_move_affine: usize,
pub sd_ttwu_move_balance: usize,
}
pub const CPU_MAX_IDLE_TYPES: usize = 3;
pub(super) fn resolve_sched_domain_offsets(
btf: &Btf,
rq_struct: &btf_rs::Struct,
) -> Result<SchedDomainOffsets> {
let rq_sd = member_byte_offset(btf, rq_struct, "sd")?;
let (sd_struct, _) = find_struct(btf, "sched_domain")?;
let sd_parent = member_byte_offset(btf, &sd_struct, "parent")?;
let sd_level = member_byte_offset(btf, &sd_struct, "level")?;
let sd_name = member_byte_offset(btf, &sd_struct, "name")?;
let sd_flags = member_byte_offset(btf, &sd_struct, "flags")?;
let sd_span_weight = member_byte_offset(btf, &sd_struct, "span_weight")?;
let sd_balance_interval = member_byte_offset(btf, &sd_struct, "balance_interval")?;
let sd_nr_balance_failed = member_byte_offset(btf, &sd_struct, "nr_balance_failed")?;
let sd_max_newidle_lb_cost = member_byte_offset(btf, &sd_struct, "max_newidle_lb_cost")?;
let (sd_newidle_call, sd_newidle_success, sd_newidle_ratio) = match (
member_byte_offset(btf, &sd_struct, "newidle_call").ok(),
member_byte_offset(btf, &sd_struct, "newidle_success").ok(),
member_byte_offset(btf, &sd_struct, "newidle_ratio").ok(),
) {
(Some(c), Some(s), Some(r)) => (Some(c), Some(s), Some(r)),
_ => (None, None, None),
};
let stats_offsets = resolve_sched_domain_stats_offsets(btf, &sd_struct).ok();
Ok(SchedDomainOffsets {
rq_sd,
sd_parent,
sd_level,
sd_name,
sd_flags,
sd_span_weight,
sd_balance_interval,
sd_nr_balance_failed,
sd_newidle_call,
sd_newidle_success,
sd_newidle_ratio,
sd_max_newidle_lb_cost,
stats_offsets,
})
}
fn resolve_sched_domain_stats_offsets(
btf: &Btf,
sd_struct: &btf_rs::Struct,
) -> Result<SchedDomainStatsOffsets> {
Ok(SchedDomainStatsOffsets {
sd_lb_count: member_byte_offset(btf, sd_struct, "lb_count")?,
sd_lb_failed: member_byte_offset(btf, sd_struct, "lb_failed")?,
sd_lb_balanced: member_byte_offset(btf, sd_struct, "lb_balanced")?,
sd_lb_imbalance_load: member_byte_offset(btf, sd_struct, "lb_imbalance_load")?,
sd_lb_imbalance_util: member_byte_offset(btf, sd_struct, "lb_imbalance_util")?,
sd_lb_imbalance_task: member_byte_offset(btf, sd_struct, "lb_imbalance_task")?,
sd_lb_imbalance_misfit: member_byte_offset(btf, sd_struct, "lb_imbalance_misfit")?,
sd_lb_gained: member_byte_offset(btf, sd_struct, "lb_gained")?,
sd_lb_hot_gained: member_byte_offset(btf, sd_struct, "lb_hot_gained")?,
sd_lb_nobusyg: member_byte_offset(btf, sd_struct, "lb_nobusyg")?,
sd_lb_nobusyq: member_byte_offset(btf, sd_struct, "lb_nobusyq")?,
sd_alb_count: member_byte_offset(btf, sd_struct, "alb_count")?,
sd_alb_failed: member_byte_offset(btf, sd_struct, "alb_failed")?,
sd_alb_pushed: member_byte_offset(btf, sd_struct, "alb_pushed")?,
sd_sbe_count: member_byte_offset(btf, sd_struct, "sbe_count")?,
sd_sbe_balanced: member_byte_offset(btf, sd_struct, "sbe_balanced")?,
sd_sbe_pushed: member_byte_offset(btf, sd_struct, "sbe_pushed")?,
sd_sbf_count: member_byte_offset(btf, sd_struct, "sbf_count")?,
sd_sbf_balanced: member_byte_offset(btf, sd_struct, "sbf_balanced")?,
sd_sbf_pushed: member_byte_offset(btf, sd_struct, "sbf_pushed")?,
sd_ttwu_wake_remote: member_byte_offset(btf, sd_struct, "ttwu_wake_remote")?,
sd_ttwu_move_affine: member_byte_offset(btf, sd_struct, "ttwu_move_affine")?,
sd_ttwu_move_balance: member_byte_offset(btf, sd_struct, "ttwu_move_balance")?,
})
}