[PATCH] --dump-dmesg fix for post 3.5 kernels
Atsushi Kumagai
kumagai-atsushi at mxc.nes.nec.co.jp
Mon Feb 4 03:27:05 EST 2013
Hello Louis,
On Thu, 31 Jan 2013 12:48:08 +0100
Louis Bouchard <louis.bouchard at canonical.com> wrote:
> This patch enable the --dump-dmesg functionality that
> was broken with post 3.5 kernel which use the variable-length
> record format for the kernel log buffer.
I appreciate your hard work.
Your patch seems to work correctly, but I have some comments.
(You don't need to resend the patch.)
>
> Signed-off-by: Louis Bouchard <louis.bouchard at canonical.com>
> ---
> makedumpfile.c | 242 +++++++++++++++++++++++++++++++++++++++++++++-----------
> makedumpfile.h | 16 ++++
> 2 files changed, 213 insertions(+), 45 deletions(-)
>
> diff --git a/makedumpfile.c b/makedumpfile.c
> index 715ca6e..a5180f6 100644
> --- a/makedumpfile.c
> +++ b/makedumpfile.c
> @@ -20,6 +20,7 @@
> #include "erase_info.h"
> #include "sadump_info.h"
> #include <stddef.h>
> +#include <ctype.h>
> #include <sys/time.h>
>
> struct symbol_table symbol_table;
> @@ -848,6 +849,8 @@ get_symbol_info(void)
> SYMBOL_INIT(log_buf, "log_buf");
> SYMBOL_INIT(log_buf_len, "log_buf_len");
> SYMBOL_INIT(log_end, "log_end");
> + SYMBOL_INIT(log_first_idx, "log_first_idx");
> + SYMBOL_INIT(log_next_idx, "log_next_idx");
> SYMBOL_INIT(max_pfn, "max_pfn");
> SYMBOL_INIT(modules, "modules");
> SYMBOL_INIT(high_memory, "high_memory");
> @@ -1176,6 +1179,13 @@ get_structure_info(void)
> OFFSET_INIT(elf64_phdr.p_paddr, "elf64_phdr", "p_paddr");
> OFFSET_INIT(elf64_phdr.p_memsz, "elf64_phdr", "p_memsz");
>
> + SIZE_INIT(log, "log");
> + OFFSET_INIT(log.ts_nsec, "log", "ts_nsec");
> + OFFSET_INIT(log.len, "log", "len");
> + OFFSET_INIT(log.text_len, "log", "text_len");
> + OFFSET_INIT(log.dict_len, "log", "dict_len");
> + OFFSET_INIT(log.dict_len, "log", "level");
> +
Why you overwrite log.dict_len with log.level ?
And is log.dict_len necessary for this feature ?
> return TRUE;
> }
>
> @@ -1354,6 +1364,8 @@ write_vmcoreinfo_data(void)
> WRITE_SYMBOL("log_buf", log_buf);
> WRITE_SYMBOL("log_buf_len", log_buf_len);
> WRITE_SYMBOL("log_end", log_end);
> + WRITE_SYMBOL("log_first_idx", log_first_idx);
> + WRITE_SYMBOL("log_next_idx", log_next_idx);
> WRITE_SYMBOL("max_pfn", max_pfn);
> WRITE_SYMBOL("high_memory", high_memory);
> WRITE_SYMBOL("node_remap_start_vaddr", node_remap_start_vaddr);
> @@ -1404,6 +1416,10 @@ write_vmcoreinfo_data(void)
> WRITE_MEMBER_OFFSET("node_memblk_s.size", node_memblk_s.size);
> WRITE_MEMBER_OFFSET("node_memblk_s.nid", node_memblk_s.nid);
> WRITE_MEMBER_OFFSET("vm_struct.addr", vm_struct.addr);
> + WRITE_MEMBER_OFFSET("log.ts_nsec",log.ts_nsec);
> + WRITE_MEMBER_OFFSET("log.len",log.len);
> + WRITE_MEMBER_OFFSET("log.text_len",log.text_len);
> + WRITE_MEMBER_OFFSET("log.dict_len",log.dict_len);
>
> if (SYMBOL(node_data) != NOT_FOUND_SYMBOL)
> WRITE_ARRAY_LENGTH("node_data", node_data);
> @@ -1664,6 +1680,8 @@ read_vmcoreinfo(void)
> READ_SYMBOL("log_buf", log_buf);
> READ_SYMBOL("log_buf_len", log_buf_len);
> READ_SYMBOL("log_end", log_end);
> + READ_SYMBOL("log_first_idx",log_first_idx);
> + READ_SYMBOL("log_next_idx",log_next_idx);
> READ_SYMBOL("max_pfn", max_pfn);
> READ_SYMBOL("high_memory", high_memory);
> READ_SYMBOL("node_remap_start_vaddr", node_remap_start_vaddr);
> @@ -1679,6 +1697,7 @@ read_vmcoreinfo(void)
> READ_STRUCTURE_SIZE("node_memblk_s", node_memblk_s);
> READ_STRUCTURE_SIZE("nodemask_t", nodemask_t);
> READ_STRUCTURE_SIZE("pageflags", pageflags);
> + READ_STRUCTURE_SIZE("log", log);
You forgot to add "WRITE_STRUCTURE_SIZE("log", log)", I'll add it.
Lastly, your patch causes the following warning:
makedumpfile.c: In function 'dump_dmesg':
makedumpfile.c:3562: warning: 'log_end' may be used uninitialized in this function
So, I'll fix this patch with the change below:
diff --git a/makedumpfile.c b/makedumpfile.c
index 2a2fcbd..ebedd07 100644
--- a/makedumpfile.c
+++ b/makedumpfile.c
@@ -1384,6 +1384,7 @@ write_vmcoreinfo_data(void)
WRITE_STRUCTURE_SIZE("node_memblk_s", node_memblk_s);
WRITE_STRUCTURE_SIZE("nodemask_t", nodemask_t);
WRITE_STRUCTURE_SIZE("pageflags", pageflags);
+ WRITE_STRUCTURE_SIZE("log", log);
/*
* write the member offset of 1st kernel
@@ -3626,7 +3627,9 @@ dump_dmesg()
}
log_end = log_end_2_6_24;
}
- }
+ } else
+ log_end = 0;
+
if (!readmem(VADDR, SYMBOL(log_buf_len), &log_buf_len,
sizeof(log_buf_len))) {
ERRMSG("Can't get log_buf_len.\n");
Thanks
Atsushi Kumagai
More information about the kexec
mailing list