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

Jingbai Ma jingbai.ma at hp.com
Tue Apr 1 06:28:26 EDT 2014


This patch intends to reduce unnecessary memory copy in compressing memory
blocks.

Changelog:
v2:
- Simplify write buffer out logic.
- Add benchmark result.

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