xentop: Add tmem-freeable info when tmem is active
authorKeir Fraser <keir.fraser@citrix.com>
Tue, 1 Dec 2009 13:38:18 +0000 (13:38 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Tue, 1 Dec 2009 13:38:18 +0000 (13:38 +0000)
(No change to xentop output when tmem is inactive.)

Signed-off-by: Dan Magenheimer <dan.magenheimer@oracle.com>
tools/libxc/xenctrl.h
tools/python/xen/xm/main.py
tools/xenstat/libxenstat/src/xenstat.c
tools/xenstat/libxenstat/src/xenstat.h
tools/xenstat/libxenstat/src/xenstat_priv.h
tools/xenstat/xentop/xentop.c

index 9fc05bb30b336518e140293c5db1f214e1d60b22..4b3039802309627997af17c46e541d2a7e2286de 100644 (file)
@@ -32,6 +32,7 @@
 #include <xen/xsm/acm.h>
 #include <xen/xsm/acm_ops.h>
 #include <xen/xsm/flask_op.h>
+#include <xen/tmem.h>
 
 #if defined(__i386__) || defined(__x86_64__)
 #include <xen/foreign/x86_32.h>
index f8d331e42fc3de5b9f42cf3afbeb223c6ebff37a..a62c2d566d12310c5c2e770e17dd5342feace32f 100644 (file)
@@ -220,7 +220,7 @@ SUBCOMMAND_HELP = {
     'tmem-set'      :  ('[<Domain>|-a|--all] [weight=<weight>] [cap=<cap>] '
                         '[compress=<compress>]',
                         'Change tmem settings.'),
-    'tmem-freeable'  :  ('', 'Print number of freeable tmem pages.'),
+    'tmem-freeable'  :  ('', 'Print freeable tmem (in MiB).'),
     'tmem-shared-auth' :  ('[<Domain>|-a|--all] [--uuid=<uuid>] [--auth=<0|1>]', 'De/authenticate shared tmem pool.'),
 
     # security
index 33320513632d0aa6e3fdd38e00d5fd2678da233b..67d861fd552470a91ffe1640591685ca6155073a 100644 (file)
@@ -154,6 +154,7 @@ xenstat_node *xenstat_get_node(xenstat_handle * handle, unsigned int flags)
                return NULL;
        }
 
+
        node->cpu_hz = ((unsigned long long)physinfo.cpu_khz) * 1000ULL;
         node->num_cpus = physinfo.nr_cpus;
        node->tot_mem = ((unsigned long long)physinfo.total_pages)
@@ -161,6 +162,9 @@ xenstat_node *xenstat_get_node(xenstat_handle * handle, unsigned int flags)
        node->free_mem = ((unsigned long long)physinfo.free_pages)
            * handle->page_size;
 
+       node->freeable_mb = (long)xc_tmem_control(handle->xc_handle, -1,
+                               TMEMC_QUERY_FREEABLE_MB, -1, 0, 0, 0, NULL);
+
        /* malloc(0) is not portable, so allocate a single domain.  This will
         * be resized below. */
        node->domains = malloc(sizeof(xenstat_domain));
@@ -304,6 +308,11 @@ unsigned long long xenstat_node_free_mem(xenstat_node * node)
        return node->free_mem;
 }
 
+long xenstat_node_freeable_mb(xenstat_node * node)
+{
+       return node->freeable_mb;
+}
+
 unsigned int xenstat_node_num_domains(xenstat_node * node)
 {
        return node->num_domains;
index dfc27d4d2c766034828e1ac7792305f28f955577..1da354b22a1c3919f06cbc233b2dae4593928719 100644 (file)
@@ -69,6 +69,9 @@ unsigned long long xenstat_node_tot_mem(xenstat_node * node);
 /* Get amount of free memory on a node */
 unsigned long long xenstat_node_free_mem(xenstat_node * node);
 
+/* Get amount of tmem freeable memory (in MiB) on a node */
+long xenstat_node_freeable_mb(xenstat_node * node);
+
 /* Find the number of domains existing on a node */
 unsigned int xenstat_node_num_domains(xenstat_node * node);
 
index ca11d1b3d0eba72ed6760cf6ed15a822ee2d60d0..af955014ae9ae1a121be0a1c062109f71fe27bd6 100644 (file)
@@ -49,6 +49,7 @@ struct xenstat_node {
        unsigned long long free_mem;
        unsigned int num_domains;
        xenstat_domain *domains;        /* Array of length num_domains */
+       long freeable_mb;
 };
 
 struct xenstat_domain {
index cb067ae281986e41ca5d326d0c75d5c31650fbaa..2e6634948b8efeb993bac81a0982ea093b93598d 100644 (file)
@@ -799,6 +799,7 @@ void do_summary(void)
                 crash = 0, dying = 0, shutdown = 0;
        unsigned i, num_domains = 0;
        unsigned long long used = 0;
+       long freeable_mb = 0;
        xenstat_domain *domain;
        time_t curt;
 
@@ -825,12 +826,18 @@ void do_summary(void)
              num_domains, run, block, pause, crash, dying, shutdown);
 
        used = xenstat_node_tot_mem(cur_node)-xenstat_node_free_mem(cur_node);
+       freeable_mb = xenstat_node_freeable_mb(cur_node);
 
        /* Dump node memory and cpu information */
-       print("Mem: %lluk total, %lluk used, %lluk free    "
-             "CPUs: %u @ %lluMHz\n",
+       if ( freeable_mb <= 0 )
+            print("Mem: %lluk total, %lluk used, %lluk free    ",
              xenstat_node_tot_mem(cur_node)/1024, used/1024,
-             xenstat_node_free_mem(cur_node)/1024,
+             xenstat_node_free_mem(cur_node)/1024);
+       else
+            print("Mem: %lluk total, %lluk used, %lluk free, %ldk freeable, ",
+             xenstat_node_tot_mem(cur_node)/1024, used/1024,
+             xenstat_node_free_mem(cur_node)/1024, freeable_mb*1024);
+       print("CPUs: %u @ %lluMHz\n",
              xenstat_node_num_cpus(cur_node),
              xenstat_node_cpu_hz(cur_node)/1000000);
 }