Skip to content

CLIMB framework

include/sch/climb.h View source View on GitHub
struct climb_handle {
    char                      *name;
    struct list_head          list;
    climb_pressure_t          pressure;
    climb_pressure_t          applied_pressure_internal;
    enum climb_pressure_kind  kind;
    struct climb_source       *pressure_source;
    struct thread             *given_by;
    struct thread             *given_to;
};
struct climb_thread_state {
    climb_pressure_t     direct_pressure;
    climb_pressure_t     indirect_pressure;
    climb_pressure_t     pressure_ewma;
    int32_t              wanted_boost;
    fx32_32_t            boost_ewma;
    int32_t              effective_boost;
    int32_t              pressure_periods;
    struct list_head     handles;
    bool                 on_climb_tree : 1;
    bool                 was_pinned : 1;
    struct rbt_node      climb_node;
    struct list_head     tmp_list_node;
    struct climb_handle  handle;
};
struct climb_source {
    char              *name;
    climb_pressure_t  base;
};
enum climb_pressure_kind {
    CLIMB_PRESSURE_DIRECT,
    CLIMB_PRESSURE_INDIRECT,
};
typedef fx32_32_t climb_pressure_t;
climb_pressure_t climb_thread_applied_pressure(struct thread *t);
climb_pressure_t climb_thread_compute_pressure_to_apply(struct thread *t);
void climb_handle_apply(struct thread *t, struct climb_handle *h);
void climb_handle_update(struct thread *t, struct climb_handle *h, climb_pressure_t new_pressure);
void climb_handle_remove(struct climb_handle *h);
void climb_handle_apply_locked(struct thread *t, struct climb_handle *h);
void climb_handle_remove_locked(struct climb_handle *h);
void climb_recompute_pressure(struct thread *t);
void climb_thread_remove(struct thread *t);
void climb_thread_init(struct thread *t);
void climb_post_migrate_hook(struct thread *t, size_t old_cpu, size_t new_cpu);
size_t climb_get_thread_data(struct rbt_node *n);
struct climb_handle climb_handle_init(struct climb_handle *ch, struct climb_source *cs, enum climb_pressure_kind k);
#define CLIMB_BOOST_LEVELS 20
#define CLIMB_MIN_GLOBAL_BOOST 1
#define CLIMB_REINSERT_THRESHOLD 2
#define CLIMB_GLOBAL_BOOST_SCALE(nt) (CLIMB_BOOST_LEVELS / nt)
#define CLIMB_PRESSURE_KEY_SHIFT 15
#define CLIMB_MAX_DECAY_PERIODS 20
#define climb_thread_state_from_tree_node(tn) \
    (container_of(tn, struct climb_thread_state, climb_node))
#define CLIMB_PRESSURE_THREAD_BASE FX(0.05)
#define CLIMB_PRESSURE_IO_BASE FX(0.20)
#define CLIMB_PRESSURE_LOCK_BASE FX(0.10)
#define CLIMB_PRESSURE_MAX FX(1.0)
#define CLIMB_PRESSURE(x) FX(x)
#define CLIMB_PRESSURE_MAX FX(1.0)
#define CLIMB_DIRECT_PRESSURE_MAX FX(1.0)
#define CLIMB_INDIRECT_PRESSURE_MAX FX(1.0)
#define CLIMB_INDIRECT_MIN_SCALE FX(0.10)
#define CLIMB_INDIRECT_WEIGHT FX(0.85)
#define CLIMB_BOOST_LEVEL_MAX 20
#define CLIMB_BOOST_EWMA_ALPHA FX(0.75)
#define CLIMB_PRESSURE_EXPONENT 3 /* cubic */
#define CLIMB_PRESSURE_TO_BOOST_SCALE FX(8.0)
#define CLIMB_SOURCE_EXTERN(name) extern struct climb_source __climb_src_##name
#define CLIMB_SOURCE_CREATE(n, strname, b) \
    struct climb_source __climb_src_##n = {.name = strname, .base = b}
#define CLIMB_SOURCE(name) &(__climb_src_##name)