sched: ems: set cpu capacity for simplified energy model
authorPark Bumgyu <bumgyu.park@samsung.com>
Tue, 10 Apr 2018 01:18:38 +0000 (10:18 +0900)
committerChungwoo Park <cww.park@samsung.com>
Mon, 21 May 2018 08:35:42 +0000 (17:35 +0900)
We added the SIMPLIFIED_ENERGY_TABLE config to prevent conflicts
with existing energy model. If this config is enabled, the codes for
legacy energy model is unactivated.

Change-Id: I9b6d48334b32a50fd4cc8029d8eab85adb623a9d
Signed-off-by: Park Bumgyu <bumgyu.park@samsung.com>
drivers/base/arch_topology.c
drivers/soc/samsung/exynos-topology.c
include/linux/ems.h
init/Kconfig
kernel/sched/ems/energy.c

index 4a4c4c9dd3e879d55ef0fe7d75c1b2e8938ddb8d..5b75ac1cde0872840edf0b89410e0cc74d68b915 100644 (file)
@@ -497,11 +497,13 @@ static int __init register_cpufreq_notifier(void)
 
        cpumask_copy(cpus_to_visit, cpu_possible_mask);
 
+#ifndef CONFIG_SIMPLIFIED_ENERGY_MODEL
        ret = cpufreq_register_notifier(&init_cpu_capacity_notifier,
                                        CPUFREQ_POLICY_NOTIFIER);
 
        if (ret)
                free_cpumask_var(cpus_to_visit);
+#endif
 
        return ret;
 }
index 3341e709e2e4021d5b2de2356a3ad041ed31a53f..69b57eb13df15b58a1ac38d491669ffc280509ca 100644 (file)
@@ -304,6 +304,12 @@ static int cpu_flags(void)
        return topology_cpu_flags();
 }
 
+#ifdef CONFIG_SIMPLIFIED_ENERGY_MODEL
+#define use_simplified 1
+#else
+#define use_simplified 0
+#endif
+
 static inline
 const struct sched_group_energy * const cpu_core_energy(int cpu)
 {
@@ -312,6 +318,9 @@ const struct sched_group_energy * const cpu_core_energy(int cpu)
        int max_cap_idx;
        int level = cpu_energy_level[cpu].core;
 
+       if (use_simplified)
+               return NULL;
+
        if (level < 0)
                return NULL;
 
@@ -338,6 +347,9 @@ const struct sched_group_energy * const cpu_coregroup_energy(int cpu)
        struct sched_group_energy *sge;
        int level = cpu_energy_level[cpu].coregroup;
 
+       if (use_simplified)
+               return NULL;
+
        if (level < 0)
                return NULL;
 
@@ -356,6 +368,9 @@ const struct sched_group_energy * const cpu_cluster_energy(int cpu)
        struct sched_group_energy *sge;
        int level = cpu_energy_level[cpu].cluster;
 
+       if (use_simplified)
+               return NULL;
+
        if (level < 0)
                return NULL;
 
index 8ddbf716835376daf6917a2132d9633d5f25cb43..bfb35a3ab1935f9d6ab177fc43a9cb561b70d41e 100644 (file)
@@ -55,10 +55,6 @@ extern void update_lbt_overutil(int cpu, unsigned long capacity);
 extern void gb_qos_update_request(struct gb_qos_request *req, u32 new_value);
 
 extern void request_kernel_prefer_perf(int grp_idx, int enable);
-
-extern void init_sched_energy_table(struct cpumask *cpus, int table_size,
-                               unsigned long *f_table, unsigned int *v_table,
-                               int max_f, int min_f);
 #else
 static inline struct sched_group *exynos_fit_idlest_group(struct sched_domain *sd,
                struct task_struct *p) { return NULL; }
@@ -86,8 +82,14 @@ static inline void update_lbt_overutil(int cpu, unsigned long capacity) { }
 static inline void gb_qos_update_request(struct gb_qos_request *req, u32 new_value) { }
 
 static inline void request_kernel_prefer_perf(int grp_idx, int enable) { }
+#endif /* CONFIG_SCHED_EMS */
 
+#ifdef CONFIG_SIMPLIFIED_ENERGY_MODEL
+extern void init_sched_energy_table(struct cpumask *cpus, int table_size,
+                               unsigned long *f_table, unsigned int *v_table,
+                               int max_f, int min_f);
+#else
 static inline void init_sched_energy_table(struct cpumask *cpus, int table_size,
                                unsigned long *f_table, unsigned int *v_table,
                                int max_f, int min_f) { }
-#endif /* CONFIG_SCHED_EMS */
+#endif
index 7872c36300691c4f121c3086467013efc4f0d3d7..e10bc96fd035c52f9ad9e7865aa7cfabbd3a79cb 100644 (file)
@@ -1013,6 +1013,17 @@ config DEFAULT_USE_ENERGY_AWARE
 
          Say N if unsure.
 
+config SIMPLIFIED_ENERGY_MODEL
+       bool "Enable simplified energy model feature"
+       depends on SCHED_EMS
+       default n
+       help
+         This option enables support for simplified energy model. This allows
+         using a simple energy table declared per_cpu instead of using the EAS
+         energy table.
+
+         Say N if unsure.
+
 config SCHED_USE_FLUID_RT
        bool "Enable Fluid RT scheduler feature"
        depends on SMP
index 394d40109cd2b78099287a986db8aa1f1569d694..262a2dff686ab268dc297de62b18a2f3f0f610f5 100644 (file)
@@ -324,6 +324,7 @@ int select_energy_cpu(struct task_struct *p, int prev_cpu, int sd_flag, int sync
        return select_eco_cpu(&eenv);
 }
 
+#ifdef CONFIG_SIMPLIFIED_ENERGY_MODEL
 static void
 fill_power_table(struct energy_table *table, int table_size,
                        unsigned long *f_table, unsigned int *v_table,
@@ -403,6 +404,7 @@ void init_sched_energy_table(struct cpumask *cpus, int table_size,
        int cpu, i, mips, valid_table_size = 0;
        int max_mips = 0;
        unsigned long max_mips_freq = 0;
+       int last_state;
 
        mips = per_cpu(energy_table, cpumask_any(cpus)).mips;
        for_each_cpu(cpu, cpus) {
@@ -452,9 +454,9 @@ void init_sched_energy_table(struct cpumask *cpus, int table_size,
                        continue;
 
                if (table->mips > max_mips) {
-                       int last_state = table->nr_states - 1;
-
                        max_mips = table->mips;
+
+                       last_state = table->nr_states - 1;
                        max_mips_freq = table->states[last_state].frequency;
                }
        }
@@ -466,12 +468,22 @@ void init_sched_energy_table(struct cpumask *cpus, int table_size,
         * recalculated.
         */
        for_each_possible_cpu(cpu) {
+               struct sched_domain *sd;
+
                table = &per_cpu(energy_table, cpu);
                if (!table->states)
                        continue;
 
                fill_cap_table(table, max_mips, max_mips_freq);
                show_energy_table(table, cpu);
+
+               last_state = table->nr_states - 1;
+               topology_set_cpu_scale(cpu, table->states[last_state].cap);
+
+               rcu_read_lock();
+               for_each_domain(cpu, sd)
+                       update_group_capacity(sd, cpu);
+               rcu_read_unlock();
        }
 }
 
@@ -515,3 +527,4 @@ static int __init init_sched_energy_data(void)
        return 0;
 }
 pure_initcall(init_sched_energy_data);
+#endif /* CONFIG_SIMPLIFIED_ENERGY_MODEL */