[PATCH] makedumpfile: message on non-mmap kernels

Cliff Wickman cpw at sgi.com
Wed May 15 14:43:59 EDT 2013


From: Cliff Wickman <cpw at sgi.com>

If the crash kernel does not support mmap(2) of /proc/vmcore, make
makedumpfile fall back to using reads with a non-alarming message.

Signed-off-by: Cliff Wickman <cpw at sgi.com>
---
 makedumpfile.c |   37 ++++++++++++++++++++++---------------
 1 file changed, 22 insertions(+), 15 deletions(-)

Index: makedumpfile.mmap/makedumpfile.c
===================================================================
--- makedumpfile.mmap.orig/makedumpfile.c
+++ makedumpfile.mmap/makedumpfile.c
@@ -239,7 +239,7 @@ read_page_desc(unsigned long long paddr,
 }
 
 static int
-update_mmap_range(off_t offset) {
+update_mmap_range(off_t offset, int initial) {
 	off_t start_offset;
 	off_t map_size;
 	off_t max_offset = get_max_file_offset();
@@ -258,10 +258,11 @@ update_mmap_range(off_t offset) {
 				     info->fd_memory, start_offset);
 
 	if (info->mmap_buf == MAP_FAILED) {
-		ERRMSG("Can't map [%llx-%llx] with mmap()\n %s",
-		       (ulonglong)start_offset,
-		       (ulonglong)(start_offset + map_size),
-		       strerror(errno));
+		if (!initial)
+			ERRMSG("Can't map [%llx-%llx] with mmap()\n %s",
+				(ulonglong)start_offset,
+				(ulonglong)(start_offset + map_size),
+				strerror(errno));
 		return FALSE;
 	}
 
@@ -285,7 +286,7 @@ is_mapped_with_mmap(off_t offset) {
 int
 initialize_mmap(void) {
 	info->mmap_buf = MAP_FAILED;
-	if (!update_mmap_range(0))
+	if (!update_mmap_range(0, 1))
 		return FALSE;
 
 	return TRUE;
@@ -298,7 +299,7 @@ read_with_mmap(off_t offset, void *bufpt
 next_region:
 
 	if (!is_mapped_with_mmap(offset)) {
-		if (!update_mmap_range(offset))
+		if (!update_mmap_range(offset, 0))
 			return FALSE;
 	}
 
@@ -2984,14 +2985,20 @@ out:
 	if (info->dump_level & DL_EXCLUDE_FREE)
 		setup_page_is_buddy();
 
-	if (info->mmap_region_size > 0 && initialize_mmap()) {
-		/*
-		 * The map size is specified as Kbyte with
-		 * --map-size <size> option.
-		 */
-		info->mmap_region_size <<= 10;
-		info->flag_usemmap = TRUE;
-		DEBUG_MSG("read %s with mmap()\n", info->name_memory);
+	if (info->mmap_region_size > 0) {
+		if (!initialize_mmap()) {
+			/* this kernel does not support mmap of vmcore */
+			ERRMSG("Kernel can't mmap vmcore, using reads.\n");
+			info->flag_usemmap = FALSE;
+		} else {
+			/*
+			 * The map size is specified as Kbyte with
+			 * --map-size <size> option.
+			 */
+			info->mmap_region_size <<= 10;
+			info->flag_usemmap = TRUE;
+			DEBUG_MSG("read %s with mmap()\n", info->name_memory);
+		}
 	} else {
 		info->flag_usemmap = FALSE;
 		DEBUG_MSG("read %s with read()\n", info->name_memory);



More information about the kexec mailing list