Message ID | 20170221150737.30589-5-jgross@suse.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Tue, Feb 21, 2017 at 04:07:36PM +0100, Juergen Gross wrote: > 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@suse.com> > --- > tools/xenstore/xenstored_control.c | 36 ++++++++++++++++++++++++++++++++++++ > tools/xenstore/xenstored_core.c | 2 +- > tools/xenstore/xenstored_core.h | 1 + > 3 files changed, 38 insertions(+), 1 deletion(-) > > diff --git a/tools/xenstore/xenstored_control.c b/tools/xenstore/xenstored_control.c > index c3587ad..b4ec6ce 100644 > --- a/tools/xenstore/xenstored_control.c > +++ b/tools/xenstore/xenstored_control.c > @@ -76,6 +76,41 @@ 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 { > + fd = dup(tracefd); Why dup() the fd? Is it because you want to avoid tracefd becomes invalid under your feet?
On 22/02/17 13:36, Wei Liu wrote: > On Tue, Feb 21, 2017 at 04:07:36PM +0100, Juergen Gross wrote: >> 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@suse.com> >> --- >> tools/xenstore/xenstored_control.c | 36 ++++++++++++++++++++++++++++++++++++ >> tools/xenstore/xenstored_core.c | 2 +- >> tools/xenstore/xenstored_core.h | 1 + >> 3 files changed, 38 insertions(+), 1 deletion(-) >> >> diff --git a/tools/xenstore/xenstored_control.c b/tools/xenstore/xenstored_control.c >> index c3587ad..b4ec6ce 100644 >> --- a/tools/xenstore/xenstored_control.c >> +++ b/tools/xenstore/xenstored_control.c >> @@ -76,6 +76,41 @@ 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 { >> + fd = dup(tracefd); > > Why dup() the fd? Is it because you want to avoid tracefd becomes > invalid under your feet? > I want to be able to fclose() to get rid of the stream resources without closing the log file. Juergen
On Wed, Feb 22, 2017 at 01:43:27PM +0100, Juergen Gross wrote: > On 22/02/17 13:36, Wei Liu wrote: > > On Tue, Feb 21, 2017 at 04:07:36PM +0100, Juergen Gross wrote: > >> 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@suse.com> > >> --- > >> tools/xenstore/xenstored_control.c | 36 ++++++++++++++++++++++++++++++++++++ > >> tools/xenstore/xenstored_core.c | 2 +- > >> tools/xenstore/xenstored_core.h | 1 + > >> 3 files changed, 38 insertions(+), 1 deletion(-) > >> > >> diff --git a/tools/xenstore/xenstored_control.c b/tools/xenstore/xenstored_control.c > >> index c3587ad..b4ec6ce 100644 > >> --- a/tools/xenstore/xenstored_control.c > >> +++ b/tools/xenstore/xenstored_control.c > >> @@ -76,6 +76,41 @@ 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 { > >> + fd = dup(tracefd); > > > > Why dup() the fd? Is it because you want to avoid tracefd becomes > > invalid under your feet? > > > > I want to be able to fclose() to get rid of the stream resources without > closing the log file. > Oh, right. I missed that aspect. Could you please add a comment for that please. > > Juergen
On 22/02/17 13:47, Wei Liu wrote: > On Wed, Feb 22, 2017 at 01:43:27PM +0100, Juergen Gross wrote: >> On 22/02/17 13:36, Wei Liu wrote: >>> On Tue, Feb 21, 2017 at 04:07:36PM +0100, Juergen Gross wrote: >>>> 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@suse.com> >>>> --- >>>> tools/xenstore/xenstored_control.c | 36 ++++++++++++++++++++++++++++++++++++ >>>> tools/xenstore/xenstored_core.c | 2 +- >>>> tools/xenstore/xenstored_core.h | 1 + >>>> 3 files changed, 38 insertions(+), 1 deletion(-) >>>> >>>> diff --git a/tools/xenstore/xenstored_control.c b/tools/xenstore/xenstored_control.c >>>> index c3587ad..b4ec6ce 100644 >>>> --- a/tools/xenstore/xenstored_control.c >>>> +++ b/tools/xenstore/xenstored_control.c >>>> @@ -76,6 +76,41 @@ 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 { >>>> + fd = dup(tracefd); >>> >>> Why dup() the fd? Is it because you want to avoid tracefd becomes >>> invalid under your feet? >>> >> >> I want to be able to fclose() to get rid of the stream resources without >> closing the log file. >> > > Oh, right. I missed that aspect. Could you please add a comment for that > please. Sure. Juergen
diff --git a/tools/xenstore/xenstored_control.c b/tools/xenstore/xenstored_control.c index c3587ad..b4ec6ce 100644 --- a/tools/xenstore/xenstored_control.c +++ b/tools/xenstore/xenstored_control.c @@ -76,6 +76,41 @@ 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 { + 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 +129,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 aff95f4..e40a725 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;
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@suse.com> --- tools/xenstore/xenstored_control.c | 36 ++++++++++++++++++++++++++++++++++++ tools/xenstore/xenstored_core.c | 2 +- tools/xenstore/xenstored_core.h | 1 + 3 files changed, 38 insertions(+), 1 deletion(-)