sched/balancing: Rename load_balance() => sched_balance_rq()

Standardize scheduler load-balancing function names on the
sched_balance_() prefix.

Also load_balance() has become somewhat of a misnomer: historically
it was the first and primary load-balancing function that was called,
but with the introduction of sched domains, it's become a lower
layer function that balances runqueues.

Rename it to sched_balance_rq() accordingly.

Signed-off-by: Ingo Molnar <mingo@kernel.org>
Reviewed-by: Shrikanth Hegde <sshegde@linux.ibm.com>
Link: https://lore.kernel.org/r/20240308111819.1101550-6-mingo@kernel.org
This commit is contained in:
Ingo Molnar 2024-03-08 12:18:11 +01:00
parent 14ff4dbd34
commit 4c3e509ea9
6 changed files with 41 additions and 41 deletions

View File

@ -41,11 +41,11 @@ The latter function takes two arguments: the runqueue of current CPU and whether
the CPU was idle at the time the sched_tick() happened and iterates over all the CPU was idle at the time the sched_tick() happened and iterates over all
sched domains our CPU is on, starting from its base domain and going up the ->parent sched domains our CPU is on, starting from its base domain and going up the ->parent
chain. While doing that, it checks to see if the current domain has exhausted its chain. While doing that, it checks to see if the current domain has exhausted its
rebalance interval. If so, it runs load_balance() on that domain. It then checks rebalance interval. If so, it runs sched_balance_rq() on that domain. It then checks
the parent sched_domain (if it exists), and the parent of the parent and so the parent sched_domain (if it exists), and the parent of the parent and so
forth. forth.
Initially, load_balance() finds the busiest group in the current sched domain. Initially, sched_balance_rq() finds the busiest group in the current sched domain.
If it succeeds, it looks for the busiest runqueue of all the CPUs' runqueues in If it succeeds, it looks for the busiest runqueue of all the CPUs' runqueues in
that group. If it manages to find such a runqueue, it locks both our initial that group. If it manages to find such a runqueue, it locks both our initial
CPU's runqueue and the newly found busiest one and starts moving tasks from it CPU's runqueue and the newly found busiest one and starts moving tasks from it

View File

