[Patch v3 2/7] functions to get crashkernel memory range
bhe at redhat.com
bhe at redhat.com
Tue Aug 12 02:25:30 PDT 2014
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;
> >+}
> >+
More information about the kexec
mailing list