aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2008-06-30 09:59:39 +0100
committerKeir Fraser <keir.fraser@citrix.com>2008-06-30 09:59:39 +0100
commit0fa687ee1d84a8e5c5d8f2a9ee837a9f4d30b4c3 (patch)
treeeecab8814c8715fe8159ba311436a31fd1ea17ab
parent7d03c1bec2460121d3b07c76e98d1eb3bdba7802 (diff)
downloadxen-0fa687ee1d84a8e5c5d8f2a9ee837a9f4d30b4c3.tar.gz
xen-0fa687ee1d84a8e5c5d8f2a9ee837a9f4d30b4c3.tar.bz2
xen-0fa687ee1d84a8e5c5d8f2a9ee837a9f4d30b4c3.zip
x86: Px statistic update for cpu idle time.
Update px statistic, subtract cx idle time from px residency time. Signed-off-by: Liu Jinsong <jinsong.liu@intel.com>
-rw-r--r--xen/arch/x86/acpi/cpufreq/cpufreq_ondemand.c2
-rw-r--r--xen/arch/x86/acpi/cpufreq/utility.c17
-rw-r--r--xen/arch/x86/acpi/pmstat.c7
-rw-r--r--xen/include/acpi/cpufreq/processor_perf.h5
4 files changed, 30 insertions, 1 deletions
diff --git a/xen/arch/x86/acpi/cpufreq/cpufreq_ondemand.c b/xen/arch/x86/acpi/cpufreq/cpufreq_ondemand.c
index dbd39b5a65..7398dc9607 100644
--- a/xen/arch/x86/acpi/cpufreq/cpufreq_ondemand.c
+++ b/xen/arch/x86/acpi/cpufreq/cpufreq_ondemand.c
@@ -52,7 +52,7 @@ static struct dbs_tuners {
static struct timer dbs_timer[NR_CPUS];
-static inline uint64_t get_cpu_idle_time(unsigned int cpu)
+inline uint64_t get_cpu_idle_time(unsigned int cpu)
{
uint64_t idle_ns;
struct vcpu *v;
diff --git a/xen/arch/x86/acpi/cpufreq/utility.c b/xen/arch/x86/acpi/cpufreq/utility.c
index 966217828b..e34586e3b5 100644
--- a/xen/arch/x86/acpi/cpufreq/utility.c
+++ b/xen/arch/x86/acpi/cpufreq/utility.c
@@ -46,8 +46,15 @@ void px_statistic_suspend(void)
for_each_online_cpu(cpu) {
struct pm_px *pxpt = &px_statistic_data[cpu];
+ uint64_t total_idle_ns;
+ uint64_t tmp_idle_ns;
+
+ total_idle_ns = get_cpu_idle_time(cpu);
+ tmp_idle_ns = total_idle_ns - pxpt->prev_idle_wall;
+
pxpt->u.pt[pxpt->u.cur].residency +=
now - pxpt->prev_state_wall;
+ pxpt->u.pt[pxpt->u.cur].residency -= tmp_idle_ns;
}
}
@@ -61,6 +68,7 @@ void px_statistic_resume(void)
for_each_online_cpu(cpu) {
struct pm_px *pxpt = &px_statistic_data[cpu];
pxpt->prev_state_wall = now;
+ pxpt->prev_idle_wall = get_cpu_idle_time(cpu);
}
}
@@ -74,15 +82,22 @@ void px_statistic_update(cpumask_t cpumask, uint8_t from, uint8_t to)
for_each_cpu_mask(i, cpumask) {
struct pm_px *pxpt = &px_statistic_data[i];
uint32_t statnum = processor_pminfo[i].perf.state_count;
+ uint64_t total_idle_ns;
+ uint64_t tmp_idle_ns;
+
+ total_idle_ns = get_cpu_idle_time(i);
+ tmp_idle_ns = total_idle_ns - pxpt->prev_idle_wall;
pxpt->u.last = from;
pxpt->u.cur = to;
pxpt->u.pt[to].count++;
pxpt->u.pt[from].residency += now - pxpt->prev_state_wall;
+ pxpt->u.pt[from].residency -= tmp_idle_ns;
(*(pxpt->u.trans_pt + from*statnum + to))++;
pxpt->prev_state_wall = now;
+ pxpt->prev_idle_wall = total_idle_ns;
}
}
@@ -114,6 +129,7 @@ int px_statistic_init(int cpuid)
pxpt->u.pt[i].freq = pmpt->perf.states[i].core_frequency;
pxpt->prev_state_wall = NOW();
+ pxpt->prev_idle_wall = get_cpu_idle_time(cpuid);
return 0;
}
@@ -134,6 +150,7 @@ void px_statistic_reset(int cpuid)
}
pxpt->prev_state_wall = NOW();
+ pxpt->prev_idle_wall = get_cpu_idle_time(cpuid);
}
diff --git a/xen/arch/x86/acpi/pmstat.c b/xen/arch/x86/acpi/pmstat.c
index 9aa5a4750a..cf14fc9d64 100644
--- a/xen/arch/x86/acpi/pmstat.c
+++ b/xen/arch/x86/acpi/pmstat.c
@@ -71,11 +71,18 @@ int do_get_pm_info(struct xen_sysctl_get_pmstat *op)
case PMSTAT_get_pxstat:
{
uint64_t now, ct;
+ uint64_t total_idle_ns;
+ uint64_t tmp_idle_ns;
+
+ total_idle_ns = get_cpu_idle_time(op->cpuid);
+ tmp_idle_ns = total_idle_ns - pxpt->prev_idle_wall;
now = NOW();
pxpt->u.usable = pmpt->perf.state_count - pmpt->perf.ppc;
pxpt->u.pt[pxpt->u.cur].residency += now - pxpt->prev_state_wall;
+ pxpt->u.pt[pxpt->u.cur].residency -= tmp_idle_ns;
pxpt->prev_state_wall = now;
+ pxpt->prev_idle_wall = total_idle_ns;
ct = pmpt->perf.state_count;
if ( copy_to_guest(op->u.getpx.trans_pt, pxpt->u.trans_pt, ct*ct) )
diff --git a/xen/include/acpi/cpufreq/processor_perf.h b/xen/include/acpi/cpufreq/processor_perf.h
index e27869c1ac..7a71cfaf84 100644
--- a/xen/include/acpi/cpufreq/processor_perf.h
+++ b/xen/include/acpi/cpufreq/processor_perf.h
@@ -7,17 +7,21 @@
int get_cpu_id(u8);
int acpi_cpufreq_init(void);
int powernow_cpufreq_init(void);
+
void px_statistic_update(cpumask_t, uint8_t, uint8_t);
int px_statistic_init(int);
void px_statistic_reset(int);
void px_statistic_suspend(void);
void px_statistic_resume(void);
+
void cpufreq_dom_exit(void);
int cpufreq_dom_init(void);
int cpufreq_dom_dbs(unsigned int);
void cpufreq_suspend(void);
int cpufreq_resume(void);
+inline uint64_t get_cpu_idle_time(unsigned int);
+
struct processor_performance {
uint32_t state;
uint32_t ppc;
@@ -52,6 +56,7 @@ struct px_stat {
struct pm_px {
struct px_stat u;
uint64_t prev_state_wall;
+ uint64_t prev_idle_wall;
};
extern struct pm_px px_statistic_data[NR_CPUS];