Commit 6fd03baa authored by He Yujie's avatar He Yujie
Browse files

sched/dynamic_affinity: Calculate cpu capacity in real time when realtime...

sched/dynamic_affinity: Calculate cpu capacity in real time when realtime tasks are running on this cpu

hulk inclusion
category: bugfix
bugzilla: https://gitee.com/src-openeuler/kernel/issues/IBEBAG



--------------------------------

The task_rq selection of dynamic affinity use cpu capacity to determine
select_cpus range. When realtime tasks are running on the cpu all the time,
cfs tasks and the thread of softirq is suppressed, and the cpu capacity is
not updated in time. As a result, the select_cpus range is always selected
for preferred_cpus. then cfs task will never be able to run because
realtime tasks has been running.

Therefore, if realtime tasks is running during the task_rq selection of
dynamic affinity, the cpu capacity should be calculated to solve such
a problem.

Fixes: 70a232a5 ("sched: Adjust wakeup cpu range according CPU util dynamicly")
Signed-off-by: default avatarHe Yujie <coka.heyujie@huawei.com>
parent 4dc4cec0
Loading
Loading
Loading
Loading
+18 −1
Original line number Diff line number Diff line
@@ -7226,6 +7226,19 @@ static inline bool prefer_cpus_valid(struct task_struct *p)
	       cpumask_subset(prefer_cpus, &p->cpus_allowed);
}

static unsigned long scale_rt_capacity(struct sched_domain *sd, int cpu);

static inline unsigned long calc_cpu_capacity(int cpu)
{
	unsigned long capacity;

	capacity = scale_rt_capacity(NULL, cpu);
	if (!capacity)
		capacity = 1;

	return capacity;
}

/*
 * set_task_select_cpus: select the cpu range for task
 * @p: the task whose available cpu range will to set
@@ -7288,6 +7301,10 @@ static void set_task_select_cpus(struct task_struct *p, int *idlest_cpu,
		}

		util_avg_sum += tg->se[cpu]->avg.util_avg;

		if (cpu_rq(cpu)->rt.rt_nr_running)
			tg_capacity += calc_cpu_capacity(cpu);
		else
			tg_capacity += capacity_of(cpu);
	}
	rcu_read_unlock();