scx_lavd: drop runtime_boost using slice_boost_prio

Remove runtime_boost using slice_boost_prio. Without slice_boost_prio,
the scheduler collects the exact time slice.

Signed-off-by: Changwoo Min <changwoo@igalia.com>
This commit is contained in:
Changwoo Min 2024-03-29 16:31:03 +09:00
parent 5629189527
commit 7b99ed9c5c
2 changed files with 25 additions and 41 deletions

View File

@ -61,7 +61,6 @@ enum consts {
LAVD_BOOST_RANGE = 14, /* 35% of nice range */ LAVD_BOOST_RANGE = 14, /* 35% of nice range */
LAVD_BOOST_WAKEUP_LAT = 1, LAVD_BOOST_WAKEUP_LAT = 1,
LAVD_SLICE_BOOST_MAX_PRIO = (LAVD_SLICE_MAX_NS/LAVD_SLICE_MIN_NS),
LAVD_SLICE_BOOST_MAX_STEP = 3, LAVD_SLICE_BOOST_MAX_STEP = 3,
LAVD_GREEDY_RATIO_MAX = USHRT_MAX, LAVD_GREEDY_RATIO_MAX = USHRT_MAX,

View File

@ -1171,10 +1171,7 @@ static u64 calc_slice_share(struct task_struct *p, struct task_ctx *taskc)
* scheduler tries to allocate a longer time slice. * scheduler tries to allocate a longer time slice.
*/ */
u64 share = get_task_load_ideal(p); u64 share = get_task_load_ideal(p);
u64 slice_boost_step = min(taskc->slice_boost_prio, share += (share * taskc->slice_boost_prio) / LAVD_SLICE_BOOST_MAX_STEP;
LAVD_SLICE_BOOST_MAX_STEP);
share += (share * slice_boost_step) / LAVD_SLICE_BOOST_MAX_STEP;
return share; return share;
} }
@ -1271,30 +1268,16 @@ static void update_stat_for_stopping(struct task_struct *p,
struct task_ctx *taskc, struct task_ctx *taskc,
struct cpu_ctx *cpuc) struct cpu_ctx *cpuc)
{ {
u64 now, run_time_ns, run_time_boosted_ns; u64 now, run_time_ns;
now = bpf_ktime_get_ns(); now = bpf_ktime_get_ns();
/* /*
* Adjust slice boost for the task's next schedule. Note that the * Update task's run_time.
* updating slice_boost_prio should be done before updating
* run_time_boosted_ns, since the run_time_boosted_ns calculation
* requires updated slice_boost_prio.
*/
taskc->last_stop_clk = now;
adjust_slice_boost(cpuc, taskc);
/*
* Update task's run_time. If a task got slice-boosted -- in other
* words, its time slices have been fully consumed multiple times,
* stretch the measured runtime according to the slice_boost_prio.
* The stretched runtime more accurately reflects the actual runtime
* per schedule as if a large enough time slice was given in the first
* place.
*/ */
run_time_ns = now - taskc->last_start_clk; run_time_ns = now - taskc->last_start_clk;
run_time_boosted_ns = run_time_ns * (1 + taskc->slice_boost_prio); taskc->run_time_ns = calc_avg(taskc->run_time_ns, run_time_ns);
taskc->run_time_ns = calc_avg(taskc->run_time_ns, run_time_boosted_ns); taskc->last_stop_clk = now;
} }
static void update_stat_for_quiescent(struct task_struct *p, static void update_stat_for_quiescent(struct task_struct *p,
@ -1467,16 +1450,16 @@ void BPF_STRUCT_OPS(lavd_runnable, struct task_struct *p, u64 enq_flags)
struct task_ctx *p_taskc, *waker_taskc; struct task_ctx *p_taskc, *waker_taskc;
u64 now, interval; u64 now, interval;
cpuc = get_cpu_ctx();
p_taskc = get_task_ctx(p);
if (!cpuc || !p_taskc)
return;
/* /*
* Add task load based on the current statistics regardless of a target * Add task load based on the current statistics regardless of a target
* rq. Statistics will be adjusted when more accurate statistics become * rq. Statistics will be adjusted when more accurate statistics become
* available (ops.running). * available (ops.running).
*/ */
cpuc = get_cpu_ctx();
p_taskc = get_task_ctx(p);
if (!cpuc || !p_taskc)
return;
update_stat_for_runnable(p, p_taskc, cpuc); update_stat_for_runnable(p, p_taskc, cpuc);
/* /*
@ -1505,18 +1488,15 @@ void BPF_STRUCT_OPS(lavd_runnable, struct task_struct *p, u64 enq_flags)
void BPF_STRUCT_OPS(lavd_running, struct task_struct *p) void BPF_STRUCT_OPS(lavd_running, struct task_struct *p)
{ {
struct task_ctx *taskc;
struct cpu_ctx *cpuc; struct cpu_ctx *cpuc;
struct task_ctx *taskc;
/* /*
* Update task statistics then adjust task load based on the update. * Update task statistics
*/ */
taskc = get_task_ctx(p);
if (!taskc)
return;
cpuc = get_cpu_ctx(); cpuc = get_cpu_ctx();
if (!cpuc) taskc = get_task_ctx(p);
if (!cpuc || !taskc)
return; return;
update_stat_for_running(p, taskc, cpuc); update_stat_for_running(p, taskc, cpuc);
@ -1557,7 +1537,7 @@ static void adjust_slice_boost(struct cpu_ctx *cpuc, struct task_ctx *taskc)
* fully consumed, decrease the slice boost priority by half. * fully consumed, decrease the slice boost priority by half.
*/ */
if (slice_fully_consumed(cpuc, taskc)) { if (slice_fully_consumed(cpuc, taskc)) {
if (taskc->slice_boost_prio < LAVD_SLICE_BOOST_MAX_PRIO) if (taskc->slice_boost_prio < LAVD_SLICE_BOOST_MAX_STEP)
taskc->slice_boost_prio++; taskc->slice_boost_prio++;
} }
else { else {
@ -1572,17 +1552,19 @@ void BPF_STRUCT_OPS(lavd_stopping, struct task_struct *p, bool runnable)
struct task_ctx *taskc; struct task_ctx *taskc;
/* /*
* Reduce the task load. * Update task statistics
*/ */
cpuc = get_cpu_ctx(); cpuc = get_cpu_ctx();
if (!cpuc)
return;
taskc = get_task_ctx(p); taskc = get_task_ctx(p);
if (!taskc) if (!cpuc || !taskc)
return; return;
update_stat_for_stopping(p, taskc, cpuc); update_stat_for_stopping(p, taskc, cpuc);
/*
* Adjust slice boost for the task's next schedule.
*/
adjust_slice_boost(cpuc, taskc);
} }
void BPF_STRUCT_OPS(lavd_quiescent, struct task_struct *p, u64 deq_flags) void BPF_STRUCT_OPS(lavd_quiescent, struct task_struct *p, u64 deq_flags)
@ -1591,6 +1573,9 @@ void BPF_STRUCT_OPS(lavd_quiescent, struct task_struct *p, u64 deq_flags)
struct task_ctx *taskc; struct task_ctx *taskc;
u64 now, interval; u64 now, interval;
/*
* Substract task load from the current CPU's load.
*/
cpuc = get_cpu_ctx(); cpuc = get_cpu_ctx();
taskc = get_task_ctx(p); taskc = get_task_ctx(p);
if (!cpuc || !taskc) if (!cpuc || !taskc)