From: Atsushi Kumagai <kumagai-atsushi@xxxxxxxxxxxxxxxxx> Date: Thu, 23 Aug 2012 17:54:16 +0900 Subject: [PATCH 09/16] [PATCH v3 9/12] Enabling --split option with cyclic mode. This patch enable cyclic mode to split the dump data to multiple dumpfiles. At this time, the buffer of partial bitmap is prepared for each child process, you need to consider the amount of memory usage. This patch split the dump data based on only max_mapnr and num_dumpfile, so the size of each split dumpfiles will be different by excluding unnecessary pages. Signed-off-by: Atsushi Kumagai <kumagai-atsushi at mxc.nes.nec.co.jp> --- makedumpfile.c | 42 +++++++++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/makedumpfile.c b/makedumpfile.c index 1f499bb..6dfd397 100644 --- a/makedumpfile.c +++ b/makedumpfile.c @@ -5445,6 +5445,13 @@ write_kdump_pages_cyclic(struct cache_data *cd_header, struct cache_data *cd_pag start_pfn = info->cyclic_start_pfn; end_pfn = info->cyclic_end_pfn; + if (info->flag_split) { + if (start_pfn < info->split_start_pfn) + start_pfn = info->split_start_pfn; + if (end_pfn > info->split_end_pfn) + end_pfn = info->split_end_pfn; + } + for (pfn = start_pfn; pfn < end_pfn; pfn++) { if ((num_dumped % per) == 0) @@ -6730,22 +6737,31 @@ setup_splitting(void) if (info->num_dumpfile <= 1) return FALSE; - initialize_2nd_bitmap(&bitmap2); + if (info->flag_cyclic) { + for (i = 0; i < info->num_dumpfile; i++) { + SPLITTING_START_PFN(i) = divideup(info->max_mapnr, info->num_dumpfile) * i; + SPLITTING_END_PFN(i) = divideup(info->max_mapnr, info->num_dumpfile) * (i + 1); + } + if (SPLITTING_END_PFN(i-1) > info->max_mapnr) + SPLITTING_END_PFN(i-1) = info->max_mapnr; + } else { + initialize_2nd_bitmap(&bitmap2); - pfn_per_dumpfile = num_dumpable / info->num_dumpfile; - start_pfn = end_pfn = 0; - for (i = 0; i < info->num_dumpfile; i++) { - start_pfn = end_pfn; - if (i == (info->num_dumpfile - 1)) { - end_pfn = info->max_mapnr; - } else { - for (j = 0; j < pfn_per_dumpfile; end_pfn++) { - if (is_dumpable(&bitmap2, end_pfn)) - j++; + pfn_per_dumpfile = num_dumpable / info->num_dumpfile; + start_pfn = end_pfn = 0; + for (i = 0; i < info->num_dumpfile; i++) { + start_pfn = end_pfn; + if (i == (info->num_dumpfile - 1)) { + end_pfn = info->max_mapnr; + } else { + for (j = 0; j < pfn_per_dumpfile; end_pfn++) { + if (is_dumpable(&bitmap2, end_pfn)) + j++; + } } + SPLITTING_START_PFN(i) = start_pfn; + SPLITTING_END_PFN(i) = end_pfn; } - SPLITTING_START_PFN(i) = start_pfn; - SPLITTING_END_PFN(i) = end_pfn; } return TRUE; -- 1.7.9.2