diff options
Diffstat (limited to 'meta-eas/recipes-kernel/linux/linux-renesas/0065-arm64-Set-SD_SHARE_CAP_STATES-sched_domain-flag-when.patch')
-rw-r--r-- | meta-eas/recipes-kernel/linux/linux-renesas/0065-arm64-Set-SD_SHARE_CAP_STATES-sched_domain-flag-when.patch | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/meta-eas/recipes-kernel/linux/linux-renesas/0065-arm64-Set-SD_SHARE_CAP_STATES-sched_domain-flag-when.patch b/meta-eas/recipes-kernel/linux/linux-renesas/0065-arm64-Set-SD_SHARE_CAP_STATES-sched_domain-flag-when.patch new file mode 100644 index 0000000..aac955a --- /dev/null +++ b/meta-eas/recipes-kernel/linux/linux-renesas/0065-arm64-Set-SD_SHARE_CAP_STATES-sched_domain-flag-when.patch @@ -0,0 +1,98 @@ +From 2a8f391ef5bb8d5c68b731743dd1f2b9f1fb0d46 Mon Sep 17 00:00:00 2001 +From: Morten Rasmussen <morten.rasmussen@arm.com> +Date: Fri, 12 Aug 2016 10:53:13 +0100 +Subject: [PATCH 65/92] arm64: Set SD_SHARE_CAP_STATES sched_domain flag when + applicable + +Energy-aware scheduling relies on the SD_SHARE_CAP_STATES to identify +sharing the same clock source/frequency domain. The assumption is that a +sched_domain exists that match the clock/frequency domain, i.e. +policy->related_cpus in cpufreq terms. The flag is not set for systems +without frequency scaling or systems with per-cpu frequency scaling. + +cc: Catalin Marinas <catalin.marinas@arm.com> +cc: Will Deacon <will.deacon@arm.com> + +Signed-off-by: Morten Rasmussen <morten.rasmussen@arm.com> +(cherry picked from commit 2c36006aa6a75c35269d26b08f2e86bad68d72bd) +Signed-off-by: Gaku Inami <gaku.inami.xw@bp.renesas.com> +--- + arch/arm64/kernel/topology.c | 34 +++++++++++++++++++++++++++++++--- + 1 file changed, 31 insertions(+), 3 deletions(-) + +diff --git a/arch/arm64/kernel/topology.c b/arch/arm64/kernel/topology.c +index eb2ad75..a8d986e 100644 +--- a/arch/arm64/kernel/topology.c ++++ b/arch/arm64/kernel/topology.c +@@ -29,6 +29,7 @@ + static DEFINE_PER_CPU(unsigned long, cpu_scale) = SCHED_CAPACITY_SCALE; + static DEFINE_MUTEX(cpu_scale_mutex); + static bool asym_cpucap; ++static bool sd_mc_share_cap, sd_die_share_cap; + static bool update_flags; + + unsigned long scale_cpu_capacity(struct sched_domain *sd, int cpu) +@@ -224,6 +225,14 @@ static void normalize_cpu_capacity(void) + pr_debug("cpu_capacity: calling %s for CPUs [%*pbl] (to_visit=[%*pbl])\n", + __func__, cpumask_pr_args(policy->related_cpus), + cpumask_pr_args(cpus_to_visit)); ++ ++ cpu = cpumask_first(policy->related_cpus); ++ ++ if (cpumask_subset(cpu_coregroup_mask(cpu), policy->related_cpus)) ++ sd_mc_share_cap = true; ++ else if (cpumask_subset(cpu_cpu_mask(cpu), policy->related_cpus)) ++ sd_die_share_cap = true; ++ + cpumask_andnot(cpus_to_visit, + cpus_to_visit, + policy->related_cpus); +@@ -239,7 +248,8 @@ static void normalize_cpu_capacity(void) + if (!cap_parsing_failed) { + asym = asym_cpucap; + normalize_cpu_capacity(); +- if (asym != asym_cpucap) ++ if (asym != asym_cpucap || ++ sd_mc_share_cap || sd_die_share_cap) + update_sched_flags(); + kfree(raw_capacity); + pr_debug("cpu_capacity: parsing done\n"); +@@ -522,7 +532,25 @@ const struct cpumask *cpu_coregroup_mask(int cpu) + + static int cpu_cpu_flags(void) + { +- return asym_cpucap ? SD_ASYM_CPUCAPACITY : 0; ++ int die_flags = 0; ++ ++ if (asym_cpucap) ++ die_flags |= SD_ASYM_CPUCAPACITY; ++ ++ if (sd_die_share_cap) ++ die_flags |= SD_SHARE_CAP_STATES; ++ ++ return die_flags; ++} ++ ++static int cpu_coregroup_flags(void) ++{ ++ int mc_flags = SD_SHARE_PKG_RESOURCES; ++ ++ if (sd_mc_share_cap) ++ mc_flags |= SD_SHARE_CAP_STATES; ++ ++ return mc_flags; + } + + static void update_siblings_masks(unsigned int cpuid) +@@ -608,7 +636,7 @@ static void __init reset_cpu_topology(void) + + static struct sched_domain_topology_level arm64_topology[] = { + #ifdef CONFIG_SCHED_MC +- { cpu_coregroup_mask, cpu_core_flags, SD_INIT_NAME(MC) }, ++ { cpu_coregroup_mask, cpu_coregroup_flags, SD_INIT_NAME(MC) }, + #endif + { cpu_cpu_mask, cpu_cpu_flags, SD_INIT_NAME(DIE) }, + { NULL, } +-- +1.9.1 + |