On 08/01/14 at 07:32am, Atsushi Kumagai wrote: > >+ */ > >+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. Yes, sure. I plan to return nr since nr is initialized to 0. Then it will cause show_mem_usage() to return FALSE and print the related failure message. fp = fopen(iomem, "r"); if (!fp) { ERRMSG("Cannot open %s\n", iomem); return 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 > > > _______________________________________________ > kexec mailing list > kexec at lists.infradead.org > http://lists.infradead.org/mailman/listinfo/kexec > > > 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; > >+} > >+