# 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
|