Dan Magenheimer
2009-Dec-09  00:56 UTC
[Xen-devel] [PATCH] tmem/xentop: add useful tmem output to xentop
Report a few key per-domain tmem statistics in xentop.
Signed-off-by: Dan Magenheimer <dan.magenheimer@oracle.com>
diff -r 7f611de6b93c tools/xenstat/libxenstat/src/xenstat.c
--- a/tools/xenstat/libxenstat/src/xenstat.c	Tue Dec 08 14:14:27 2009 +0000
+++ b/tools/xenstat/libxenstat/src/xenstat.c	Tue Dec 08 17:16:29 2009 -0700
@@ -131,6 +131,32 @@ void xenstat_uninit(xenstat_handle * han
 	}
 }
 
+static inline unsigned long long parse(char *s, char *match)
+{
+	char *s1 = strstr(s,match);
+	unsigned long long ret;
+
+	if ( s1 == NULL )
+		return 0LL;
+	s1 += 2;
+	if ( *s1++ != '':'' )
+		return 0LL;
+	sscanf(s1,"%llu",&ret);
+	return ret;
+}
+
+void domain_get_tmem_stats(xenstat_handle * handle, xenstat_domain * domain)
+{
+	char buffer[4096];
+
+	xc_tmem_control(handle->xc_handle,-1,TMEMC_LIST,domain->id,
+                        sizeof(buffer),-1,-1,buffer);
+	domain->tmem_stats.curr_eph_pages = parse(buffer,"Ec");
+	domain->tmem_stats.succ_eph_gets = parse(buffer,"Ge");
+	domain->tmem_stats.succ_pers_puts = parse(buffer,"Pp");
+	domain->tmem_stats.succ_pers_gets = parse(buffer,"Gp");
+}
+
 xenstat_node *xenstat_get_node(xenstat_handle * handle, unsigned int flags)
 {
 #define DOMAIN_CHUNK_SIZE 256
@@ -232,11 +258,13 @@ xenstat_node *xenstat_get_node(xenstat_h
 			domain->networks = NULL;
 			domain->num_vbds = 0;
 			domain->vbds = NULL;
+			domain_get_tmem_stats(handle,domain);
 
 			domain++;
 			node->num_domains++;
 		}
 	} while (new_domains == DOMAIN_CHUNK_SIZE);
+
 
 	/* Run all the extra data collectors requested */
 	node->flags = 0;
@@ -674,6 +702,40 @@ unsigned long long xenstat_vbd_wr_sects(
 	return vbd->wr_sects;
 }
 
