core_ctl: Update cluster nr_run and cpu busy stats under state lock
The cpu busy stats must be updated atomically for all cpus in
a cluster. The nr_run and max_nr stats must be updated atomically
for a cluster. These stats are accessed under state lock else where,
so take the same lock while updating them.
Change-Id: Ifd224768394cc28a9ce40c0295c37a0fb73f09cf
Signed-off-by: Pavankumar Kondeti <pkondeti@codeaurora.org>
diff --git a/kernel/sched/core_ctl.c b/kernel/sched/core_ctl.c
index c3e3777..f95243b 100644
--- a/kernel/sched/core_ctl.c
+++ b/kernel/sched/core_ctl.c
@@ -474,16 +474,19 @@
int max_nr, big_max_nr;
struct cluster_data *cluster;
unsigned int index = 0;
+ unsigned long flags;
sched_get_nr_running_avg(&avg, &iowait_avg, &big_avg,
&max_nr, &big_max_nr);
+ spin_lock_irqsave(&state_lock, flags);
for_each_cluster(cluster, index) {
if (!cluster->inited)
continue;
cluster->nrrun = cluster->is_big_cluster ? big_avg : avg;
cluster->max_nr = cluster->is_big_cluster ? big_max_nr : max_nr;
}
+ spin_unlock_irqrestore(&state_lock, flags);
}
#define MAX_NR_THRESHOLD 4
@@ -668,6 +671,7 @@
struct cpu_data *c;
struct cluster_data *cluster;
unsigned int index = 0;
+ unsigned long flags;
if (unlikely(!initialized))
return;
@@ -677,6 +681,7 @@
core_ctl_check_timestamp = window_start;
+ spin_lock_irqsave(&state_lock, flags);
for_each_possible_cpu(cpu) {
c = &per_cpu(cpu_state, cpu);
@@ -687,6 +692,7 @@
c->busy = sched_get_cpu_util(cpu);
}
+ spin_unlock_irqrestore(&state_lock, flags);
update_running_avg();