mirror of
https://github.com/JakeHillion/scx.git
synced 2024-11-29 12:40:24 +00:00
scx_nest: Apply r_impatient if no task is found in primary nest
Julia pointed out that our current implementation of r_impatient is incorrect. r_impatient is meant to be a mechanism for more aggressively growing the primary nest if a task repeatedly isn't able to find a core. Right now, we trigger r_impatient if we're not able to find an attached or previous core in the primary nest, but we _should_ be triggering it only if we're unable to find _any_ core in the primary nest. Fixing the implementation to do this drastically decreases how aggressively we grow the primary nest when r_impatient is in effect. Reported-by: Julia Lawall <julia.lawall@inria.fr> Signed-off-by: David Vernet <void@manifault.com>
This commit is contained in:
parent
239d5d1d2c
commit
ab0e36f9ce
@ -207,7 +207,7 @@ s32 BPF_STRUCT_OPS(nest_select_cpu, struct task_struct *p, s32 prev_cpu,
|
||||
s32 cpu;
|
||||
struct task_ctx *tctx;
|
||||
struct pcpu_ctx *pcpu_ctx;
|
||||
bool direct_to_primary = false;
|
||||
bool direct_to_primary = false, reset_impatient = true;
|
||||
|
||||
tctx = bpf_task_storage_get(&task_ctx_stor, p, 0, 0);
|
||||
if (!tctx)
|
||||
@ -232,7 +232,6 @@ s32 BPF_STRUCT_OPS(nest_select_cpu, struct task_struct *p, s32 prev_cpu,
|
||||
if (bpf_cpumask_test_cpu(tctx->attached_core, cast_mask(p_mask)) &&
|
||||
scx_bpf_test_and_clear_cpu_idle(tctx->attached_core)) {
|
||||
cpu = tctx->attached_core;
|
||||
tctx->prev_misses = 0;
|
||||
stat_inc(NEST_STAT(WAKEUP_ATTACHED));
|
||||
goto migrate_primary;
|
||||
}
|
||||
@ -246,18 +245,10 @@ s32 BPF_STRUCT_OPS(nest_select_cpu, struct task_struct *p, s32 prev_cpu,
|
||||
bpf_cpumask_test_cpu(prev_cpu, cast_mask(p_mask)) &&
|
||||
scx_bpf_test_and_clear_cpu_idle(prev_cpu)) {
|
||||
cpu = prev_cpu;
|
||||
tctx->prev_misses = 0;
|
||||
stat_inc(NEST_STAT(WAKEUP_PREV_PRIMARY));
|
||||
goto migrate_primary;
|
||||
}
|
||||
|
||||
if (r_impatient > 0 && ++tctx->prev_misses >= r_impatient) {
|
||||
direct_to_primary = true;
|
||||
tctx->prev_misses = 0;
|
||||
stat_inc(NEST_STAT(TASK_IMPATIENT));
|
||||
goto search_reserved;
|
||||
}
|
||||
|
||||
if (find_fully_idle) {
|
||||
/* Then try any fully idle core in primary. */
|
||||
cpu = scx_bpf_pick_idle_cpu(cast_mask(p_mask),
|
||||
@ -275,7 +266,14 @@ s32 BPF_STRUCT_OPS(nest_select_cpu, struct task_struct *p, s32 prev_cpu,
|
||||
goto migrate_primary;
|
||||
}
|
||||
|
||||
search_reserved:
|
||||
if (r_impatient > 0 && ++tctx->prev_misses >= r_impatient) {
|
||||
direct_to_primary = true;
|
||||
tctx->prev_misses = 0;
|
||||
stat_inc(NEST_STAT(TASK_IMPATIENT));
|
||||
}
|
||||
|
||||
reset_impatient = false;
|
||||
|
||||
/* Then try any fully idle core in reserve. */
|
||||
bpf_cpumask_and(p_mask, p->cpus_ptr, cast_mask(reserve));
|
||||
if (find_fully_idle) {
|
||||
@ -336,6 +334,8 @@ search_reserved:
|
||||
promote_to_primary:
|
||||
stat_inc(NEST_STAT(PROMOTED_TO_PRIMARY));
|
||||
migrate_primary:
|
||||
if (reset_impatient)
|
||||
tctx->prev_misses = 0;
|
||||
pcpu_ctx = bpf_map_lookup_elem(&pcpu_ctxs, &cpu);
|
||||
if (pcpu_ctx) {
|
||||
if (pcpu_ctx->scheduled_compaction) {
|
||||
|
Loading…
Reference in New Issue
Block a user