+/*
+ * Tmem functions
+ */
+
+xenstat_tmem *xenstat_domain_tmem(xenstat_domain * domain)
+{
+	return &domain->tmem_stats;
+}
+
+/* Get the current number of ephemeral pages */
+unsigned long long xenstat_tmem_curr_eph_pages(xenstat_tmem *tmem)
+{
+	return tmem->curr_eph_pages;
+}
+
+/* Get the number of successful ephemeral gets */
+unsigned long long xenstat_tmem_succ_eph_gets(xenstat_tmem *tmem)
+{
+	return tmem->succ_eph_gets;
+}
+
+/* Get the number of successful persistent puts */
+unsigned long long xenstat_tmem_succ_pers_puts(xenstat_tmem *tmem)
+{
+	return tmem->succ_pers_puts;
+}
+
+/* Get the number of successful persistent gets */
+unsigned long long xenstat_tmem_succ_pers_gets(xenstat_tmem *tmem)
+{
+	return tmem->succ_pers_gets;
+}
+
+
 static char *xenstat_get_domain_name(xenstat_handle *handle, unsigned int
domain_id)
 {
 	char path[80], *vmpath;
diff -r 7f611de6b93c tools/xenstat/libxenstat/src/xenstat.h
--- a/tools/xenstat/libxenstat/src/xenstat.h	Tue Dec 08 14:14:27 2009 +0000
+++ b/tools/xenstat/libxenstat/src/xenstat.h	Tue Dec 08 17:16:29 2009 -0700
@@ -27,6 +27,7 @@ typedef struct xenstat_vcpu xenstat_vcpu
 typedef struct xenstat_vcpu xenstat_vcpu;
 typedef struct xenstat_network xenstat_network;
 typedef struct xenstat_vbd xenstat_vbd;
+typedef struct xenstat_tmem xenstat_tmem;
 
 /* Initialize the xenstat library.  Returns a handle to be used with
  * subsequent calls to the xenstat library, or NULL if an error occurs. */
@@ -132,6 +133,9 @@ xenstat_vbd *xenstat_domain_vbd(xenstat_
 xenstat_vbd *xenstat_domain_vbd(xenstat_domain * domain,
 				    unsigned int vbd);
 
+/* Get the tmem information for a given domain */
+xenstat_tmem *xenstat_domain_tmem(xenstat_domain * domain);
+
 /*
  * VCPU functions - extract information from a xenstat_vcpu
  */
@@ -189,4 +193,12 @@ unsigned long long xenstat_vbd_rd_sects(
 unsigned long long xenstat_vbd_rd_sects(xenstat_vbd * vbd);
 unsigned long long xenstat_vbd_wr_sects(xenstat_vbd * vbd);
 
+/*
+ * Tmem functions - extract tmem information
+ */
+unsigned long long xenstat_tmem_curr_eph_pages(xenstat_tmem *tmem);
+unsigned long long xenstat_tmem_succ_eph_gets(xenstat_tmem *tmem);
+unsigned long long xenstat_tmem_succ_pers_puts(xenstat_tmem *tmem);
+unsigned long long xenstat_tmem_succ_pers_gets(xenstat_tmem *tmem);
+
 #endif /* XENSTAT_H */
diff -r 7f611de6b93c tools/xenstat/libxenstat/src/xenstat_priv.h
--- a/tools/xenstat/libxenstat/src/xenstat_priv.h	Tue Dec 08 14:14:27 2009 +0000
+++ b/tools/xenstat/libxenstat/src/xenstat_priv.h	Tue Dec 08 17:16:29 2009 -0700
@@ -52,6 +52,13 @@ struct xenstat_node {
 	long freeable_mb;
 };
 
+struct xenstat_tmem {
+	unsigned long long curr_eph_pages;
+	unsigned long long succ_eph_gets;
+	unsigned long long succ_pers_puts;
+	unsigned long long succ_pers_gets;
+};
+
 struct xenstat_domain {
 	unsigned int id;
 	char *name;
@@ -66,6 +73,7 @@ struct xenstat_domain {
 	xenstat_network *networks;	/* Array of length num_networks */
 	unsigned int num_vbds;
 	xenstat_vbd *vbds;
+	xenstat_tmem tmem_stats;
 };
 
 struct xenstat_vcpu {
diff -r 7f611de6b93c tools/xenstat/xentop/xentop.c
--- a/tools/xenstat/xentop/xentop.c	Tue Dec 08 14:14:27 2009 +0000
+++ b/tools/xenstat/xentop/xentop.c	Tue Dec 08 17:16:29 2009 -0700
@@ -202,6 +202,7 @@ int show_vcpus = 0;
 int show_vcpus = 0;
 int show_networks = 0;
 int show_vbds = 0;
+int show_tmem = 0;
 int repeat_header = 0;
 int show_full_name = 0;
 #define PROMPT_VAL_LEN 80
@@ -353,6 +354,9 @@ static int handle_key(int ch)
 			break;
 		case ''b'': case ''B'':
 			show_vbds ^= 1;
+			break;
+		case ''t'': case ''T'':
+			show_tmem ^= 1;
 			break;
 		case ''r'': case ''R'':
 			repeat_header ^= 1;
@@ -889,6 +893,11 @@ void do_bottom_line(void)
 		attr_addstr(show_vbds ? COLOR_PAIR(1) : 0, "ds");
 		addstr("  ");
 
+		/* tmem */
+		addch(A_REVERSE | ''T'');
+		attr_addstr(show_tmem ? COLOR_PAIR(1) : 0, "mem");
+		addstr("  ");
+
 
 		/* vcpus */
 		addch(A_REVERSE | ''V'');
@@ -1018,6 +1027,23 @@ void do_vbd(xenstat_domain *domain)
 	}
 }
 
+/* Output all tmem information */
+void do_tmem(xenstat_domain *domain)
+{
+	xenstat_tmem *tmem = xenstat_domain_tmem(domain);
+	unsigned long long curr_eph_pages = xenstat_tmem_curr_eph_pages(tmem);
+	unsigned long long succ_eph_gets = xenstat_tmem_succ_eph_gets(tmem);
+	unsigned long long succ_pers_puts = xenstat_tmem_succ_pers_puts(tmem);
+	unsigned long long succ_pers_gets = xenstat_tmem_succ_pers_gets(tmem);
+
+	if (curr_eph_pages | succ_eph_gets | succ_pers_puts | succ_pers_gets)
+		print("Tmem:  Curr eph pages: %8llu   Succ eph gets: %8llu   "
+	              "Succ pers puts: %8llu   Succ pers gets: %8llu\n",
+			curr_eph_pages, succ_eph_gets,
+			succ_pers_puts, succ_pers_gets);
+
+}
+
 static void top(void)
 {
 	xenstat_domain **domains;
@@ -1064,6 +1090,8 @@ static void top(void)
 			do_network(domains[i]);
 		if (show_vbds)
 			do_vbd(domains[i]);
+		if (show_tmem)
+			do_tmem(domains[i]);
 	}
 
 	if (!batch)
@@ -1139,6 +1167,9 @@ int main(int argc, char **argv)
 		case ''f'':
 			show_full_name = 1;
 			break;
+		case ''t'':
+			show_tmem = 1;
+			break;
 		}
 	}
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel