[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] Avoid negative runstate pieces.



# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1228917941 0
# Node ID 6401c9533ef52e9217b39fa7f07df97e757683bc
# Parent  2a349db39496263fb326af12042c8ebdf421b071
Avoid negative runstate pieces.

Also consolidate all places to get cpu idle time.

Signed-off-by: Kevin Tian <kevin.tian@xxxxxxxxx>
Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx>
---
 xen/arch/x86/acpi/cpu_idle.c           |    5 ---
 xen/arch/x86/platform_hypercall.c      |   10 -------
 xen/common/schedule.c                  |   46 ++++++++++++++++++++++-----------
 xen/common/sysctl.c                    |    9 ------
 xen/drivers/cpufreq/cpufreq_ondemand.c |   15 ----------
 xen/include/xen/sched.h                |    1 
 6 files changed, 35 insertions(+), 51 deletions(-)

diff -r 2a349db39496 -r 6401c9533ef5 xen/arch/x86/acpi/cpu_idle.c
--- a/xen/arch/x86/acpi/cpu_idle.c      Wed Dec 10 13:41:34 2008 +0000
+++ b/xen/arch/x86/acpi/cpu_idle.c      Wed Dec 10 14:05:41 2008 +0000
@@ -749,7 +749,6 @@ int pmstat_get_cx_stat(uint32_t cpuid, s
 int pmstat_get_cx_stat(uint32_t cpuid, struct pm_cx_stat *stat)
 {
     const struct acpi_processor_power *power = processor_powers[cpuid];
-    struct vcpu *v = idle_vcpu[cpuid];
     uint64_t usage;
     int i;
 
@@ -763,9 +762,7 @@ int pmstat_get_cx_stat(uint32_t cpuid, s
 
     stat->last = power->last_state ? power->last_state->idx : 0;
     stat->nr = power->count;
-    stat->idle_time = v->runstate.time[RUNSTATE_running];
-    if ( v->is_running )
-        stat->idle_time += NOW() - v->runstate.state_entry_time;
+    stat->idle_time = get_cpu_idle_time(cpuid);
 
     for ( i = 0; i < power->count; i++ )
     {
diff -r 2a349db39496 -r 6401c9533ef5 xen/arch/x86/platform_hypercall.c
--- a/xen/arch/x86/platform_hypercall.c Wed Dec 10 13:41:34 2008 +0000
+++ b/xen/arch/x86/platform_hypercall.c Wed Dec 10 14:05:41 2008 +0000
@@ -337,16 +337,8 @@ ret_t do_platform_op(XEN_GUEST_HANDLE(xe
         for_each_cpu_mask ( cpu, cpumap )
         {
             if ( (v = idle_vcpu[cpu]) != NULL )
-            {
-                idletime = v->runstate.time[RUNSTATE_running];
-                if ( v->is_running )
-                    idletime += now - v->runstate.state_entry_time;
-            }
-            else
-            {
-                idletime = 0;
                 cpu_clear(cpu, cpumap);
-            }
+            idletime = get_cpu_idle_time(cpu);
 
             ret = -EFAULT;
             if ( copy_to_guest_offset(idletimes, cpu, &idletime, 1) )
diff -r 2a349db39496 -r 6401c9533ef5 xen/common/schedule.c
--- a/xen/common/schedule.c     Wed Dec 10 13:41:34 2008 +0000
+++ b/xen/common/schedule.c     Wed Dec 10 14:05:41 2008 +0000
@@ -84,33 +84,49 @@ static inline void vcpu_runstate_change(
 static inline void vcpu_runstate_change(
     struct vcpu *v, int new_state, s_time_t new_entry_time)
 {
+    s_time_t delta;
+
     ASSERT(v->runstate.state != new_state);
     ASSERT(spin_is_locked(&per_cpu(schedule_data,v->processor).schedule_lock));
 
     trace_runstate_change(v, new_state);
 
-    v->runstate.time[v->runstate.state] +=
-        new_entry_time - v->runstate.state_entry_time;
-    v->runstate.state_entry_time = new_entry_time;
     v->runstate.state = new_state;
+
+    delta = new_entry_time - v->runstate.state_entry_time;
+    if ( delta > 0 )
+    {
+        v->runstate.time[v->runstate.state] += delta;
+        v->runstate.state_entry_time = new_entry_time;
+    }
 }
 
 void vcpu_runstate_get(struct vcpu *v, struct vcpu_runstate_info *runstate)
 {
-    if ( likely(v == current) )
-    {
-        /* Fast lock-free path. */
-        memcpy(runstate, &v->runstate, sizeof(*runstate));
-        ASSERT(runstate->state == RUNSTATE_running);
-        runstate->time[RUNSTATE_running] += NOW() - runstate->state_entry_time;
-    }
-    else
-    {
+    s_time_t delta;
+
+    if ( unlikely(v != current) )
         vcpu_schedule_lock_irq(v);
-        memcpy(runstate, &v->runstate, sizeof(*runstate));
-        runstate->time[runstate->state] += NOW() - runstate->state_entry_time;
+
+    memcpy(runstate, &v->runstate, sizeof(*runstate));
+    delta = NOW() - runstate->state_entry_time;
+    if ( delta > 0 )
+        runstate->time[runstate->state] += delta;
+
+    if ( unlikely(v != current) )
         vcpu_schedule_unlock_irq(v);
-    }
+}
+
+uint64_t get_cpu_idle_time(unsigned int cpu)
+{
+    struct vcpu_runstate_info state = { .state = RUNSTATE_running };
+    struct vcpu *v;
+
+    if ( (v = idle_vcpu[cpu]) == NULL )
+        return 0;
+
+    vcpu_runstate_get(v, &state);
+    return state.time[RUNSTATE_running];
 }
 
 int sched_init_vcpu(struct vcpu *v, unsigned int processor) 
diff -r 2a349db39496 -r 6401c9533ef5 xen/common/sysctl.c
--- a/xen/common/sysctl.c       Wed Dec 10 13:41:34 2008 +0000
+++ b/xen/common/sysctl.c       Wed Dec 10 14:05:41 2008 +0000
@@ -167,7 +167,6 @@ long do_sysctl(XEN_GUEST_HANDLE(xen_sysc
     {
         uint32_t i, nr_cpus;
         struct xen_sysctl_cpuinfo cpuinfo;
-        struct vcpu *v;
 
         nr_cpus = min_t(uint32_t, op->u.getcpuinfo.max_cpus, NR_CPUS);
 
@@ -177,13 +176,7 @@ long do_sysctl(XEN_GUEST_HANDLE(xen_sysc
 
         for ( i = 0; i < nr_cpus; i++ )
         {
-            /* Assume no holes in idle-vcpu map. */
-            if ( (v = idle_vcpu[i]) == NULL )
-                break;
-
-            cpuinfo.idletime = v->runstate.time[RUNSTATE_running];
-            if ( v->is_running )
-                cpuinfo.idletime += NOW() - v->runstate.state_entry_time;
+            cpuinfo.idletime = get_cpu_idle_time(i);
 
             ret = -EFAULT;
             if ( copy_to_guest_offset(op->u.getcpuinfo.info, i, &cpuinfo, 1) )
diff -r 2a349db39496 -r 6401c9533ef5 xen/drivers/cpufreq/cpufreq_ondemand.c
--- a/xen/drivers/cpufreq/cpufreq_ondemand.c    Wed Dec 10 13:41:34 2008 +0000
+++ b/xen/drivers/cpufreq/cpufreq_ondemand.c    Wed Dec 10 14:05:41 2008 +0000
@@ -93,21 +93,6 @@ int get_cpufreq_ondemand_para(uint32_t *
     *up_threshold = dbs_tuners_ins.up_threshold;
 
     return 0;
-}
-
-uint64_t get_cpu_idle_time(unsigned int cpu)
-{
-    uint64_t idle_ns;
-    struct vcpu *v;
-
-    if ((v = idle_vcpu[cpu]) == NULL)
-        return 0;
-
-    idle_ns = v->runstate.time[RUNSTATE_running];
-    if (v->is_running)
-        idle_ns += NOW() - v->runstate.state_entry_time;
-
-    return idle_ns;
 }
 
 static void dbs_check_cpu(struct cpu_dbs_info_s *this_dbs_info)
diff -r 2a349db39496 -r 6401c9533ef5 xen/include/xen/sched.h
--- a/xen/include/xen/sched.h   Wed Dec 10 13:41:34 2008 +0000
+++ b/xen/include/xen/sched.h   Wed Dec 10 14:05:41 2008 +0000
@@ -538,6 +538,7 @@ void vcpu_unlock_affinity(struct vcpu *v
 void vcpu_unlock_affinity(struct vcpu *v, cpumask_t *affinity);
 
 void vcpu_runstate_get(struct vcpu *v, struct vcpu_runstate_info *runstate);
+uint64_t get_cpu_idle_time(unsigned int cpu);
 
 #define IS_PRIV(_d) ((_d)->is_privileged)
 #define IS_PRIV_FOR(_d, _t) (IS_PRIV(_d) || ((_d)->target && (_d)->target == 
(_t)))

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.