[Patch v3 2/7] functions to get crashkernel memory range
Atsushi Kumagai
kumagai-atsushi at mxc.nes.nec.co.jp
Fri Aug 1 00:32:01 PDT 2014
>These functions are used to parse /proc/iomem code and get memory
>ranges of specific type. They are implemented in kexec-tools and
>borrowed here to get the crashkernel memory range. Since crashkernel
>memory range should be excluded from dumpable memory ranges.
>
>Signed-off-by: Baoquan He <bhe at redhat.com>
>---
> makedumpfile.c | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> makedumpfile.h | 7 +++++
> 2 files changed, 89 insertions(+)
>
>diff --git a/makedumpfile.c b/makedumpfile.c
>index 760bfd1..220570e 100644
>--- a/makedumpfile.c
>+++ b/makedumpfile.c
>@@ -8980,6 +8980,88 @@ calculate_cyclic_buffer_size(void) {
> return TRUE;
> }
>
>+
>+
>+//#define CRASH_RESERVED_MEM_NR 8
>+struct memory_range crash_reserved_mem[CRASH_RESERVED_MEM_NR];
>+int crash_reserved_mem_nr;
>+
>+/*
>+ * iomem_for_each_line()
>+ *
>+ * Iterate over each line in the file returned by proc_iomem(). If match is
>+ * NULL or if the line matches with our match-pattern then call the
>+ * callback if non-NULL.
>+ *
>+ * Return the number of lines matched.
>+ */
>+int iomem_for_each_line(char *match,
>+ int (*callback)(void *data,
>+ int nr,
>+ char *str,
>+ unsigned long base,
>+ unsigned long length),
>+ void *data)
>+{
>+ const char iomem[] = "/proc/iomem";
>+ char line[BUFSIZE_FGETS];
>+ FILE *fp;
>+ unsigned long long start, end, size;
>+ char *str;
>+ int consumed;
>+ int count;
>+ int nr = 0;
>+
>+ fp = fopen(iomem, "r");
>+ if (!fp) {
>+ ERRMSG("Cannot open %s\n", iomem);
>+ exit(1);
>+ }
Could you change this to return ERROR and handle it in the
caller side? It's a coding style of makedumpfile.
Thanks
Atsushi Kumagai
>+
>+ while(fgets(line, sizeof(line), fp) != 0) {
>+ count = sscanf(line, "%Lx-%Lx : %n", &start, &end, &consumed);
>+ if (count != 2)
>+ continue;
>+ str = line + consumed;
>+ size = end - start + 1;
>+ if (!match || memcmp(str, match, strlen(match)) == 0) {
>+ if (callback
>+ && callback(data, nr, str, start, size) < 0) {
>+ break;
>+ }
>+ nr++;
>+ }
>+ }
>+
>+ fclose(fp);
>+
>+ return nr;
>+}
>+
>+static int crashkernel_mem_callback(void *data, int nr,
>+ char *str,
>+ unsigned long base,
>+ unsigned long length)
>+{
>+ if (nr >= CRASH_RESERVED_MEM_NR)
>+ return 1;
>+
>+ crash_reserved_mem[nr].start = base;
>+ crash_reserved_mem[nr].end = base + length - 1;
>+ return 0;
>+}
>+
>+int is_crashkernel_mem_reserved(void)
>+{
>+ int ret;
>+
>+ ret = iomem_for_each_line("Crash kernel\n",
>+ crashkernel_mem_callback, NULL);
>+ crash_reserved_mem_nr = ret;
>+
>+ return !!crash_reserved_mem_nr;
>+}
>+
> static struct option longopts[] = {
> {"split", no_argument, NULL, OPT_SPLIT},
> {"reassemble", no_argument, NULL, OPT_REASSEMBLE},
>diff --git a/makedumpfile.h b/makedumpfile.h
>index 9402f05..7ffa1ee 100644
>--- a/makedumpfile.h
>+++ b/makedumpfile.h
>@@ -1452,6 +1452,13 @@ extern struct array_table array_table;
> extern struct number_table number_table;
> extern struct srcfile_table srcfile_table;
>
>+struct memory_range {
>+ unsigned long long start, end;
>+};
>+
>+#define CRASH_RESERVED_MEM_NR 8
>+struct memory_range crash_reserved_mem[CRASH_RESERVED_MEM_NR];
>+int crash_reserved_mem_nr;
>
> int readmem(int type_addr, unsigned long long addr, void *bufptr, size_t size);
> int get_str_osrelease_from_vmlinux(void);
>--
>1.8.5.3
More information about the kexec
mailing list