Commit b3cf6ed8 authored by Steve Sistare's avatar Steve Sistare Committed by Cheng Jian
Browse files

sched/topology: Provide cfs_overload_cpus bitmap

hulk inclusion
category: feature
bugzilla: 38261, https://bugzilla.openeuler.org/show_bug.cgi?id=23


CVE: NA

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

Define and initialize a sparse bitmap of overloaded CPUs, per
last-level-cache scheduling domain, for use by the CFS scheduling class.
Save a pointer to cfs_overload_cpus in the rq for efficient access.

Signed-off-by: default avatarSteve Sistare <steven.sistare@oracle.com>
Signed-off-by: default avatarCheng Jian <cj.chengjian@huawei.com>
Reviewed-by: default avatarHanjun Guo <guohanjun@huawei.com>
Signed-off-by: default avatarYang Yingliang <yangyingliang@huawei.com>
Reviewed-by: default avatarXie XiuQi <xiexiuqi@huawei.com>
Signed-off-by: default avatarYang Yingliang <yangyingliang@huawei.com>
parent ef175d23
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -72,6 +72,7 @@ struct sched_domain_shared {
	atomic_t	ref;
	atomic_t	nr_busy_cpus;
	int		has_idle_cores;
	struct sparsemask *cfs_overload_cpus;
};

struct sched_domain {
+2 −0
Original line number Diff line number Diff line
@@ -83,6 +83,7 @@

struct rq;
struct cpuidle_state;
struct sparsemask;

/* task_struct::on_rq states: */
#define TASK_ON_RQ_QUEUED	1
@@ -829,6 +830,7 @@ struct rq {
	struct cfs_rq		cfs;
	struct rt_rq		rt;
	struct dl_rq		dl;
	struct sparsemask	*cfs_overload_cpus;

#ifdef CONFIG_FAIR_GROUP_SCHED
	/* list of leaf cfs_rq on this CPU: */
+23 −2
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@
 * Scheduler topology setup/handling methods
 */
#include "sched.h"
#include "sparsemask.h"

DEFINE_MUTEX(sched_domains_mutex);

@@ -409,7 +410,9 @@ DEFINE_PER_CPU(struct sched_domain *, sd_asym);

static void update_top_cache_domain(int cpu)
{
	struct sparsemask *cfs_overload_cpus = NULL;
	struct sched_domain_shared *sds = NULL;
	struct rq *rq = cpu_rq(cpu);
	struct sched_domain *sd;
	int id = cpu;
	int size = 1;
@@ -419,8 +422,10 @@ static void update_top_cache_domain(int cpu)
		id = cpumask_first(sched_domain_span(sd));
		size = cpumask_weight(sched_domain_span(sd));
		sds = sd->shared;
		cfs_overload_cpus = sds->cfs_overload_cpus;
	}

	rcu_assign_pointer(rq->cfs_overload_cpus, cfs_overload_cpus);
	rcu_assign_pointer(per_cpu(sd_llc, cpu), sd);
	per_cpu(sd_llc_size, cpu) = size;
	per_cpu(sd_llc_id, cpu) = id;
@@ -1613,7 +1618,22 @@ static void __sdt_free(const struct cpumask *cpu_map)

static int sd_llc_alloc(struct sched_domain *sd)
{
	/* Allocate sd->shared data here. Empty for now. */
	struct sched_domain_shared *sds = sd->shared;
	struct cpumask *span = sched_domain_span(sd);
	int nid = cpu_to_node(cpumask_first(span));
	int flags = __GFP_ZERO | GFP_KERNEL;
	struct sparsemask *mask;

	/*
	 * Allocate the bitmap if not already allocated.  This is called for
	 * every CPU in the LLC but only allocates once per sd_llc_shared.
	 */
	if (!sds->cfs_overload_cpus) {
		mask = sparsemask_alloc_node(nr_cpu_ids, 3, flags, nid);
		if (!mask)
			return 1;
		sds->cfs_overload_cpus = mask;
	}

	return 0;
}
@@ -1625,7 +1645,8 @@ static void sd_llc_free(struct sched_domain *sd)
	if (!sds)
		return;

	/* Free data here. Empty for now. */
	sparsemask_free(sds->cfs_overload_cpus);
	sds->cfs_overload_cpus = NULL;
}

static int sd_llc_alloc_all(const struct cpumask *cpu_map, struct s_data *d)