Can be used to read and/or clear dmesg buffer. Signed-off-by: Yu Zhiguo <yuzg@cn.fujitsu.com> diff -r 840f269d95fb -r ab11e3eab7cc tools/libxl/libxl.c --- a/tools/libxl/libxl.c Wed May 19 22:59:52 2010 +0100 +++ b/tools/libxl/libxl.c Thu May 20 19:52:13 2010 +0800 @@ -2827,6 +2827,18 @@ return xc_send_debug_keys(ctx->xch, keys); } +int libxl_readconsolering(struct libxl_ctx *ctx, char **pbuffer, + unsigned int *pnr_chars, int clear, + int incremental, uint32_t *pindex) +{ + int ret; + + ret = xc_readconsolering(ctx->xch, pbuffer, pnr_chars, clear, + incremental, pindex); + + return ret; +} + uint32_t libxl_vm_get_start_time(struct libxl_ctx *ctx, uint32_t domid) { char *dompath = libxl_xs_get_dompath(ctx, domid); diff -r 840f269d95fb -r ab11e3eab7cc tools/libxl/libxl.h --- a/tools/libxl/libxl.h Wed May 19 22:59:52 2010 +0100 +++ b/tools/libxl/libxl.h Thu May 20 19:52:13 2010 +0800 @@ -512,6 +512,9 @@ char *trigger_name, uint32_t vcpuid); int libxl_send_sysrq(struct libxl_ctx *ctx, uint32_t domid, char sysrq); int libxl_send_debug_keys(struct libxl_ctx *ctx, char *keys); +int libxl_readconsolering(struct libxl_ctx *ctx, char **pbuffer, + unsigned int *pnr_chars, int clear, + int incremental, uint32_t *pindex); uint32_t libxl_vm_get_start_time(struct libxl_ctx *ctx, uint32_t domid); char *libxl_tmem_list(struct libxl_ctx *ctx, uint32_t domid, int use_long); diff -r 840f269d95fb -r ab11e3eab7cc tools/libxl/xl_cmdimpl.c --- a/tools/libxl/xl_cmdimpl.c Wed May 19 22:59:52 2010 +0100 +++ b/tools/libxl/xl_cmdimpl.c Thu May 20 19:52:13 2010 +0800 @@ -3246,6 +3246,66 @@ exit(0); } +int main_dmesg(int argc, char **argv) +{ + unsigned int clear = 0, index = 0, incremental = 0; + unsigned int count = 16384 + 1, size = count; + char *str, *ptr; + int opt, ret; + + while ((opt = getopt(argc, argv, "hc")) != -1) { + switch (opt) { + case ''c'': + clear = 1; + break; + case ''h'': + help("dmesg"); + exit(0); + default: + fprintf(stderr, "option not supported\n"); + break; + } + } + + str = malloc(size); + memset(str, 0, size); + ret = libxl_readconsolering(&ctx, &str, &count, clear, + incremental, &index); + if (ret < 0) + goto out; + + while (!incremental && count == size) { + size += count - 1; + if (size < count) + break; + + ptr = realloc(str, size); + if (!ptr) + break; + + str = ptr + count; + count = size - count; + ret = libxl_readconsolering(&ctx, &str, &count, clear, + 1, &index); + if (ret < 0) { + str = ptr; + break; + } + + count += str - ptr; + str = ptr; + } + +out: + printf(str); + free(str); + + if (ret) + exit(1); + + exit(0); +} + int main_top(int argc, char **argv) { int opt; diff -r 840f269d95fb -r ab11e3eab7cc tools/libxl/xl_cmdimpl.h --- a/tools/libxl/xl_cmdimpl.h Wed May 19 22:59:52 2010 +0100 +++ b/tools/libxl/xl_cmdimpl.h Thu May 20 19:52:13 2010 +0800 @@ -45,6 +45,7 @@ int main_trigger(int argc, char **argv); int main_sysrq(int argc, char **argv); int main_debug_keys(int argc, char **argv); +int main_dmesg(int argc, char **argv); int main_top(int argc, char **argv); int main_networkattach(int argc, char **argv); int main_networklist(int argc, char **argv); diff -r 840f269d95fb -r ab11e3eab7cc tools/libxl/xl_cmdtable.c --- a/tools/libxl/xl_cmdtable.c Wed May 19 22:59:52 2010 +0100 +++ b/tools/libxl/xl_cmdtable.c Thu May 20 19:52:13 2010 +0800 @@ -191,6 +191,12 @@ "Send debug keys to Xen", "<Keys>", }, + { "dmesg", + &main_dmesg, + "Read and/or clear dmesg buffer", + "[-c]", + " -c Clear dmesg buffer as well as printing it", + }, { "top", &main_top, "Monitor a host and the domains in real time", _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
On Thu, 20 May 2010, Yu Zhiguo wrote:> Can be used to read and/or clear dmesg buffer. >Thanks for the patch! The implementation is good, but I think we could probably offer an higher level API in libxenlight than just a wrapper around xc_readconsolering. I think we should have a libxl_dmesg instead of libxl_readconsolering, and libxl_dmesg would print dmesg itself using the libxl logging functions. The caller can setup the logging function so that dmesg is printed to stdout in this case.> Signed-off-by: Yu Zhiguo <yuzg@cn.fujitsu.com> > > diff -r 840f269d95fb -r ab11e3eab7cc tools/libxl/libxl.c > --- a/tools/libxl/libxl.c Wed May 19 22:59:52 2010 +0100 > +++ b/tools/libxl/libxl.c Thu May 20 19:52:13 2010 +0800 > @@ -2827,6 +2827,18 @@ > return xc_send_debug_keys(ctx->xch, keys); > } > > +int libxl_readconsolering(struct libxl_ctx *ctx, char **pbuffer, > + unsigned int *pnr_chars, int clear, > + int incremental, uint32_t *pindex) > +{ > + int ret; > + > + ret = xc_readconsolering(ctx->xch, pbuffer, pnr_chars, clear, > + incremental, pindex); > + > + return ret; > +} > + > uint32_t libxl_vm_get_start_time(struct libxl_ctx *ctx, uint32_t domid) > { > char *dompath = libxl_xs_get_dompath(ctx, domid); > diff -r 840f269d95fb -r ab11e3eab7cc tools/libxl/libxl.h > --- a/tools/libxl/libxl.h Wed May 19 22:59:52 2010 +0100 > +++ b/tools/libxl/libxl.h Thu May 20 19:52:13 2010 +0800 > @@ -512,6 +512,9 @@ > char *trigger_name, uint32_t vcpuid); > int libxl_send_sysrq(struct libxl_ctx *ctx, uint32_t domid, char sysrq); > int libxl_send_debug_keys(struct libxl_ctx *ctx, char *keys); > +int libxl_readconsolering(struct libxl_ctx *ctx, char **pbuffer, > + unsigned int *pnr_chars, int clear, > + int incremental, uint32_t *pindex); > uint32_t libxl_vm_get_start_time(struct libxl_ctx *ctx, uint32_t domid); > > char *libxl_tmem_list(struct libxl_ctx *ctx, uint32_t domid, int use_long); > diff -r 840f269d95fb -r ab11e3eab7cc tools/libxl/xl_cmdimpl.c > --- a/tools/libxl/xl_cmdimpl.c Wed May 19 22:59:52 2010 +0100 > +++ b/tools/libxl/xl_cmdimpl.c Thu May 20 19:52:13 2010 +0800 > @@ -3246,6 +3246,66 @@ > exit(0); > } > > +int main_dmesg(int argc, char **argv) > +{ > + unsigned int clear = 0, index = 0, incremental = 0; > + unsigned int count = 16384 + 1, size = count; > + char *str, *ptr; > + int opt, ret; > + > + while ((opt = getopt(argc, argv, "hc")) != -1) { > + switch (opt) { > + case ''c'': > + clear = 1; > + break; > + case ''h'': > + help("dmesg"); > + exit(0); > + default: > + fprintf(stderr, "option not supported\n"); > + break; > + } > + } > + > + str = malloc(size); > + memset(str, 0, size); > + ret = libxl_readconsolering(&ctx, &str, &count, clear, > + incremental, &index); > + if (ret < 0) > + goto out; > + > + while (!incremental && count == size) { > + size += count - 1; > + if (size < count) > + break; > + > + ptr = realloc(str, size); > + if (!ptr) > + break; > + > + str = ptr + count; > + count = size - count; > + ret = libxl_readconsolering(&ctx, &str, &count, clear, > + 1, &index); > + if (ret < 0) { > + str = ptr; > + break; > + } > + > + count += str - ptr; > + str = ptr; > + } > + > +out: > + printf(str); > + free(str); > + > + if (ret) > + exit(1); > + > + exit(0); > +} > + > int main_top(int argc, char **argv) > { > int opt; > diff -r 840f269d95fb -r ab11e3eab7cc tools/libxl/xl_cmdimpl.h > --- a/tools/libxl/xl_cmdimpl.h Wed May 19 22:59:52 2010 +0100 > +++ b/tools/libxl/xl_cmdimpl.h Thu May 20 19:52:13 2010 +0800 > @@ -45,6 +45,7 @@ > int main_trigger(int argc, char **argv); > int main_sysrq(int argc, char **argv); > int main_debug_keys(int argc, char **argv); > +int main_dmesg(int argc, char **argv); > int main_top(int argc, char **argv); > int main_networkattach(int argc, char **argv); > int main_networklist(int argc, char **argv); > diff -r 840f269d95fb -r ab11e3eab7cc tools/libxl/xl_cmdtable.c > --- a/tools/libxl/xl_cmdtable.c Wed May 19 22:59:52 2010 +0100 > +++ b/tools/libxl/xl_cmdtable.c Thu May 20 19:52:13 2010 +0800 > @@ -191,6 +191,12 @@ > "Send debug keys to Xen", > "<Keys>", > }, > + { "dmesg", > + &main_dmesg, > + "Read and/or clear dmesg buffer", > + "[-c]", > + " -c Clear dmesg buffer as well as printing it", > + }, > { "top", > &main_top, > "Monitor a host and the domains in real time", >_______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Stefano Stabellini writes ("[Xen-devel] Re: xl: Add subcommand ''xl dmesg''"):> The implementation is good, but I think we could probably offer an > higher level API in libxenlight than just a wrapper around > xc_readconsolering.I agree that a higher-level API would be good.> I think we should have a libxl_dmesg instead of libxl_readconsolering, > and libxl_dmesg would print dmesg itself using the libxl logging > functions. > The caller can setup the logging function so that dmesg is printed to > stdout in this case.Are we sure that calling the logging function for every line in the ring is really what we want ? If nothing else this will repeat messages. Ian. _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Ian Jackson writes ("[Xen-devel] Re: xl: Add subcommand ''xl dmesg''"):> Are we sure that calling the logging function for every line in the > ring is really what we want ? If nothing else this will repeat > messages.Having thought about this some more (and had a chat with Stefano) I think the right libxl interface is an iterator, something like this: struct libxl_xen_console_reader* libxl_xen_console_read_start(struct libxl_ctx*); int libxl_xen_console_read_line(struct libxl_ctx*, struct libxl_xen_console_reader*, char **line_r); /* return values: *line_r * 1 success, whole line obtained from buffer non-0 * 0 no more lines available right now 0 * negative error code ERROR_* 0 * On success *line_r is updated to point to a nul-terminated * string which is valid until the next call on the same console * reader. The libxl caller may overwrite parts of the string * if it wishes. */ void libxl_xen_console_read_finish(struct libxl_ctx*, struct libxl_xen_console_reader*); "xl dmesg" then calls _start, loops calling line, and then calls _finish. Other libxl callers can plumb it into logging or poll for more output of whatever they like. Ian. _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Hi Ian, Ian Jackson wrote:> > Having thought about this some more (and had a chat with Stefano) I > think the right libxl interface is an iterator, something like this: >Thanks for your explanation, I''ll fix it later. Regards Yu Zhiguo _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Hi Ian, Yu Zhiguo wrote:> Ian Jackson wrote: >> Having thought about this some more (and had a chat with Stefano) I >> think the right libxl interface is an iterator, something like this: >> >Fix it to an iterator now, how about this version. ----------------------- Can be used to read and/or clear dmesg buffer. Signed-off-by: Yu Zhiguo <yuzg@cn.fujitsu.com> diff -r 93410e5e4ad8 -r 2302edf6155c tools/libxl/libxl.c --- a/tools/libxl/libxl.c Sat May 22 06:36:41 2010 +0100 +++ b/tools/libxl/libxl.c Wed May 26 00:09:54 2010 +0800 @@ -2827,6 +2827,72 @@ return xc_send_debug_keys(ctx->xch, keys); } +struct libxl_xen_console_reader * + libxl_xen_console_read_start(struct libxl_ctx *ctx, int clear) +{ + struct libxl_xen_console_reader *cr; + unsigned int size = 16384; + char *buf = malloc(size); + + if (!buf) { + XL_LOG_ERRNO(ctx, XL_LOG_ERROR, "cannot malloc buffer for libxl_xen_console_reader," + " size is %u", size); + return NULL; + } + + cr = malloc(sizeof(struct libxl_xen_console_reader)); + if (!cr) { + XL_LOG_ERRNO(ctx, XL_LOG_ERROR, "cannot malloc libxl_xen_console_reader"); + return NULL; + } + + memset(cr, 0, sizeof(struct libxl_xen_console_reader)); + cr->buffer = buf; + cr->size = size; + cr->count = size; + cr->clear = clear; + cr->incremental = 1; + + return cr; +} + +/* return values: *line_r + * 1 success, whole line obtained from buffer non-0 + * 0 no more lines available right now 0 + * negative error code ERROR_* 0 + * On success *line_r is updated to point to a nul-terminated + * string which is valid until the next call on the same console + * reader. The libxl caller may overwrite parts of the string + * if it wishes. */ +int libxl_xen_console_read_line(struct libxl_ctx *ctx, + struct libxl_xen_console_reader *cr, + char **line_r) +{ + int ret; + + memset(cr->buffer, 0, cr->size); + ret = xc_readconsolering(ctx->xch, &cr->buffer, &cr->count, + cr->clear, cr->incremental, &cr->index); + if (!ret) { + if (cr->count) { + *line_r = cr->buffer; + ret = 1; + } else { + *line_r = NULL; + ret = 0; + } + } + + return ret; +} + +void libxl_xen_console_read_finish(struct libxl_ctx *ctx, + struct libxl_xen_console_reader *cr) +{ + free(cr->buffer); + free(cr); +} + uint32_t libxl_vm_get_start_time(struct libxl_ctx *ctx, uint32_t domid) { char *dompath = libxl_xs_get_dompath(ctx, domid); diff -r 93410e5e4ad8 -r 2302edf6155c tools/libxl/libxl.h --- a/tools/libxl/libxl.h Sat May 22 06:36:41 2010 +0100 +++ b/tools/libxl/libxl.h Wed May 26 00:09:54 2010 +0800 @@ -512,6 +512,24 @@ char *trigger_name, uint32_t vcpuid); int libxl_send_sysrq(struct libxl_ctx *ctx, uint32_t domid, char sysrq); int libxl_send_debug_keys(struct libxl_ctx *ctx, char *keys); + +struct libxl_xen_console_reader { + char *buffer; + unsigned int size; + unsigned int count; + unsigned int clear; + unsigned int incremental; + unsigned int index; +}; + +struct libxl_xen_console_reader * + libxl_xen_console_read_start(struct libxl_ctx *ctx, int clear); +int libxl_xen_console_read_line(struct libxl_ctx *ctx, + struct libxl_xen_console_reader *cr, + char **line_r); +void libxl_xen_console_read_finish(struct libxl_ctx *ctx, + struct libxl_xen_console_reader *cr); + uint32_t libxl_vm_get_start_time(struct libxl_ctx *ctx, uint32_t domid); char *libxl_tmem_list(struct libxl_ctx *ctx, uint32_t domid, int use_long); diff -r 93410e5e4ad8 -r 2302edf6155c tools/libxl/xl_cmdimpl.c --- a/tools/libxl/xl_cmdimpl.c Sat May 22 06:36:41 2010 +0100 +++ b/tools/libxl/xl_cmdimpl.c Wed May 26 00:09:54 2010 +0800 @@ -3246,6 +3246,44 @@ exit(0); } +int main_dmesg(int argc, char **argv) +{ + unsigned int clear = 0; + struct libxl_xen_console_reader *cr; + char *line; + int opt, ret = 1; + + while ((opt = getopt(argc, argv, "hc")) != -1) { + switch (opt) { + case ''c'': + clear = 1; + break; + case ''h'': + help("dmesg"); + exit(0); + default: + fprintf(stderr, "option not supported\n"); + break; + } + } + + cr = libxl_xen_console_read_start(&ctx, clear); + if (!cr) + goto finish; + + while (1) { + ret = libxl_xen_console_read_line(&ctx, cr, &line); + if (ret > 0) + printf(line); + else + break; + } + +finish: + libxl_xen_console_read_finish(&ctx, cr); + exit(ret); +} + int main_top(int argc, char **argv) { int opt; diff -r 93410e5e4ad8 -r 2302edf6155c tools/libxl/xl_cmdimpl.h --- a/tools/libxl/xl_cmdimpl.h Sat May 22 06:36:41 2010 +0100 +++ b/tools/libxl/xl_cmdimpl.h Wed May 26 00:09:54 2010 +0800 @@ -45,6 +45,7 @@ int main_trigger(int argc, char **argv); int main_sysrq(int argc, char **argv); int main_debug_keys(int argc, char **argv); +int main_dmesg(int argc, char **argv); int main_top(int argc, char **argv); int main_networkattach(int argc, char **argv); int main_networklist(int argc, char **argv); diff -r 93410e5e4ad8 -r 2302edf6155c tools/libxl/xl_cmdtable.c --- a/tools/libxl/xl_cmdtable.c Sat May 22 06:36:41 2010 +0100 +++ b/tools/libxl/xl_cmdtable.c Wed May 26 00:09:54 2010 +0800 @@ -191,6 +191,12 @@ "Send debug keys to Xen", "<Keys>", }, + { "dmesg", + &main_dmesg, + "Read and/or clear dmesg buffer", + "[-c]", + " -c Clear dmesg buffer as well as printing it", + }, { "top", &main_top, "Monitor a host and the domains in real time", _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel