[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