Relax the restriction to setup a sched_domain_shared only for domains with SD_SHARE_PKG_RESOURCES. Set it up for every domain.
This restriction was imposed since the struct was created via commit 24fc7edb92ee ("sched/core: Introduce 'struct sched_domain_shared'") for the lack of another use case. This will change soon. Also, move the structure definition below kernel/sched/. It is not used outside and in the future it will carry some more internal types that we don't want to expose. Signed-off-by: Jan H. Schönherr <jscho...@amazon.de> --- include/linux/sched/topology.h | 6 ------ kernel/sched/sched.h | 6 ++++++ kernel/sched/topology.c | 12 ++++-------- 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/include/linux/sched/topology.h b/include/linux/sched/topology.h index 26347741ba50..530ad856372e 100644 --- a/include/linux/sched/topology.h +++ b/include/linux/sched/topology.h @@ -68,12 +68,6 @@ extern int sched_domain_level_max; struct sched_group; -struct sched_domain_shared { - atomic_t ref; - atomic_t nr_busy_cpus; - int has_idle_cores; -}; - struct sched_domain { /* These fields must be setup */ struct sched_domain *parent; /* top domain must be null terminated */ diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index b4d0e8a68697..f6da85447f3c 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -915,6 +915,12 @@ struct rq { #endif }; +struct sched_domain_shared { + atomic_t ref; + atomic_t nr_busy_cpus; + int has_idle_cores; +}; + static inline int cpu_of(struct rq *rq) { #ifdef CONFIG_SMP diff --git a/kernel/sched/topology.c b/kernel/sched/topology.c index 56a0fed30c0a..8b64f3f57d50 100644 --- a/kernel/sched/topology.c +++ b/kernel/sched/topology.c @@ -1184,15 +1184,11 @@ sd_init(struct sched_domain_topology_level *tl, sd->idle_idx = 1; } - /* - * For all levels sharing cache; connect a sched_domain_shared - * instance. - */ - if (sd->flags & SD_SHARE_PKG_RESOURCES) { - sd->shared = *per_cpu_ptr(sdd->sds, sd_id); - atomic_inc(&sd->shared->ref); + /* Setup a shared sched_domain_shared instance */ + sd->shared = *per_cpu_ptr(sdd->sds, sd_id); + atomic_inc(&sd->shared->ref); + if (sd->flags & SD_SHARE_PKG_RESOURCES) atomic_set(&sd->shared->nr_busy_cpus, sd_weight); - } sd->private = sdd; -- 2.9.3.1.gcba166c.dirty