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] Cache the Xen version in the xenstat_handle, since it sh

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] Cache the Xen version in the xenstat_handle, since it should never change.
From: Xen patchbot -unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Fri, 26 Aug 2005 08:52:11 +0000
Delivery-date: Fri, 26 Aug 2005 08:50:41 +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 cl349@xxxxxxxxxxxxxxxxxxxx
# Node ID 9404574350ce3518052685cf5dd48c8aae415cf9
# Parent  af7251014caf505b58d470480fce04854d05e11e
Cache the Xen version in the xenstat_handle, since it should never change.
Use a collector and new flag for Xen version information, to avoid the
extra hypercall if the caller does not want the information.
Reference the xenstat_handle in the xenstat_node for ease of access
later, and update collectors accordingly.
Signed-off-by: Josh Triplett <josht@xxxxxxxxxx>
Signed-off-by: Christian Limpach <Christian.Limpach@xxxxxxxxxxxx>

diff -r af7251014caf -r 9404574350ce tools/xenstat/libxenstat/src/xenstat.c
--- a/tools/xenstat/libxenstat/src/xenstat.c    Fri Aug 26 08:47:49 2005
+++ b/tools/xenstat/libxenstat/src/xenstat.c    Fri Aug 26 08:48:59 2005
@@ -27,23 +27,24 @@
 /*
  * Types
  */
+#define SHORT_ASC_LEN 5                 /* length of 65535 */
+#define VERSION_SIZE (2 * SHORT_ASC_LEN + 1 + sizeof(xen_extraversion_t) + 1)
+
 struct xenstat_handle {
        xi_handle *xihandle;
        int page_size;
        FILE *procnetdev;
+       char xen_version[VERSION_SIZE]; /* xen version running on this node */
 };
 
-#define SHORT_ASC_LEN 5                 /* length of 65535 */
-#define VERSION_SIZE (2 * SHORT_ASC_LEN + 1 + sizeof(xen_extraversion_t) + 1)
-
 struct xenstat_node {
+       xenstat_handle *handle;
        unsigned int flags;
        unsigned long long cpu_hz;
        unsigned int num_cpus;
        unsigned long long tot_mem;
        unsigned long long free_mem;
        unsigned int num_domains;
-       char xen_version[VERSION_SIZE]; /* xen version running on this node */
        xenstat_domain *domains;        /* Array of length num_domains */
 };
 
@@ -83,8 +84,7 @@
  */
 /* Called to collect the information for the node and all the domains on
  * it. When called, the domain information has already been collected. */
-typedef int (*xenstat_collect_func)(xenstat_handle * handle,
-                                   xenstat_node * node);
+typedef int (*xenstat_collect_func)(xenstat_node * node);
 /* Called to free the information collected by the collect function.  The free
  * function will only be called on a xenstat_node if that node includes
  * information collected by the corresponding collector. */
@@ -101,20 +101,23 @@
        xenstat_uninit_func uninit;
 } xenstat_collector;
 
-static int  xenstat_collect_vcpus(xenstat_handle * handle,
-                                 xenstat_node * node);
-static int  xenstat_collect_networks(xenstat_handle * handle,
-                                   xenstat_node * node);
+static int  xenstat_collect_vcpus(xenstat_node * node);
+static int  xenstat_collect_networks(xenstat_node * node);
+static int  xenstat_collect_xen_version(xenstat_node * node);
 static void xenstat_free_vcpus(xenstat_node * node);
 static void xenstat_free_networks(xenstat_node * node);
+static void xenstat_free_xen_version(xenstat_node * node);
 static void xenstat_uninit_vcpus(xenstat_handle * handle);
 static void xenstat_uninit_networks(xenstat_handle * handle);
+static void xenstat_uninit_xen_version(xenstat_handle * handle);
 
 static xenstat_collector collectors[] = {
        { XENSTAT_VCPU, xenstat_collect_vcpus,
          xenstat_free_vcpus, xenstat_uninit_vcpus },
        { XENSTAT_NETWORK, xenstat_collect_networks,
-         xenstat_free_networks, xenstat_uninit_networks }
+         xenstat_free_networks, xenstat_uninit_networks },
+       { XENSTAT_XEN_VERSION, xenstat_collect_xen_version,
+         xenstat_free_xen_version, xenstat_uninit_xen_version }
 };
 
 #define NUM_COLLECTORS (sizeof(collectors)/sizeof(xenstat_collector))
