Skip to content

CLIMB framework

include/sch/climb.h View source View on GitHub
struct climb_handle (5 fields) source
§ struct list_node list
§ climb_pressure_t pressure
§ climb_pressure_t applied_pressure_internal

If 0, this has not applied presssure

§ struct thread *given_to
struct climb_thread_data (11 fields) source
§ climb_pressure_t direct_pressure

pressure

Contributed direct pressure

§ climb_pressure_t indirect_pressure

Indirect pressure from others

§ climb_pressure_t pressure_ewma

EWMA of pressure over time

§ int32_t wanted_boost

boost

0..20, how much this thread “wants”

§ fx32_32_t boost_ewma

EWMA of the wanted_boost_raw

§ int32_t effective_boost

How much boosted (derived from wanted_boost_raw) this thread “gets”. This exists because CLIMB will take into account the existence of other threads and their boosts and periods spent to compute the boost of one thread

§ int32_t pressure_periods

time

>=1 active, < 0 decaying, 0 inactive

§ struct list_head handles

accounting

active pressure handles

§ bool on_climb_tree : 1

scheduler integration

Used to logically verify things

§ struct rbt_node climb_node
§ struct climb_handle handle

if this thread becomes a CLIMB source, what would it “apply”?

struct climb_source (2 fields) source
§ char *name
enum climb_pressure_kind (2 variants) source
§ CLIMB_PRESSURE_DIRECT
§ CLIMB_PRESSURE_INDIRECT
typedef fx32_32_t climb_pressure_t
source
climb_pressure_t climb_thread_applied_pressure(struct thread *t)
source
climb_pressure_t climb_thread_compute_pressure_to_apply(struct thread *t)
source
void climb_handle_apply(struct thread *t, struct climb_handle *h)
source
void climb_handle_update(
    struct thread *t,
    struct climb_handle *h,
    climb_pressure_t new_pressure
)
source
void climb_handle_remove(struct climb_handle *h)
source
void climb_handle_apply_locked(
    struct thread *t,
    struct climb_handle *h
)
source
void climb_handle_remove_locked(struct climb_handle *h)
source
void climb_recompute_pressure(struct thread *t)
source
void climb_thread_remove(struct thread *t)
source
void climb_thread_init(struct thread *t)
source
void climb_post_migrate_hook(
    struct thread *t,
    size_t old_cpu,
    size_t new_cpu
)
source
size_t climb_get_thread_data(struct rbt_node *n)
source
int32_t climb_cmp_threads(
    const struct rbt_node *a,
    const struct rbt_node *b
)
source
struct climb_handle * climb_handle_init(
    struct climb_handle *ch,
    struct climb_source *cs,
    enum climb_pressure_kind k
)
source
#define CLIMB_BOOST_LEVELS 20
source
#define CLIMB_MIN_GLOBAL_BOOST 1
source
#define CLIMB_GLOBAL_BOOST_SCALE(nt)
source
Expansion
#define CLIMB_GLOBAL_BOOST_SCALE(nt) (CLIMB_BOOST_LEVELS / nt)
#define CLIMB_PRESSURE_KEY_SHIFT 31
source

one period == 0.5 pressure points

#define CLIMB_MAX_DECAY_PERIODS 20
source

Pressures

#define CLIMB_PRESSURE_THREAD_BASE FX(0.05)
source
#define CLIMB_PRESSURE_IO_BASE FX(0.20)
source
#define CLIMB_PRESSURE_LOCK_BASE FX(0.10)
source
#define CLIMB_PRESSURE(x)
source
Expansion
#define CLIMB_PRESSURE(x) FX(x)

Pressure space

#define CLIMB_PRESSURE_MAX FX(1.0)
source
#define CLIMB_DIRECT_PRESSURE_MAX FX(1.0)
source
#define CLIMB_INDIRECT_PRESSURE_MAX FX(1.0)
source

Indirect pressure scaling

#define CLIMB_INDIRECT_MIN_SCALE FX(0.10)
source
#define CLIMB_INDIRECT_WEIGHT FX(0.85)
source
#define CLIMB_BOOST_LEVEL_MAX 20
source

Boost space

#define CLIMB_BOOST_EWMA_ALPHA FX(0.75)
source

EWMA smoothing

Pressure to boost shaping

#define CLIMB_PRESSURE_EXPONENT 3
source

cubic

#define CLIMB_PRESSURE_TO_BOOST_SCALE FX(8.0)
source
#define climb_thread_data_from_tree_node(tn)
source
Expansion
#define climb_thread_data_from_tree_node(tn) \
    (container_of(tn, struct climb_thread_data, climb_node))
#define CLIMB_SOURCE_EXTERN(name)
source
Expansion
#define CLIMB_SOURCE_EXTERN(name) extern struct climb_source __climb_src_##name
#define CLIMB_SOURCE_CREATE(n, strname, b)
source
Expansion
#define CLIMB_SOURCE_CREATE(n, strname, b) \
    struct climb_source __climb_src_##n = {.name = strname, .base = b}
#define CLIMB_SOURCE(name)
source
Expansion
#define CLIMB_SOURCE(name) &(__climb_src_##name)