@ -77,53 +77,53 @@ domain<N> <cpumask> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
The first field is a bit mask indicating what cpus this domain operates over. The first field is a bit mask indicating what cpus this domain operates over.
The next 24 are a variety of load_balance() statistics in grouped into types The next 24 are a variety of sched_balance_rq() statistics in grouped into types
of idleness (idle, busy, and newly idle): of idleness (idle, busy, and newly idle):
1) # of times in this domain load_balance() was called when the 1) # of times in this domain sched_balance_rq() was called when the
cpu was idle cpu was idle
2) # of times in this domain load_balance() checked but found 2) # of times in this domain sched_balance_rq() checked but found
the load did not require balancing when the cpu was idle the load did not require balancing when the cpu was idle
3) # of times in this domain load_balance() tried to move one or 3) # of times in this domain sched_balance_rq() tried to move one or
more tasks and failed, when the cpu was idle more tasks and failed, when the cpu was idle
4) sum of imbalances discovered (if any) with each call to 4) sum of imbalances discovered (if any) with each call to
load_balance() in this domain when the cpu was idle sched_balance_rq() in this domain when the cpu was idle
5) # of times in this domain pull_task() was called when the cpu 5) # of times in this domain pull_task() was called when the cpu
was idle was idle
6) # of times in this domain pull_task() was called even though 6) # of times in this domain pull_task() was called even though
the target task was cache-hot when idle the target task was cache-hot when idle
7) # of times in this domain load_balance() was called but did 7) # of times in this domain sched_balance_rq() was called but did
not find a busier queue while the cpu was idle not find a busier queue while the cpu was idle
8) # of times in this domain a busier queue was found while the 8) # of times in this domain a busier queue was found while the
cpu was idle but no busier group was found cpu was idle but no busier group was found
9) # of times in this domain load_balance() was called when the 9) # of times in this domain sched_balance_rq() was called when the
cpu was busy cpu was busy
10) # of times in this domain load_balance() checked but found the 10) # of times in this domain sched_balance_rq() checked but found the
load did not require balancing when busy load did not require balancing when busy
11) # of times in this domain load_balance() tried to move one or 11) # of times in this domain sched_balance_rq() tried to move one or
more tasks and failed, when the cpu was busy more tasks and failed, when the cpu was busy
12) sum of imbalances discovered (if any) with each call to 12) sum of imbalances discovered (if any) with each call to
load_balance() in this domain when the cpu was busy sched_balance_rq() in this domain when the cpu was busy
13) # of times in this domain pull_task() was called when busy 13) # of times in this domain pull_task() was called when busy
14) # of times in this domain pull_task() was called even though the 14) # of times in this domain pull_task() was called even though the
target task was cache-hot when busy target task was cache-hot when busy
15) # of times in this domain load_balance() was called but did not 15) # of times in this domain sched_balance_rq() was called but did not
find a busier queue while the cpu was busy find a busier queue while the cpu was busy
16) # of times in this domain a busier queue was found while the cpu 16) # of times in this domain a busier queue was found while the cpu
was busy but no busier group was found was busy but no busier group was found
17) # of times in this domain load_balance() was called when the 17) # of times in this domain sched_balance_rq() was called when the
cpu was just becoming idle cpu was just becoming idle
18) # of times in this domain load_balance() checked but found the 18) # of times in this domain sched_balance_rq() checked but found the
load did not require balancing when the cpu was just becoming idle load did not require balancing when the cpu was just becoming idle
19) # of times in this domain load_balance() tried to move one or more 19) # of times in this domain sched_balance_rq() tried to move one or more
tasks and failed, when the cpu was just becoming idle tasks and failed, when the cpu was just becoming idle
20) sum of imbalances discovered (if any) with each call to 20) sum of imbalances discovered (if any) with each call to
load_balance() in this domain when the cpu was just becoming idle sched_balance_rq() in this domain when the cpu was just becoming idle
21) # of times in this domain pull_task() was called when newly idle 21) # of times in this domain pull_task() was called when newly idle
22) # of times in this domain pull_task() was called even though the 22) # of times in this domain pull_task() was called even though the
target task was cache-hot when just becoming idle target task was cache-hot when just becoming idle
23) # of times in this domain load_balance() was called but did not 23) # of times in this domain sched_balance_rq() was called but did not
find a busier queue while the cpu was just becoming idle find a busier queue while the cpu was just becoming idle
24) # of times in this domain a busier queue was found while the cpu 24) # of times in this domain a busier queue was found while the cpu
was just becoming idle but no busier group was found was just becoming idle but no busier group was found

View File

@ -42,9 +42,9 @@ CPU共享。任意两个组的CPU掩码的交集不一定为空如果是这
后一个函数有两个入参当前CPU的运行队列、它在sched_tick()调用时是否空闲。函数会从 后一个函数有两个入参当前CPU的运行队列、它在sched_tick()调用时是否空闲。函数会从
当前CPU所在的基调度域开始迭代执行并沿着parent指针链向上进入更高层级的调度域。在迭代 当前CPU所在的基调度域开始迭代执行并沿着parent指针链向上进入更高层级的调度域。在迭代
过程中,函数会检查当前调度域是否已经耗尽了再平衡的时间间隔,如果是,它在该调度域运行 过程中,函数会检查当前调度域是否已经耗尽了再平衡的时间间隔,如果是,它在该调度域运行
load_balance()。接下来它检查父调度域(如果存在),再后来父调度域的父调度域,以此类推。 sched_balance_rq()。接下来它检查父调度域(如果存在),再后来父调度域的父调度域,以此类推。
起初,load_balance()查找当前调度域中最繁忙的调度组。如果成功在该调度组管辖的全部CPU 起初,sched_balance_rq()查找当前调度域中最繁忙的调度组。如果成功在该调度组管辖的全部CPU
的运行队列中找出最繁忙的运行队列。如能找到对当前的CPU运行队列和新找到的最繁忙运行 的运行队列中找出最繁忙的运行队列。如能找到对当前的CPU运行队列和新找到的最繁忙运行
队列均加锁并把任务从最繁忙队列中迁移到当前CPU上。被迁移的任务数量等于在先前迭代执行 队列均加锁并把任务从最繁忙队列中迁移到当前CPU上。被迁移的任务数量等于在先前迭代执行
中计算出的该调度域的调度组的不均衡值。 中计算出的该调度域的调度组的不均衡值。

View File

