diff options
author | Arjan van de Ven <arjan@linux.intel.com> | 2010-08-12 10:30:27 -0400 |
---|---|---|
committer | Arjan van de Ven <arjan@linux.intel.com> | 2010-08-12 10:30:27 -0400 |
commit | 8a97d45902a5572e757a10462e5b00676b7af30e (patch) | |
tree | d40daadf8a179f9a2ee9d53ddeb4a396771515d8 /cpu | |
parent | 642c62f6342cd34dec065fd62543d0e2d55dce8f (diff) | |
download | powertop-8a97d45902a5572e757a10462e5b00676b7af30e.tar.gz |
fix the idle-state hole
Diffstat (limited to 'cpu')
-rw-r--r-- | cpu/abstract_cpu.cpp | 1 | ||||
-rw-r--r-- | cpu/cpu.h | 2 | ||||
-rw-r--r-- | cpu/intel_cpus.cpp | 40 |
3 files changed, 12 insertions, 31 deletions
diff --git a/cpu/abstract_cpu.cpp b/cpu/abstract_cpu.cpp index 6137389..002b847 100644 --- a/cpu/abstract_cpu.cpp +++ b/cpu/abstract_cpu.cpp @@ -295,6 +295,7 @@ void abstract_cpu::calculate_freq(uint64_t time) idle = is_idle; if (parent) parent->calculate_freq(time); + old_idle = idle; } void abstract_cpu::change_effective_frequency(uint64_t time, uint64_t frequency) @@ -55,7 +55,7 @@ protected: uint64_t max_minus_one_frequency; public: int childcount; - bool idle; + bool idle, old_idle; uint64_t current_frequency; uint64_t effective_frequency; diff --git a/cpu/intel_cpus.cpp b/cpu/intel_cpus.cpp index 5d21189..265cbef 100644 --- a/cpu/intel_cpus.cpp +++ b/cpu/intel_cpus.cpp @@ -193,6 +193,7 @@ void nhm_core::calculate_freq(uint64_t time) idle = is_idle; if (parent) parent->calculate_freq(time); + old_idle = idle; } void nhm_core::change_effective_frequency(uint64_t time, uint64_t frequency) @@ -207,7 +208,7 @@ void nhm_core::change_effective_frequency(uint64_t time, uint64_t frequency) time_delta = 1; fr = effective_frequency; - if (idle) + if (old_idle) fr = 0; account_freq(fr, time_delta); @@ -399,6 +400,7 @@ void nhm_package::calculate_freq(uint64_t time) if (parent) parent->calculate_freq(time); change_effective_frequency(time, current_frequency); + old_idle = idle; } void nhm_package::change_effective_frequency(uint64_t time, uint64_t frequency) @@ -411,7 +413,7 @@ void nhm_package::change_effective_frequency(uint64_t time, uint64_t frequency) time_delta = 1; fr = effective_frequency; - if (idle) + if (old_idle) fr = 0; account_freq(fr, time_delta); @@ -578,6 +580,7 @@ void nhm_cpu::change_freq(uint64_t time, int frequency) if (parent) parent->calculate_freq(time); + old_idle = idle; } void nhm_cpu::change_effective_frequency(uint64_t time, uint64_t frequency) @@ -590,7 +593,7 @@ void nhm_cpu::change_effective_frequency(uint64_t time, uint64_t frequency) time_delta = 1; fr = effective_frequency; - if (idle) + if (old_idle) fr = 0; account_freq(fr, time_delta); @@ -601,43 +604,20 @@ void nhm_cpu::change_effective_frequency(uint64_t time, uint64_t frequency) void nhm_cpu::go_idle(uint64_t time) { - uint64_t time_delta, fr; - - if (last_stamp) - time_delta = time - last_stamp; - else - time_delta = 1; - - fr = current_frequency; - if (idle) - fr = 0; - - account_freq(fr, time_delta); idle = true; - last_stamp = time; + if (parent) parent->calculate_freq(time); + old_idle = idle; } void nhm_cpu::go_unidle(uint64_t time) { - uint64_t time_delta, fr; - - if (last_stamp) - time_delta = time - last_stamp; - else - time_delta = 1; - - fr = current_frequency; - if (idle) - fr = 0; - - account_freq(fr, time_delta); - idle = false; - last_stamp = time; + if (parent) parent->calculate_freq(time); + old_idle = idle; } |