コード例 #1
0
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;
}
コード例 #2
0
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;
}
コード例 #3
0
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);
}