@@ -169,8 +172,6 @@
 #define DOMAIN_CHUNK_SIZE 256
        xenstat_node *node;
        dom0_physinfo_t physinfo;
-       xen_extraversion_t version;
-       long vnum = 0;
        dom0_getdomaininfo_t domaininfo[DOMAIN_CHUNK_SIZE];
        unsigned int num_domains, new_domains;
        unsigned int i;
@@ -180,19 +181,14 @@
        if (node == NULL)
                return NULL;
 
+       /* Store the handle in the node for later access */
+       node->handle = handle;
+
        /* Get information about the physical system */
        if (xi_get_physinfo(handle->xihandle, &physinfo) < 0) {
                free(node);
                return NULL;
        }
-
-       /* Get the xen version number and xen version tag */
-       if (xi_get_xen_version(handle->xihandle, &vnum, &version) < 0) {
-               free(node);
-               return NULL;
-       }
-       snprintf(node->xen_version, VERSION_SIZE, "%ld.%ld%s\n",
-                ((vnum >> 16) & 0xFFFF), vnum & 0xFFFF, version);
 
        node->cpu_hz = ((unsigned long long)physinfo.cpu_khz) * 1000ULL;
        node->num_cpus =
@@ -259,7 +255,7 @@
        for (i = 0; i < NUM_COLLECTORS; i++) {
                if ((flags & collectors[i].flag) == collectors[i].flag) {
                        node->flags |= collectors[i].flag;
-                       if(collectors[i].collect(handle, node) == 0) {
+                       if(collectors[i].collect(node) == 0) {
                                xenstat_free_node(node);
                                return NULL;
                        }
@@ -306,9 +302,9 @@
        return NULL;
 }
 
-const char *xenstat_node_xen_ver(xenstat_node * node)
-{
-       return node->xen_version;
+const char *xenstat_node_xen_version(xenstat_node * node)
+{
+       return node->handle->xen_version;
 }
 
 unsigned long long xenstat_node_tot_mem(xenstat_node * node)
@@ -434,7 +430,7 @@
  * VCPU functions
  */
 /* Collect information about VCPUs */
-static int xenstat_collect_vcpus(xenstat_handle * handle, xenstat_node * node)
+static int xenstat_collect_vcpus(xenstat_node * node)
 {
        unsigned int i, vcpu;
        /* Fill in VCPU information */
@@ -447,10 +443,9 @@
                for (vcpu = 0; vcpu < node->domains[i].num_vcpus; vcpu++) {
                        /* FIXME: need to be using a more efficient mechanism*/
                        long long vcpu_time;
-                       vcpu_time =
-                           xi_get_vcpu_usage(handle->xihandle,
-                                             node->domains[i].id,
-                                             vcpu);
+                       vcpu_time = xi_get_vcpu_usage(node->handle->xihandle,
+                                                     node->domains[i].id,
+                                                     vcpu);
                        if (vcpu_time < 0)
                                return 0;
                        node->domains[i].vcpus[vcpu].ns = vcpu_time;
@@ -490,21 +485,20 @@
     "bytes    packets errs drop fifo colls carrier compressed\n";
 
 /* Collect information about networks */
-static int xenstat_collect_networks(xenstat_handle * handle,
-                                   xenstat_node * node)
+static int xenstat_collect_networks(xenstat_node * node)
 {
        /* Open and validate /proc/net/dev if we haven't already */
-       if (handle->procnetdev == NULL) {
+       if (node->handle->procnetdev == NULL) {
                char header[sizeof(PROCNETDEV_HEADER)];
-               handle->procnetdev = fopen("/proc/net/dev", "r");
-               if (handle->procnetdev == NULL) {
+               node->handle->procnetdev = fopen("/proc/net/dev", "r");
+               if (node->handle->procnetdev == NULL) {
                        perror("Error opening /proc/net/dev");
                        return 1;
                }
 
                /* Validate the format of /proc/net/dev */
                if (fread(header, sizeof(PROCNETDEV_HEADER) - 1, 1,
-                         handle->procnetdev) != 1) {
+                         node->handle->procnetdev) != 1) {
                        perror("Error reading /proc/net/dev header");
                        return 1;
                }
@@ -518,12 +512,13 @@
 
        /* Fill in networks */
        /* FIXME: optimize this */
-       fseek(handle->procnetdev, sizeof(PROCNETDEV_HEADER) - 1, SEEK_SET);
+       fseek(node->handle->procnetdev, sizeof(PROCNETDEV_HEADER) - 1,
+             SEEK_SET);
        while (1) {
                xenstat_domain *domain;
                xenstat_network net;
                unsigned int domid;
-               int ret = fscanf(handle->procnetdev,
+               int ret = fscanf(node->handle->procnetdev,
                                 "vif%u.%u:%llu%llu%llu%llu%*u%*u%*u%*u"
                                 "%llu%llu%llu%llu%*u%*u%*u%*u\n",
                                 &domid, &net.id,
@@ -536,7 +531,7 @@
                if (ret != 10) {
                        unsigned int c;
                        do {
-                               c = fgetc(handle->procnetdev);
+                               c = fgetc(node->handle->procnetdev);
                        } while (c != '\n' && c != EOF);
                        if (c == EOF)
                                break;
@@ -638,3 +633,37 @@
 {
        return network->tdrop;
 }
+
+/*
+ * Xen version functions
+ */
+
+/* Collect Xen version information */
+static int xenstat_collect_xen_version(xenstat_node * node)
+{
+       long vnum = 0;
+       xen_extraversion_t version;
+
+       /* Collect Xen version information if not already collected */
+       if (node->handle->xen_version[0] == '\0') {
+               /* Get the Xen version number and extraversion string */
+               if (xi_get_xen_version(node->handle->xihandle,
+                                      &vnum, &version) < 0)
+                       return 0;
+               /* Format the version information as a string and store it */
+               snprintf(node->handle->xen_version, VERSION_SIZE, "%ld.%ld%s",
+                        ((vnum >> 16) & 0xFFFF), vnum & 0xFFFF, version);
+       }
+
+       return 1;
+}
+
+/* Free Xen version information in node - nothing to do */
+static void xenstat_free_xen_version(xenstat_node * node)
+{
+}
+
+/* Free Xen version information in handle - nothing to do */
+static void xenstat_uninit_xen_version(xenstat_handle * handle)
+{
+}
diff -r af7251014caf -r 9404574350ce tools/xenstat/libxenstat/src/xenstat.h
--- a/tools/xenstat/libxenstat/src/xenstat.h    Fri Aug 26 08:47:49 2005
+++ b/tools/xenstat/libxenstat/src/xenstat.h    Fri Aug 26 08:48:59 2005
@@ -31,10 +31,13 @@
 /* Release the handle to libxc, free resources, etc. */
 void xenstat_uninit(xenstat_handle * handle);
 
-/* Get all available information about a node */
+/* Flags for types of information to collect in xenstat_get_node */
 #define XENSTAT_VCPU 0x1
 #define XENSTAT_NETWORK 0x2
-#define XENSTAT_ALL (XENSTAT_VCPU|XENSTAT_NETWORK)
+#define XENSTAT_XEN_VERSION 0x4
+#define XENSTAT_ALL (XENSTAT_VCPU|XENSTAT_NETWORK|XENSTAT_XEN_VERSION)
+
+/* Get all available information about a node */
 xenstat_node *xenstat_get_node(xenstat_handle * handle, unsigned int flags);
 
 /* Free the information */
@@ -53,7 +56,7 @@
                                             unsigned index);
 
 /* Get xen version of the node */
-const char *xenstat_node_xen_ver(xenstat_node * node);
+const char *xenstat_node_xen_version(xenstat_node * node);
 
 /* Get amount of total memory on a node */
 unsigned long long xenstat_node_tot_mem(xenstat_node * node);

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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] Cache the Xen version in the xenstat_handle, since it should never change., Xen patchbot -unstable <=