[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH v4 5/6] xenstore: make memory report available via XS_CONTROL



Add a XS_CONTROL command to xenstored for doing a talloc report to a
file. Right now this is supported by specifying a command line option
when starting xenstored and sending a signal to the daemon to trigger
the report.

To dump the report to the standard log file call:

xenstore-control memreport

To dump the report to a new file call:

xenstore-control memreport <file>

Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
Reviewed-by: Wei Liu <wei.liu2@xxxxxxxxxx>
---
 tools/xenstore/xenstored_control.c | 40 ++++++++++++++++++++++++++++++++++++++
 tools/xenstore/xenstored_core.c    |  2 +-
 tools/xenstore/xenstored_core.h    |  1 +
 3 files changed, 42 insertions(+), 1 deletion(-)

diff --git a/tools/xenstore/xenstored_control.c 
b/tools/xenstore/xenstored_control.c
index c3587ad..7c14911 100644
--- a/tools/xenstore/xenstored_control.c
+++ b/tools/xenstore/xenstored_control.c
@@ -76,6 +76,45 @@ static int do_control_logfile(void *ctx, struct connection 
*conn,
        return 0;
 }
 
+static int do_control_memreport(void *ctx, struct connection *conn,
+                               char **vec, int num)
+{
+       FILE *fp;
+       int fd;
+
+       if (num > 1)
+               return EINVAL;
+
+       if (num == 0) {
+               if (tracefd < 0) {
+                       if (!tracefile)
+                               return EBADF;
+                       fp = fopen(tracefile, "a");
+               } else {
+                       /*
+                        * Use dup() in order to avoid closing the file later
+                        * with fclose() which will release stream resources.
+                        */
+                       fd = dup(tracefd);
+                       if (fd < 0)
+                               return EBADF;
+                       fp = fdopen(fd, "a");
+                       if (!fp)
+                               close(fd);
+               }
+       } else
+               fp = fopen(vec[0], "a");
+
+       if (!fp)
+               return EBADF;
+
+       talloc_report_full(NULL, fp);
+       fclose(fp);
+
+       send_ack(conn, XS_CONTROL);
+       return 0;
+}
+
 static int do_control_print(void *ctx, struct connection *conn,
                            char **vec, int num)
 {
@@ -94,6 +133,7 @@ static struct cmd_s cmds[] = {
        { "check", do_control_check, "" },
        { "log", do_control_log, "on|off" },
        { "logfile", do_control_logfile, "<file>" },
+       { "memreport", do_control_memreport, "[<file>]" },
        { "print", do_control_print, "<string>" },
        { "help", do_control_help, "" },
 };
diff --git a/tools/xenstore/xenstored_core.c b/tools/xenstore/xenstored_core.c
index 1b79a48..b1f8fbc 100644
--- a/tools/xenstore/xenstored_core.c
+++ b/tools/xenstore/xenstored_core.c
@@ -76,7 +76,7 @@ static unsigned int nr_fds;
 
 static bool verbose = false;
 LIST_HEAD(connections);
-static int tracefd = -1;
+int tracefd = -1;
 static bool recovery = true;
 static int reopen_log_pipe[2];
 static int reopen_log_pipe0_pollfd_idx = -1;
diff --git a/tools/xenstore/xenstored_core.h b/tools/xenstore/xenstored_core.h
index d315568..92cccb6 100644
--- a/tools/xenstore/xenstored_core.h
+++ b/tools/xenstore/xenstored_core.h
@@ -172,6 +172,7 @@ void reopen_log(void);
 void close_log(void);
 
 extern char *tracefile;
+extern int tracefd;
 extern int dom0_domid;
 extern int dom0_event;
 extern int priv_domid;
-- 
2.10.2


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.