@ -75,42 +75,42 @@ domain<N> <cpumask> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
繁忙,新空闲): 繁忙,新空闲):
1) 当CPU空闲时load_balance()在这个调度域中被调用了#次 1) 当CPU空闲时sched_balance_rq()在这个调度域中被调用了#次
2) 当CPU空闲时load_balance()在这个调度域中被调用,但是发现负载无需 2) 当CPU空闲时sched_balance_rq()在这个调度域中被调用,但是发现负载无需
均衡#次 均衡#次
3) 当CPU空闲时load_balance()在这个调度域中被调用试图迁移1个或更多 3) 当CPU空闲时sched_balance_rq()在这个调度域中被调用试图迁移1个或更多
任务且失败了#次 任务且失败了#次
4) 当CPU空闲时load_balance()在这个调度域中被调用,发现不均衡(如果有) 4) 当CPU空闲时sched_balance_rq()在这个调度域中被调用,发现不均衡(如果有)
#次 #次
5) 当CPU空闲时pull_task()在这个调度域中被调用#次 5) 当CPU空闲时pull_task()在这个调度域中被调用#次
6) 当CPU空闲时尽管目标任务是热缓存状态pull_task()依然被调用#次 6) 当CPU空闲时尽管目标任务是热缓存状态pull_task()依然被调用#次
7) 当CPU空闲时load_balance()在这个调度域中被调用,未能找到更繁忙的 7) 当CPU空闲时sched_balance_rq()在这个调度域中被调用,未能找到更繁忙的
队列#次 队列#次
8) 当CPU空闲时在调度域中找到了更繁忙的队列但未找到更繁忙的调度组 8) 当CPU空闲时在调度域中找到了更繁忙的队列但未找到更繁忙的调度组
#次 #次
9) 当CPU繁忙时load_balance()在这个调度域中被调用了#次 9) 当CPU繁忙时sched_balance_rq()在这个调度域中被调用了#次
10) 当CPU繁忙时load_balance()在这个调度域中被调用,但是发现负载无需 10) 当CPU繁忙时sched_balance_rq()在这个调度域中被调用,但是发现负载无需
均衡#次 均衡#次
11) 当CPU繁忙时load_balance()在这个调度域中被调用试图迁移1个或更多 11) 当CPU繁忙时sched_balance_rq()在这个调度域中被调用试图迁移1个或更多
任务且失败了#次 任务且失败了#次
12) 当CPU繁忙时load_balance()在这个调度域中被调用,发现不均衡(如果有) 12) 当CPU繁忙时sched_balance_rq()在这个调度域中被调用,发现不均衡(如果有)
#次 #次
13) 当CPU繁忙时pull_task()在这个调度域中被调用#次 13) 当CPU繁忙时pull_task()在这个调度域中被调用#次
14) 当CPU繁忙时尽管目标任务是热缓存状态pull_task()依然被调用#次 14) 当CPU繁忙时尽管目标任务是热缓存状态pull_task()依然被调用#次
15) 当CPU繁忙时load_balance()在这个调度域中被调用,未能找到更繁忙的 15) 当CPU繁忙时sched_balance_rq()在这个调度域中被调用,未能找到更繁忙的
队列#次 队列#次
16) 当CPU繁忙时在调度域中找到了更繁忙的队列但未找到更繁忙的调度组 16) 当CPU繁忙时在调度域中找到了更繁忙的队列但未找到更繁忙的调度组
#次 #次
17) 当CPU新空闲时load_balance()在这个调度域中被调用了#次 17) 当CPU新空闲时sched_balance_rq()在这个调度域中被调用了#次
18) 当CPU新空闲时load_balance()在这个调度域中被调用,但是发现负载无需 18) 当CPU新空闲时sched_balance_rq()在这个调度域中被调用,但是发现负载无需
均衡#次 均衡#次
19) 当CPU新空闲时load_balance()在这个调度域中被调用试图迁移1个或更多 19) 当CPU新空闲时sched_balance_rq()在这个调度域中被调用试图迁移1个或更多
任务且失败了#次 任务且失败了#次
20) 当CPU新空闲时load_balance()在这个调度域中被调用,发现不均衡(如果有) 20) 当CPU新空闲时sched_balance_rq()在这个调度域中被调用,发现不均衡(如果有)
#次 #次
21) 当CPU新空闲时pull_task()在这个调度域中被调用#次 21) 当CPU新空闲时pull_task()在这个调度域中被调用#次
22) 当CPU新空闲时尽管目标任务是热缓存状态pull_task()依然被调用#次 22) 当CPU新空闲时尽管目标任务是热缓存状态pull_task()依然被调用#次
23) 当CPU新空闲时load_balance()在这个调度域中被调用,未能找到更繁忙的 23) 当CPU新空闲时sched_balance_rq()在这个调度域中被调用,未能找到更繁忙的
队列#次 队列#次
24) 当CPU新空闲时在调度域中找到了更繁忙的队列但未找到更繁忙的调度组 24) 当CPU新空闲时在调度域中找到了更繁忙的队列但未找到更繁忙的调度组
#次 #次

