Return-Path: yishimat@redhat.com Received: from zmta04.collab.prod.int.phx2.redhat.com (LHLO zmta04.collab.prod.int.phx2.redhat.com) (10.5.81.11) by zmail24.collab.prod.int.phx2.redhat.com with LMTP; Thu, 2 Jul 2015 01:09:57 -0400 (EDT) Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by zmta04.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 29864DA114; Thu, 2 Jul 2015 01:09:57 -0400 (EDT) Received: from [10.3.112.13] ([10.3.112.13]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t6259s7J004916; Thu, 2 Jul 2015 01:09:55 -0400 Subject: [RHEL7.2 PATCH resend v3 4/5] Add module of calculating start_pfn and end_pfn in each dumpfile. To: kexec-kdump-list@redhat.com References: <55929D94.4020500@redhat.com> <5594C62C.3030407@redhat.com> Cc: Minfei Huang , bhe@redhat.com, yishimat@redhat.com From: Yasuaki Ishimatsu Message-ID: <5594C7A1.6020609@redhat.com> Date: Thu, 2 Jul 2015 01:09:53 -0400 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Thunderbird/38.0.1 MIME-Version: 1.0 In-Reply-To: <5594C62C.3030407@redhat.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 Content-Length: 3398 Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1182379 The patch is back ported directory from the following upstream commit: commit 2b74c02081fa0777c8cfb336adb63d9ccb2b46dd Author: Zhou Wenjian Date: Fri Nov 7 09:44:56 2014 +0900 [PATCH v5 4/5] Add module of calculating start_pfn and end_pfn in each When --split is specified in cyclic mode, start_pfn and end_pfn of each will be calculated to make each dumpfile have the same size. Signed-off-by: Qiao Nuohan Signed-off-by: Zhou Wenjian Resolves: rhbz#1182379 Signed-off-by: Yasuaki Ishimatsu --- makedumpfile-1.5.7/makedumpfile.c | 73 ++++++++++++++++++++++++++++++++++--- 1 files changed, 68 insertions(+), 5 deletions(-) diff --git a/makedumpfile-1.5.7/makedumpfile.c b/makedumpfile-1.5.7/makedumpfile.c index 5ffe8e1..c4309af 100644 --- a/makedumpfile-1.5.7/makedumpfile.c +++ b/makedumpfile-1.5.7/makedumpfile.c @@ -8218,6 +8218,65 @@ out: return ret; } +/* + * calculate end_pfn of one dumpfile. + * try to make every output file have the same size. + * splitblock_table is used to reduce calculate time. + */ + +#define CURRENT_SPLITBLOCK_PFN_NUM (*cur_splitblock_num * splitblock->page_per_splitblock) +mdf_pfn_t +calculate_end_pfn_by_splitblock(mdf_pfn_t start_pfn, + int *cur_splitblock_num) +{ + if (start_pfn >= info->max_mapnr) + return info->max_mapnr; + + mdf_pfn_t end_pfn; + long long pfn_needed, offset; + char *splitblock_value_offset; + + pfn_needed = info->num_dumpable / info->num_dumpfile; + offset = *cur_splitblock_num * splitblock->entry_size; + splitblock_value_offset = splitblock->table + offset; + end_pfn = start_pfn; + + while (*cur_splitblock_num < splitblock->num && pfn_needed > 0) { + pfn_needed -= read_from_splitblock_table(splitblock_value_offset); + splitblock_value_offset += splitblock->entry_size; + ++*cur_splitblock_num; + } + + end_pfn = CURRENT_SPLITBLOCK_PFN_NUM; + if (end_pfn > info->max_mapnr) + end_pfn = info->max_mapnr; + + return end_pfn; +} + +/* + * calculate start_pfn and end_pfn in each output file. + */ +static int setup_splitting_cyclic(void) +{ + int i; + mdf_pfn_t start_pfn, end_pfn; + int cur_splitblock_num = 0; + start_pfn = end_pfn = 0; + + for (i = 0; i < info->num_dumpfile - 1; i++) { + start_pfn = end_pfn; + end_pfn = calculate_end_pfn_by_splitblock(start_pfn, + &cur_splitblock_num); + SPLITTING_START_PFN(i) = start_pfn; + SPLITTING_END_PFN(i) = end_pfn; + } + SPLITTING_START_PFN(info->num_dumpfile - 1) = end_pfn; + SPLITTING_END_PFN(info->num_dumpfile - 1) = info->max_mapnr; + + return TRUE; +} + int setup_splitting(void) { @@ -8231,12 +8290,16 @@ setup_splitting(void) return FALSE; 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); + int ret = FALSE; + + if (!prepare_bitmap2_buffer_cyclic()) { + free_bitmap_buffer(); + return ret; } - if (SPLITTING_END_PFN(i-1) > info->max_mapnr) - SPLITTING_END_PFN(i-1) = info->max_mapnr; + ret = setup_splitting_cyclic(); + free_bitmap2_buffer_cyclic(); + + return ret; } else { initialize_2nd_bitmap(&bitmap2); -- 1.7.1