[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