[PATCH] [makedumpfile] Fix problem with `half' pages
Bernhard Walle
bwalle at suse.de
Fri May 18 06:50:04 EDT 2007
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)
More information about the kexec
mailing list