[PATCH v2] makedumpfile: cleanup: reduce unnecessary memory copy

Atsushi Kumagai kumagai-atsushi at mxc.nes.nec.co.jp
Thu Apr 3 04:47:57 EDT 2014


>This patch intends to reduce unnecessary memory copy in compressing memory
>blocks.
>
>Changelog:
>v2:
>- Simplify write buffer out logic.
>- Add benchmark result.

Looks good to me, I'll merge this into v1.5.6.


Thanks
Atsushi Kumagai

>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.
>
>Benchmark:
>Hardware: HP BL280c G6 Blade Server with 32GB RAM
>Test method: Run 10 times test for original and patched makedumpfile, and get
>the average time of the "Copying data" stage.
>makedumpfile -l --message-level 23 -d 31 -f /vmcores/vmcore /dev/null
>
>Original: 7.089s
> Patched: 7.092s
>
>Taking into account measurement error, two test results can be regarded as the
>same. That's mean there is no measurable difference on a machine with 32GB RAM.
>
>
>Signed-off-by: Jingbai Ma <jingbai.ma at hp.com>
>---
> makedumpfile.c |   10 ++--------
> 1 files changed, 2 insertions(+), 8 deletions(-)
>
>diff --git a/makedumpfile.c b/makedumpfile.c
>index 23251a1..c9fa44c 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,7 +6283,7 @@ 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))
>+		if (!write_cache(cd_page, pd.flags ? buf_out : buf, pd.size))
> 			goto out;
> 	}
>
>@@ -6424,7 +6421,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 +6430,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 +6441,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,7 +6459,7 @@ 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))
>+		if (!write_cache(cd_page, pd.flags ? buf_out : buf, pd.size))
>                         goto out;
>         }
>



More information about the kexec mailing list