[PATCH] makedumpfile: reduce unnecessary memory copy

HATAYAMA Daisuke d.hatayama at jp.fujitsu.com
Mon Mar 17 05:32:14 EDT 2014


From: Jingbai Ma <jingbai.ma at hp.com>
Subject: [PATCH] makedumpfile: reduce unnecessary memory copy
Date: Mon, 17 Mar 2014 16:43:18 +0800

> This patch intends to reduce unnecessary memory copy in compressing memory
> blocks.
> 
> old logic like this:
>     compress(buf_out, &size_out, buf, size);
>     ...
>     memcpy(buf, buf_out, pd.size);
>     ...
>     write_cache(cd_page, buf, pd.size)
> 
> new logic:
>     compress(buf_out, &size_out, buf, size);
>     ...
>     if (compressed?)
>         write_cache(cd_page, buf_out, pd.size)
>     else
>         write_cache(cd_page, buf, pd.size)
> 
> This occurs for each single page, so by the new logic it can reduce a lot of
> unnecessary memcpy() on machines with huge memory.
> This patch wasn't expected to improve the kdump performance dramatically due to
> the memory copy operations on modern processors are pretty fast.
> 

Now /proc/vmcore has zero copy mechanism with mmap(), but now
makedumpfile still uses buffers some places in makedumpfile to keep
changes as less as possible for ease of maintainance. I think ease of
maintainance is important, so I don't think we should soon totally
remove copy in makedumpfile. We should first benchmark where can be
improved very much by just removing copy and then should decide where
to optimize.

OTOH, this patch also seems to be a kind of clean-up patch. Even if
amount of improvement is a little, I don't object this patch; of
course, then patch description should say it's rather cleanup patch
than optimization.

> 
> Signed-off-by: Jingbai Ma <jingbai.ma at hp.com>
> ---
>  makedumpfile.c |   24 ++++++++++++++----------
>  1 files changed, 14 insertions(+), 10 deletions(-)
> 
> diff --git a/makedumpfile.c b/makedumpfile.c
> index 23251a1..80f76cf 100644
> --- a/makedumpfile.c
> +++ b/makedumpfile.c
> @@ -6245,7 +6245,6 @@ write_kdump_pages(struct cache_data *cd_header, struct cache_data *cd_page)
>  		    && (size_out < info->page_size)) {
>  			pd.flags = DUMP_DH_COMPRESSED_ZLIB;
>  			pd.size  = size_out;
> -			memcpy(buf, buf_out, pd.size);
>  #ifdef USELZO
>  		} else if (info->flag_lzo_support
>  			   && (info->flag_compress & DUMP_DH_COMPRESSED_LZO)
> @@ -6255,7 +6254,6 @@ write_kdump_pages(struct cache_data *cd_header, struct cache_data *cd_page)
>  			   && (size_out < info->page_size)) {
>  			pd.flags = DUMP_DH_COMPRESSED_LZO;
>  			pd.size  = size_out;
> -			memcpy(buf, buf_out, pd.size);
>  #endif
>  #ifdef USESNAPPY
>  		} else if ((info->flag_compress & DUMP_DH_COMPRESSED_SNAPPY)
> @@ -6267,7 +6265,6 @@ write_kdump_pages(struct cache_data *cd_header, struct cache_data *cd_page)
>  			   && (size_out < info->page_size)) {
>  			pd.flags = DUMP_DH_COMPRESSED_SNAPPY;
>  			pd.size  = size_out;
> -			memcpy(buf, buf_out, pd.size);
>  #endif
>  		} else {
>  			pd.flags = 0;
> @@ -6286,8 +6283,13 @@ write_kdump_pages(struct cache_data *cd_header, struct cache_data *cd_page)
>  		/*
>  		 * Write the page data.
>  		 */
> -		if (!write_cache(cd_page, buf, pd.size))
> -			goto out;
> +		if (pd.flags == 0) {
> +			if (!write_cache(cd_page, buf, pd.size))
> +				goto out;
> +		} else {
> +			if (!write_cache(cd_page, buf_out, pd.size))
> +				goto out;
> +		}
>  	}

if (!write_cache(cd_page, pd.flags ? buf_out : buf, pd.size))
    goto out;

>  
>  	/*
> @@ -6424,7 +6426,6 @@ write_kdump_pages_cyclic(struct cache_data *cd_header, struct cache_data *cd_pag
>  		    && (size_out < info->page_size)) {
>  			pd.flags = DUMP_DH_COMPRESSED_ZLIB;
>  			pd.size  = size_out;
> -			memcpy(buf, buf_out, pd.size);
>  #ifdef USELZO
>  		} else if (info->flag_lzo_support
>  			   && (info->flag_compress & DUMP_DH_COMPRESSED_LZO)
> @@ -6434,7 +6435,6 @@ write_kdump_pages_cyclic(struct cache_data *cd_header, struct cache_data *cd_pag
>  			   && (size_out < info->page_size)) {
>  			pd.flags = DUMP_DH_COMPRESSED_LZO;
>  			pd.size  = size_out;
> -			memcpy(buf, buf_out, pd.size);
>  #endif
>  #ifdef USESNAPPY
>  		} else if ((info->flag_compress & DUMP_DH_COMPRESSED_SNAPPY)
> @@ -6446,7 +6446,6 @@ write_kdump_pages_cyclic(struct cache_data *cd_header, struct cache_data *cd_pag
>  			   && (size_out < info->page_size)) {
>  			pd.flags = DUMP_DH_COMPRESSED_SNAPPY;
>  			pd.size  = size_out;
> -			memcpy(buf, buf_out, pd.size);
>  #endif
>  		} else {
>  			pd.flags = 0;
> @@ -6465,8 +6464,13 @@ write_kdump_pages_cyclic(struct cache_data *cd_header, struct cache_data *cd_pag
>                  /*
>                   * Write the page data.
>                   */
> -                if (!write_cache(cd_page, buf, pd.size))
> -                        goto out;
> +		if (pd.flags == 0) {
> +			if (!write_cache(cd_page, buf, pd.size))
> +				goto out;
> +		} else {
> +			if (!write_cache(cd_page, buf_out, pd.size))
> +				goto out;
> +		}
>          }

Similaly.

>  
>  	ret = TRUE;
> 

Thanks.
HATAYAMA, Daisuke




More information about the kexec mailing list