WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] Plumb GETVCPUINFO dom0_op through to Python. Remove

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] Plumb GETVCPUINFO dom0_op through to Python. Remove
From: Xen patchbot -unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Mon, 17 Oct 2005 12:12:21 +0000
Delivery-date: Mon, 17 Oct 2005 12:10:35 +0000
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID fa0faada967bfc34cfc3626bc44a6a183e9206f3
# Parent  9b51e7637676902aa9cd4a259e04655246e9dfea
Plumb GETVCPUINFO dom0_op through to Python. Remove
n_vcpu field from GETDOMAININFO: replaced with
nr_online_vcpus and max_vcpu_id (both plumbed through to
Python).

TODO: Remove 'vcpus' entry in getdomaininfo Python
      dictionary.

TODO: Don't represent 'cpumap' as a bitmap in Python.
      It would be more sensible to represent as a list
      of integer CPU numbers.

Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>

diff -r 9b51e7637676 -r fa0faada967b tools/libxc/xc_core.c
--- a/tools/libxc/xc_core.c     Sun Oct 16 16:25:15 2005
+++ b/tools/libxc/xc_core.c     Mon Oct 17 10:36:36 2005
@@ -33,10 +33,10 @@
     unsigned long nr_pages;
     unsigned long *page_array;
     xc_dominfo_t info;
-    int i, j, dump_fd;
+    int i, nr_vcpus = 0, dump_fd;
     char *dump_mem, *dump_mem_start = NULL;
     struct xc_core_header header;
-    vcpu_guest_context_t     ctxt[MAX_VIRT_CPUS];
+    vcpu_guest_context_t  ctxt[MAX_VIRT_CPUS];
 
  
     if ((dump_fd = open(corename, O_CREAT|O_RDWR, S_IWUSR|S_IRUSR)) < 0) {
@@ -54,24 +54,25 @@
         goto error_out;
     }
  
-    for (i = 0, j = 0; i < 32; i++)
-        if (xc_domain_get_vcpu_context(xc_handle, domid, i, &ctxt[j]) == 0)
-            j++;
+    for (i = 0; i < info.max_vcpu_id; i++)
+        if (xc_domain_get_vcpu_context(xc_handle, domid,
+                                       i, &ctxt[nr_vcpus]) == 0)
+            nr_vcpus++;
  
     nr_pages = info.nr_pages;
 
     header.xch_magic = 0xF00FEBED; 
-    header.xch_nr_vcpus = info.vcpus;
+    header.xch_nr_vcpus = nr_vcpus;
     header.xch_nr_pages = nr_pages;
     header.xch_ctxt_offset = sizeof(struct xc_core_header);
     header.xch_index_offset = sizeof(struct xc_core_header) +
-        sizeof(vcpu_guest_context_t)*info.vcpus;
+        sizeof(vcpu_guest_context_t)*nr_vcpus;
     header.xch_pages_offset = round_pgup(sizeof(struct xc_core_header) +
-                                         (sizeof(vcpu_guest_context_t) * 
info.vcpus) + 
+                                         (sizeof(vcpu_guest_context_t) * 
nr_vcpus) +
                                          (nr_pages * sizeof(unsigned long)));
 
     write(dump_fd, &header, sizeof(struct xc_core_header));
-    write(dump_fd, &ctxt, sizeof(ctxt[0]) * info.vcpus);
+    write(dump_fd, &ctxt, sizeof(ctxt[0]) * nr_vcpus);
 
     if ((page_array = malloc(nr_pages * sizeof(unsigned long))) == NULL) {
         printf("Could not allocate memory\n");
diff -r 9b51e7637676 -r fa0faada967b tools/libxc/xc_domain.c
--- a/tools/libxc/xc_domain.c   Sun Oct 16 16:25:15 2005
+++ b/tools/libxc/xc_domain.c   Mon Oct 17 10:36:36 2005
@@ -113,7 +113,8 @@
         info->max_memkb = op.u.getdomaininfo.max_pages << (PAGE_SHIFT - 10);
         info->shared_info_frame = op.u.getdomaininfo.shared_info_frame;
         info->cpu_time = op.u.getdomaininfo.cpu_time;
-        info->vcpus = op.u.getdomaininfo.n_vcpu;
+        info->nr_online_vcpus = op.u.getdomaininfo.nr_online_vcpus;
+        info->max_vcpu_id = op.u.getdomaininfo.max_vcpu_id;
 
         memcpy(info->handle, op.u.getdomaininfo.handle,
                sizeof(xen_domain_handle_t));
@@ -344,6 +345,25 @@
     return do_dom0_op(xc_handle, &op);
 }
 
