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

[Xen-devel] [PATCH] x86/cpuidle: clean up statistics reporting to user mode


  • To: "xen-devel" <xen-devel@xxxxxxxxxxxxx>
  • From: "Jan Beulich" <JBeulich@xxxxxxxx>
  • Date: Thu, 09 Aug 2012 16:07:00 +0100
  • Delivery-date: Thu, 09 Aug 2012 15:07:38 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xen.org>

First of all, when no ACPI Cx data was reported, make sure the usage
count passed back to user mode is not random.

Besides that, fold a lot of redundant code.

Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>

--- a/xen/arch/x86/acpi/cpu_idle.c
+++ b/xen/arch/x86/acpi/cpu_idle.c
@@ -1100,36 +1100,23 @@ 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 = get_cpu_idle_time(cpuid);
 
     /* mimic the stat when detail info hasn't been registered by dom0 */
     if ( pm_idle_save == NULL )
     {
-        /* C1 */
-        usage[1] = 1;
-        res[1] = stat->idle_time;
-
-        /* C0 */
-        res[0] = NOW() - res[1];
-
-        if ( copy_to_guest_offset(stat->triggers, 0, &usage[0], 2) ||
-            copy_to_guest_offset(stat->residencies, 0, &res[0], 2) )
-            return -EFAULT;
-
-        stat->pc2 = 0;
-        stat->pc3 = 0;
-        stat->pc6 = 0;
-        stat->pc7 = 0;
-        stat->cc3 = 0;
-        stat->cc6 = 0;
-        stat->cc7 = 0;
-        return 0;
-    }
+        stat->nr = 2;
+
+        usage[1] = idle_usage = 1;
+        res[1] = idle_res = stat->idle_time;
 
-    for ( i = power->count - 1; i >= 0; i-- )
+        memset(&hw_res, 0, sizeof(hw_res));
+    }
+    else
     {
-        if ( i != 0 )
+        stat->nr = power->count;
+
+        for ( i = 1; i < power->count; i++ )
         {
             spin_lock_irq(&power->stat_lock);
             usage[i] = power->states[i].usage;
@@ -1139,18 +1126,16 @@ int pmstat_get_cx_stat(uint32_t cpuid, s
             idle_usage += usage[i];
             idle_res += res[i];
         }
-        else
-        {
-            usage[i] = idle_usage;
-            res[i] = NOW() - idle_res;
-        }
+
+        get_hw_residencies(cpuid, &hw_res);
     }
 
-    if ( copy_to_guest_offset(stat->triggers, 0, &usage[0], power->count) ||
-        copy_to_guest_offset(stat->residencies, 0, &res[0], power->count) )
-        return -EFAULT;
+    usage[0] = idle_usage;
+    res[0] = NOW() - idle_res;
 
-    get_hw_residencies(cpuid, &hw_res);
+    if ( copy_to_guest(stat->triggers, usage, stat->nr) ||
+         copy_to_guest(stat->residencies, res, stat->nr) )
+        return -EFAULT;
 
     stat->pc2 = hw_res.pc2;
     stat->pc3 = hw_res.pc3;



Attachment: x86-cpuidle-stats-no-Cx.patch
Description: Text document

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel

 


Rackspace

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