static bool __load_stats_work_func(void) { bool up = false; bool sample = false; unsigned int cpu = nr_cpu_ids; switch (load_stats_state) { case DISABLED: break; case IDLE: sample = true; break; case UP: cpu = cpumask_next_zero(0, cpu_online_mask); up = true; sample = true; break; case DOWN: cpu = get_lightest_loaded_cpu_n(); sample = true; break; default: pr_err("%s: invalid cpuquiet runnable governor state %d\n", __func__, load_stats_state); break; } if (cpu < nr_cpu_ids) { if (up) cpuquiet_wake_cpu(cpu); else cpuquiet_quiesence_cpu(cpu); } return sample; }
static int governor_set(unsigned int cpu, bool active) { int err; mutex_lock(&userspace_mutex); if (active) err = cpuquiet_wake_cpu(cpu, true); else err = cpuquiet_quiesence_cpu(cpu, true); mutex_unlock(&userspace_mutex); return err; }
static void runnables_work_func(struct work_struct *work) { bool up = false; bool sample = false; unsigned int cpu = nr_cpu_ids; mutex_lock(&runnables_work_lock); update_runnables_state(); switch (runnables_state) { case DISABLED: break; case IDLE: sample = true; break; case UP: //cpu = cpumask_next_zero(0, cpu_online_mask); cpu = best_core_to_turn_up(); up = true; sample = true; break; case DOWN: cpu = get_lightest_loaded_cpu_n(); sample = true; break; default: pr_err("%s: invalid cpuquiet runnable governor state %d\n", __func__, runnables_state); break; } if (sample) queue_delayed_work(runnables_wq, &runnables_work, msecs_to_jiffies(sample_rate)); if (cpu < nr_cpu_ids) { if (up) cpuquiet_wake_cpu(cpu); else cpuquiet_quiesence_cpu(cpu); } mutex_unlock(&runnables_work_lock); }