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

[Xen-changelog] [xen-unstable] Add new sysctl to return runtime information about physical CPU utilization.



# HG changeset patch
# User Steven Hand <steven@xxxxxxxxxxxxx>
# Date 1182974468 -3600
# Node ID 4ab9e4bbd61b4748ccc76566af88d98cd4e7bbb1
# Parent  9590c9b48e07ad3308519e834c7dfe01e8845e49
Add new sysctl to return runtime information about physical CPU utilization.

Signed-off-by: Steven Hadn <steven@xxxxxxxxxxxxx>
---
 tools/libxc/xc_misc.c       |   19 +++++++++++++++++++
 tools/libxc/xenctrl.h       |    2 ++
 xen/common/schedule.c       |    8 ++++++--
 xen/common/sysctl.c         |   32 ++++++++++++++++++++++++++++++++
 xen/include/public/sysctl.h |   13 +++++++++++++
 5 files changed, 72 insertions(+), 2 deletions(-)

diff -r 9590c9b48e07 -r 4ab9e4bbd61b tools/libxc/xc_misc.c
--- a/tools/libxc/xc_misc.c     Wed Jun 27 20:56:25 2007 +0100
+++ b/tools/libxc/xc_misc.c     Wed Jun 27 21:01:08 2007 +0100
@@ -108,6 +108,25 @@ int xc_perfc_control(int xc_handle,
 
     return rc;
 }
+
+int xc_cpuinfo(int xc_handle, int max_cpus, uint64_t *info, int *nr_cpus)
+{
+    int ret;
+    DECLARE_SYSCTL;
+
+    sysctl.cmd = XEN_SYSCTL_cpuinfo;
+    sysctl.u.cpuinfo.max_cpus = max_cpus; 
+    set_xen_guest_handle(sysctl.u.cpuinfo.buffer, info); 
+
+    if ( (ret = do_sysctl(xc_handle, &sysctl)) != 0 )
+        return ret;
+
+    if(nr_cpus) 
+        *nr_cpus = sysctl.u.cpuinfo.nr_cpus; 
+
+    return 0;
+}
+
 
 int xc_hvm_set_pci_intx_level(
     int xc_handle, domid_t dom,
diff -r 9590c9b48e07 -r 4ab9e4bbd61b tools/libxc/xenctrl.h
--- a/tools/libxc/xenctrl.h     Wed Jun 27 20:56:25 2007 +0100
+++ b/tools/libxc/xenctrl.h     Wed Jun 27 21:01:08 2007 +0100
@@ -479,6 +479,8 @@ int xc_sched_id(int xc_handle,
 int xc_sched_id(int xc_handle,
                 int *sched_id);
 
+int xc_cpuinfo(int xc_handle, int max_cpus, uint64_t *info, int *nr_cpus); 
+
 int xc_domain_setmaxmem(int xc_handle,
                         uint32_t domid,
                         unsigned int max_memkb);
diff -r 9590c9b48e07 -r 4ab9e4bbd61b xen/common/schedule.c
--- a/xen/common/schedule.c     Wed Jun 27 20:56:25 2007 +0100
+++ b/xen/common/schedule.c     Wed Jun 27 21:01:08 2007 +0100
@@ -72,8 +72,12 @@ static inline void vcpu_runstate_change(
     ASSERT(v->runstate.state != new_state);
     ASSERT(spin_is_locked(&per_cpu(schedule_data,v->processor).schedule_lock));
 
-    v->runstate.time[v->runstate.state] +=
-        new_entry_time - v->runstate.state_entry_time;
+    if(unlikely((v->runstate.state_entry_time - new_entry_time) > TIME_SLOP))
+        /* Local time on this CPU has been warped */
+        v->runstate.time[v->runstate.state] = new_entry_time; 
+    else 
+        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;
 }
diff -r 9590c9b48e07 -r 4ab9e4bbd61b xen/common/sysctl.c
--- a/xen/common/sysctl.c       Wed Jun 27 20:56:25 2007 +0100
+++ b/xen/common/sysctl.c       Wed Jun 27 21:01:08 2007 +0100
@@ -136,6 +136,38 @@ long do_sysctl(XEN_GUEST_HANDLE(xen_sysc
     }
     break;
 
+    case XEN_SYSCTL_cpuinfo:
+    {
+        uint32_t i, nr_cpus;
+        uint64_t idletime;
+
+        nr_cpus = (op->u.cpuinfo.max_cpus > NR_CPUS) ? NR_CPUS :
+            op->u.cpuinfo.max_cpus;
+
+        for ( i = 0; i < nr_cpus; i++ )
+        {
+            if(!idle_vcpu[i])
+                /* XXX: assumes no further CPUs after first missing one */
+                break;
+
+            /* somewhat imprecise but should suffice */
+            idletime = idle_vcpu[i]->runstate.time[RUNSTATE_running] +
+                (NOW() - idle_vcpu[i]->runstate.state_entry_time);
+            if ( copy_to_guest_offset(op->u.cpuinfo.buffer, i, &idletime, 1) )
+            {
+                ret = -EFAULT;
+                break;
+            }
+        }
+
+        op->u.cpuinfo.nr_cpus = i;
+        ret = 0;
+
+        if( copy_to_guest (u_sysctl, op, 1) )
+            ret = -EFAULT;
+    }
+    break;
+
     default:
         ret = arch_do_sysctl(op, u_sysctl);
         break;
diff -r 9590c9b48e07 -r 4ab9e4bbd61b xen/include/public/sysctl.h
--- a/xen/include/public/sysctl.h       Wed Jun 27 20:56:25 2007 +0100
+++ b/xen/include/public/sysctl.h       Wed Jun 27 21:01:08 2007 +0100
@@ -152,6 +152,18 @@ typedef struct xen_sysctl_debug_keys xen
 typedef struct xen_sysctl_debug_keys xen_sysctl_debug_keys_t;
 DEFINE_XEN_GUEST_HANDLE(xen_sysctl_debug_keys_t);
 
+/* Get physical CPU information */
+#define XEN_SYSCTL_cpuinfo           8
+struct xen_sysctl_cpuinfo {
+    /* IN variables. */
+    uint32_t                      max_cpus;
+    XEN_GUEST_HANDLE_64(uint64_t) buffer;
+    /* IN/OUT variables. */
+    uint32_t                      nr_cpus;
+}; 
+typedef struct xen_sysctl_cpuinfo xen_sysctl_cpuinfo_t;
+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_cpuinfo_t); 
+
 struct xen_sysctl {
     uint32_t cmd;
     uint32_t interface_version; /* XEN_SYSCTL_INTERFACE_VERSION */
@@ -163,6 +175,7 @@ struct xen_sysctl {
         struct xen_sysctl_perfc_op          perfc_op;
         struct xen_sysctl_getdomaininfolist getdomaininfolist;
         struct xen_sysctl_debug_keys        debug_keys;
+        struct xen_sysctl_cpuinfo           cpuinfo;
         uint8_t                             pad[128];
     } u;
 };

_______________________________________________
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®.