View File

@ -110,7 +110,7 @@ struct sched_domain {
unsigned long last_decay_max_lb_cost; unsigned long last_decay_max_lb_cost;
#ifdef CONFIG_SCHEDSTATS #ifdef CONFIG_SCHEDSTATS
/* load_balance() stats */ /* sched_balance_rq() stats */
unsigned int lb_count[CPU_MAX_IDLE_TYPES]; unsigned int lb_count[CPU_MAX_IDLE_TYPES];
unsigned int lb_failed[CPU_MAX_IDLE_TYPES]; unsigned int lb_failed[CPU_MAX_IDLE_TYPES];
unsigned int lb_balanced[CPU_MAX_IDLE_TYPES]; unsigned int lb_balanced[CPU_MAX_IDLE_TYPES];

View File

@ -6866,7 +6866,7 @@ static void dequeue_task_fair(struct rq *rq, struct task_struct *p, int flags)
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
/* Working cpumask for: load_balance, load_balance_newidle. */ /* Working cpumask for: sched_balance_rq, load_balance_newidle. */
static DEFINE_PER_CPU(cpumask_var_t, load_balance_mask); static DEFINE_PER_CPU(cpumask_var_t, load_balance_mask);
static DEFINE_PER_CPU(cpumask_var_t, select_rq_mask); static DEFINE_PER_CPU(cpumask_var_t, select_rq_mask);
static DEFINE_PER_CPU(cpumask_var_t, should_we_balance_tmpmask); static DEFINE_PER_CPU(cpumask_var_t, should_we_balance_tmpmask);
@ -11242,7 +11242,7 @@ static int should_we_balance(struct lb_env *env)
* Check this_cpu to ensure it is balanced within domain. Attempt to move * Check this_cpu to ensure it is balanced within domain. Attempt to move
* tasks if there is an imbalance. * tasks if there is an imbalance.
*/ */
static int load_balance(int this_cpu, struct rq *this_rq, static int sched_balance_rq(int this_cpu, struct rq *this_rq,
struct sched_domain *sd, enum cpu_idle_type idle, struct sched_domain *sd, enum cpu_idle_type idle,
int *continue_balancing) int *continue_balancing)
{ {
@ -11647,7 +11647,7 @@ static int active_load_balance_cpu_stop(void *data)
static atomic_t sched_balance_running = ATOMIC_INIT(0); static atomic_t sched_balance_running = ATOMIC_INIT(0);
/* /*
* Scale the max load_balance interval with the number of CPUs in the system. * Scale the max sched_balance_rq interval with the number of CPUs in the system.
* This trades load-balance latency on larger machines for less cross talk. * This trades load-balance latency on larger machines for less cross talk.
*/ */
void update_max_interval(void) void update_max_interval(void)
@ -11727,7 +11727,7 @@ static void sched_balance_domains(struct rq *rq, enum cpu_idle_type idle)
} }
if (time_after_eq(jiffies, sd->last_balance + interval)) { if (time_after_eq(jiffies, sd->last_balance + interval)) {
if (load_balance(cpu, rq, sd, idle, &continue_balancing)) { if (sched_balance_rq(cpu, rq, sd, idle, &continue_balancing)) {
/* /*
* The LBF_DST_PINNED logic could have changed * The LBF_DST_PINNED logic could have changed
* env->dst_cpu, so we can't know our idle * env->dst_cpu, so we can't know our idle
@ -12353,7 +12353,7 @@ static int newidle_balance(struct rq *this_rq, struct rq_flags *rf)
if (sd->flags & SD_BALANCE_NEWIDLE) { if (sd->flags & SD_BALANCE_NEWIDLE) {
pulled_task = load_balance(this_cpu, this_rq, pulled_task = sched_balance_rq(this_cpu, this_rq,
sd, CPU_NEWLY_IDLE, sd, CPU_NEWLY_IDLE,
&continue_balancing); &continue_balancing);