We have a system here with following memory map: /proc/iomem: 4ffe14000-4ffe7ffff : reserved 4ffe80000-4fffb5fff : System RAM 4fffb6000-4ffffffff : reserved max_pfn = 1310720 In that case, the last page of the "System RAM" is not full in 16K page size configuration. That leads to an error in makedumpfile when it checks if that's a zero page. It's because it tries to read the whole page and the read() fails because it's after the end of the dump file. That patch fixes this problem. Signed-off-by: Bernhard Walle <bwalle at suse.de> --- makedumpfile.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) --- a/makedumpfile.c +++ b/makedumpfile.c @@ -3155,6 +3155,7 @@ create_dump_bitmap(struct DumpInfo *info for (; pfn < mmd->pfn_end; pfn++, mem_map += SIZE(page), paddr += info->page_size) { + int page_mem_size = info->page_size; if ((pfn != 0) && (pfn%PFN_BUFBITMAP) == 0) { /* @@ -3190,6 +3191,14 @@ create_dump_bitmap(struct DumpInfo *info val = 0; /* + * check for pages that are not complete pages and + * decrease the page size here + */ + if (val == 1 && !is_in_segs(info, paddr + info->page_size)) + while (!is_in_segs(info, paddr + page_mem_size)) + page_mem_size--; + + /* * Set the 1st-bitmap. * val 1: not memory hole * 0: memory hole @@ -3223,13 +3232,13 @@ create_dump_bitmap(struct DumpInfo *info info->name_memory, strerror(errno)); goto out; } - if (read(info->fd_memory, buf, info->page_size) - != info->page_size) { + if (read(info->fd_memory, buf, page_mem_size) + != page_mem_size) { ERRMSG("Can't read the dump memory(%s). %s\n", info->name_memory, strerror(errno)); goto out; } - if (is_zero_page(buf, info->page_size)) + if (is_zero_page(buf, page_mem_size)) val = 0; } if ((info->dump_level <= DL_EXCLUDE_ZERO)