aboutsummaryrefslogtreecommitdiff
path: root/cpu
diff options
context:
space:
mode:
authorArjan van de Ven <arjan@linux.intel.com>2010-08-12 10:30:27 -0400
committerArjan van de Ven <arjan@linux.intel.com>2010-08-12 10:30:27 -0400
commit8a97d45902a5572e757a10462e5b00676b7af30e (patch)
treed40daadf8a179f9a2ee9d53ddeb4a396771515d8 /cpu
parent642c62f6342cd34dec065fd62543d0e2d55dce8f (diff)
downloadpowertop-8a97d45902a5572e757a10462e5b00676b7af30e.tar.gz
fix the idle-state hole
Diffstat (limited to 'cpu')
-rw-r--r--cpu/abstract_cpu.cpp1
-rw-r--r--cpu/cpu.h2
-rw-r--r--cpu/intel_cpus.cpp40
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)
diff --git a/cpu/cpu.h b/cpu/cpu.h
index 4e585c0..56acacd 100644
--- a/cpu/cpu.h
+++ b/cpu/cpu.h
@@ -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;
}