+int xc_domain_get_vcpu_info(int xc_handle,
+                            uint32_t domid,
+                            uint32_t vcpu,
+                            xc_vcpuinfo_t *info)
+{
+    int rc;
+    dom0_op_t op;
+
+    op.cmd = DOM0_GETVCPUINFO;
+    op.u.getvcpuinfo.domain = (domid_t)domid;
+    op.u.getvcpuinfo.vcpu   = (uint16_t)vcpu;
+
+    rc = do_dom0_op(xc_handle, &op);
+
+    memcpy(info, &op.u.getvcpuinfo, sizeof(*info));
+
+    return rc;
+}
+
 /*
  * Local variables:
  * mode: C
diff -r 9b51e7637676 -r fa0faada967b tools/libxc/xenctrl.h
--- a/tools/libxc/xenctrl.h     Sun Oct 16 16:25:15 2005
+++ b/tools/libxc/xenctrl.h     Mon Oct 17 10:36:36 2005
@@ -132,7 +132,8 @@
     unsigned long shared_info_frame;
     uint64_t      cpu_time;
     unsigned long max_memkb;
-    unsigned int  vcpus;
+    unsigned int  nr_online_vcpus;
+    unsigned int  max_vcpu_id;
     xen_domain_handle_t handle;
 } xc_dominfo_t;
 
@@ -249,6 +250,13 @@
                                uint32_t domid,
                                uint32_t vcpu,
                                vcpu_guest_context_t *ctxt);
+
+typedef dom0_getvcpuinfo_t xc_vcpuinfo_t;
+int xc_domain_get_vcpu_info(int xc_handle,
+                            uint32_t domid,
+                            uint32_t vcpu,
+                            xc_vcpuinfo_t *info);
+
 
 int xc_domain_setcpuweight(int xc_handle,
                            uint32_t domid,
diff -r 9b51e7637676 -r fa0faada967b tools/python/xen/lowlevel/xc/xc.c
--- a/tools/python/xen/lowlevel/xc/xc.c Sun Oct 16 16:25:15 2005
+++ b/tools/python/xen/lowlevel/xc/xc.c Mon Oct 17 10:36:36 2005
@@ -317,10 +317,13 @@
         PyObject *pyhandle = PyList_New(sizeof(xen_domain_handle_t));
         for ( j = 0; j < sizeof(xen_domain_handle_t); j++ )
             PyList_SetItem(pyhandle, j, PyInt_FromLong(info[i].handle[j]));
-        info_dict = Py_BuildValue("{s:i,s:i,s:i,s:i,s:i,s:i,s:i,s:i"
+        info_dict = Py_BuildValue("{s:i,s:i,s:i,s:i,s:i,s:i,s:i,s:i,s:i,s:i"
                                   ",s:l,s:L,s:l,s:i,s:i}",
                                   "dom",       info[i].domid,
-                                  "vcpus",     info[i].vcpus,
+                                  /* XXX 'vcpus' field is obsolete! */
+                                  "vcpus",     info[i].nr_online_vcpus,
+                                  "online_vcpus", info[i].nr_online_vcpus,
+                                  "max_vcpu_id", info[i].max_vcpu_id,
                                   "dying",     info[i].dying,
                                   "crashed",   info[i].crashed,
                                   "shutdown",  info[i].shutdown,
@@ -339,6 +342,38 @@
     free(info);
 
     return list;
+}
+
+static PyObject *pyxc_vcpu_getinfo(PyObject *self,
+                                   PyObject *args,
+                                   PyObject *kwds)
+{
+    XcObject *xc = (XcObject *)self;
+    PyObject *info_dict;
+
+    uint32_t dom, vcpu = 0;
+    xc_vcpuinfo_t info;
+    int rc;
+
+    static char *kwd_list[] = { "dom", "vcpu", NULL };
+    
+    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "i|i", kwd_list,
+                                      &dom, &vcpu) )
+        return NULL;
+
+    rc = xc_domain_get_vcpu_info(xc->xc_handle, dom, vcpu, &info);
+    if ( rc < 0 )
+        return PyErr_SetFromErrno(xc_error);
+
+    info_dict = Py_BuildValue("{s:i,s:i,s:i,s:L,s:i,s:i,s:i}",
+                              "online",   info.online,
+                              "blocked",  info.blocked,
+                              "running",  info.running,
+                              "cpu_time", info.cpu_time,
+                              "cpu",      info.cpu,
+                              "cpumap",   info.cpumap);
+
+    return info_dict;
 }
 
 static PyObject *pyxc_linux_build(PyObject *self,
@@ -948,6 +983,20 @@
       "reason why it shut itself down.\n" 
       " vcpu_to_cpu [[int]]: List that maps VCPUS to CPUS\n" },
 
