The update function must handle a few types of requests which are reconized based on 'flags'. Add switch which trigger different paths in the code.
Signed-off-by: Lukasz Luba l.luba@partner.samsung.com --- kernel/sched/power.c | 33 ++++++++++++++++++++++++++------- kernel/sched/sched.h | 6 ++++-- 2 files changed, 30 insertions(+), 9 deletions(-)
diff --git a/kernel/sched/power.c b/kernel/sched/power.c index 89e447d442cd..808d8db5c02d 100644 --- a/kernel/sched/power.c +++ b/kernel/sched/power.c @@ -273,6 +273,21 @@ static void sched_power_irq_work(struct irq_work *irq_work) kthread_queue_work(&power->worker, &power->work); }
+static void +sched_power_update_cpu_weight(struct cpu_power *cpower, int cpu, int weight, + int flags, int time) +{ + struct sched_power *sp; + + raw_spin_lock(&cpower->update_lock); + cpower->req.weight = weight; + cpower->req.cpu = cpu; + cpower->req.time = time; + cpower->req.flags = flags; + raw_spin_unlock(&cpower->update_lock); +} + + static void sched_power_update(struct update_sched_power *update, int cpu, int weight, int flags, int time) { @@ -287,14 +302,18 @@ static void sched_power_update(struct update_sched_power *update, int cpu, if (!should_update_next_weight(time, flags)) return;
- sp = cpower->sched_power; + switch (flags) { + case SCHED_POWER_CPU_WEIGHT: + sched_power_update_cpu_weight(cpower, cpu, weight, flags, time); + break; + case SCHED_POWER_CLUSTER_WEIGHT:
- raw_spin_lock(&cpower->update_lock); - cpower->req.weight = weight; - cpower->req.cpu = cpu; - cpower->req.time = time; - cpower->req.flags = flags; - raw_spin_unlock(&cpower->update_lock); + break; + default: + return; + } + + sp = cpower->sched_power;
if (!sp->work_in_progress) { sp->work_in_progress = true; diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index ebaf42e81afa..0b8f8505d3bc 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -2246,7 +2246,9 @@ unsigned long scale_irq_capacity(unsigned long util, unsigned long irq, unsigned #endif
#define SCHED_POWER_FORCE_UPDATE_RT 0x01 -#define SCHED_POWER_CLUSTER_REQ 0x2 +#define SCHED_POWER_CPU_WEIGHT 0x2 +#define SCHED_POWER_CLUSTER_WEIGHT 0x4 + #ifdef CONFIG_THERMAL struct update_sched_power { void (*func)(struct update_sched_power *, int, int, int, int); @@ -2269,7 +2271,7 @@ static inline void sched_power_change_cluster_weight(int cpu, int weight, int flags) { sched_power_change_cpu_weight(cpu, weight, flags | - SCHED_POWER_CLUSTER_REQ); + SCHED_POWER_CLUSTER_WEIGHT); } #else static inline