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