static void __ref cpu_up_down_work(struct work_struct *work) { int online_cpus, cpu, l_nr_threshold; int target = target_cpus; struct ip_cpu_info *l_ip_info; if (target < min_cpus_online) target = min_cpus_online; else if (target > max_cpus_online) target = max_cpus_online; online_cpus = num_online_cpus(); if (target < online_cpus) { if (online_cpus <= cpus_boosted && (ktime_to_us(ktime_get()) - last_input < boost_lock_duration)) return; update_per_cpu_stat(); for_each_online_cpu(cpu) { if (cpu == 0) continue; if (check_down_lock(cpu)) break; l_nr_threshold = cpu_nr_run_threshold << 1 / (num_online_cpus()); l_ip_info = &per_cpu(ip_info, cpu); if (l_ip_info->cpu_nr_running < l_nr_threshold) cpu_down(cpu); if (target >= num_online_cpus()) break; } } else if (target > online_cpus) {
static void __ref intelli_plug_work_fn(struct work_struct *work) { unsigned int nr_run_stat; unsigned int cpu_count = 0; unsigned int nr_cpus = 0; int i; if (intelli_plug_active) { nr_run_stat = calculate_thread_stats(); update_per_cpu_stat(); #ifdef DEBUG_INTELLI_PLUG pr_info("nr_run_stat: %u\n", nr_run_stat); #endif cpu_count = nr_run_stat; nr_cpus = num_online_cpus(); if (!suspended) { if (persist_count > 0) persist_count--; switch (cpu_count) { case 1: if (persist_count == 0) { //take down everyone unplug_cpu(0); } #ifdef DEBUG_INTELLI_PLUG pr_info("case 1: %u\n", persist_count); #endif break; case 2: if (persist_count == 0) persist_count = DUAL_PERSISTENCE; if (nr_cpus < 2) { for (i = 1; i < cpu_count; i++) cpu_up(i); } else { unplug_cpu(1); } #ifdef DEBUG_INTELLI_PLUG pr_info("case 2: %u\n", persist_count); #endif break; default: pr_err("Run Stat Error: Bad value %u\n", nr_run_stat); break; } } #ifdef DEBUG_INTELLI_PLUG else pr_info("intelli_plug is suspened!\n"); #endif } queue_delayed_work_on(0, intelliplug_wq, &intelli_plug_work, msecs_to_jiffies(sampling_time)); }