[PATCH] makedumpfile: message on non-mmap kernels

Atsushi Kumagai kumagai-atsushi at mxc.nes.nec.co.jp
Sun May 19 22:20:32 EDT 2013


On Wed, 15 May 2013 13:43:59 -0500
Cliff Wickman <cpw at sgi.com> wrote:

> 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;
>  	}

Where came from this original code ?
The current code in mmap branch doesn't look the return value of
update_mmap_range():

	if (!is_mapped_with_mmap(offset))
		update_mmap_range(offset);

Anyway, I'll merge this patch into mmap branch after I push the patch
below.


Thanks
Atsushi Kumagai

-----------------------------------------------------------------------
Author: Atsushi Kumagai <kumagai-atsushi at mxc.nes.nec.co.jp>
Date:   Thu May 17 15:02:19 2013 +0900

    [PATCH] Add error handling for read_with_mmap().

    Add error handling for read_with_mmap the same as read()'s case.

    Signed-off-by: Atsushi Kumagai <kumagai-atsushi at mxc.nes.nec.co.jp>

diff --git a/makedumpfile.c b/makedumpfile.c
index fce2e35..1f656e8 100644
--- a/makedumpfile.c
+++ b/makedumpfile.c
@@ -291,7 +291,8 @@ read_with_mmap(off_t offset, void *bufptr, unsigned long size) {
 next_region:

        if (!is_mapped_with_mmap(offset))
-               update_mmap_range(offset);
+               if (!update_mmap_range(offset))
+                       return FALSE;

        read_size = MIN(info->mmap_end_offset - offset, size);

@@ -320,9 +321,13 @@ readpage_elf(unsigned long long paddr, void *bufptr)
                return FALSE;
        }

-       if (info->flag_usemmap)
-               read_with_mmap(offset, bufptr, info->page_size);
-       else {
+       if (info->flag_usemmap) {
+               if (!read_with_mmap(offset, bufptr, info->page_size)) {
+                       ERRMSG("Can't read the dump memory(%s) with mmap().\n",
+                               info->name_memory);
+                        return FALSE;
+               }
+       } else {
                if (lseek(info->fd_memory, offset, SEEK_SET) == failed) {
                        ERRMSG("Can't seek the dump memory(%s). (offset: %llx) %s\n",
                               info->name_memory, (unsigned long long)offset, strerror(errno));

  
> @@ -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);
> 
> _______________________________________________
> kexec mailing list
> kexec at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/kexec



More information about the kexec mailing list