+    { "vcpu_getinfo", 
+      (PyCFunction)pyxc_vcpu_getinfo, 
+      METH_VARARGS | METH_KEYWORDS, "\n"
+      "Get information regarding a VCPU.\n"
+      " dom  [int]:    Domain to retrieve info about.\n"
+      " vcpu [int, 0]: VCPU to retrieve info about.\n\n"
+      "Returns: [dict]\n"
+      " online   [int]:  Bool - Is this VCPU currently online?\n"
+      " blocked  [int]:  Bool - Is this VCPU blocked waiting for an event?\n"
+      " running  [int]:  Bool - Is this VCPU currently running on a CPU?\n"
+      " cpu_time [long]: CPU time consumed, in nanoseconds\n"
+      " cpumap   [int]:  Bitmap of CPUs this VCPU can run on\n"
+      " cpu      [int]:  CPU that this VCPU is currently bound to\n" },
+
     { "linux_build", 
       (PyCFunction)pyxc_linux_build, 
       METH_VARARGS | METH_KEYWORDS, "\n"
diff -r 9b51e7637676 -r fa0faada967b tools/xenstat/libxenstat/src/xenstat.c
--- a/tools/xenstat/libxenstat/src/xenstat.c    Sun Oct 16 16:25:15 2005
+++ b/tools/xenstat/libxenstat/src/xenstat.c    Mon Oct 17 10:36:36 2005
@@ -229,7 +229,7 @@
                        domain->id = domaininfo[i].domain;
                        domain->state = domaininfo[i].flags;
                        domain->cpu_ns = domaininfo[i].cpu_time;
-                       domain->num_vcpus = domaininfo[i].n_vcpu;
+                       domain->num_vcpus = domaininfo[i].nr_online_vcpus;
                        domain->vcpus = NULL;
                        domain->cur_mem =
                            ((unsigned long long)domaininfo[i].tot_pages)
diff -r 9b51e7637676 -r fa0faada967b xen/common/dom0_ops.c
--- a/xen/common/dom0_ops.c     Sun Oct 16 16:25:15 2005
+++ b/xen/common/dom0_ops.c     Mon Oct 17 10:36:36 2005
@@ -43,10 +43,10 @@
 {
     struct vcpu   *v;
     u64 cpu_time = 0;
-    int vcpu_count = 0;
     int flags = DOMFLAGS_BLOCKED;
     
     info->domain = d->domain_id;
+    info->nr_online_vcpus = 0;
     
     /* 
      * - domain is marked as blocked only if all its vcpus are blocked
@@ -54,18 +54,18 @@
      */
     for_each_vcpu ( d, v ) {
         cpu_time += v->cpu_time;
+        info->max_vcpu_id = v->vcpu_id;
         if ( !test_bit(_VCPUF_down, &v->vcpu_flags) )
         {
             if ( !(v->vcpu_flags & VCPUF_blocked) )
                 flags &= ~DOMFLAGS_BLOCKED;
             if ( v->vcpu_flags & VCPUF_running )
                 flags |= DOMFLAGS_RUNNING;
-            vcpu_count++;
+            info->nr_online_vcpus++;
         }
     }
     
     info->cpu_time = cpu_time;
-    info->n_vcpu = vcpu_count;
     
     info->flags = flags |
         ((d->domain_flags & DOMF_dying)      ? DOMFLAGS_DYING    : 0) |
diff -r 9b51e7637676 -r fa0faada967b xen/include/public/dom0_ops.h
--- a/xen/include/public/dom0_ops.h     Sun Oct 16 16:25:15 2005
+++ b/xen/include/public/dom0_ops.h     Mon Oct 17 10:36:36 2005
@@ -88,7 +88,8 @@
     unsigned long max_pages;
     unsigned long shared_info_frame;       /* MFN of shared_info struct */
     uint64_t cpu_time;
-    uint32_t n_vcpu;
+    uint32_t nr_online_vcpus;     /* Number of VCPUs currently online. */
+    uint32_t max_vcpu_id;         /* Maximum VCPUID in use by this domain. */
     uint32_t ssidref;
     xen_domain_handle_t handle;
 } dom0_getdomaininfo_t;

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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] Plumb GETVCPUINFO dom0_op through to Python. Remove, Xen patchbot -unstable <=