[PATCH 5/6] WIP: Communalize the function for creating 1st bitmap.

Atsushi Kumagai ats-kumagai at wm.jp.nec.com
Sun Mar 29 21:09:54 PDT 2015


We use the same logic when creating 1st bitmap from memory hole
without bitmap file, but there are two separated functions for
different caller, let's communalize them.

Signed-off-by: Atsushi Kumagai <ats-kumagai at wm.jp.nec.com>
---
 makedumpfile.c |   94 +++++++++++++++++++++----------------------------------
 1 files changed, 36 insertions(+), 58 deletions(-)

diff --git a/makedumpfile.c b/makedumpfile.c
index 605b6dc..691d6a5 100644
--- a/makedumpfile.c
+++ b/makedumpfile.c
@@ -4696,58 +4696,15 @@ create_1st_bitmap_file(void)
 	return TRUE;
 }
 
+int
+create_bitmap_from_memhole(struct cycle *cycle, struct dump_bitmap *bitmap, int count_memhole,
+			   int (*set_bit)(mdf_pfn_t pfn, struct cycle *cycle));
 
 int
 create_1st_bitmap_buffer(struct cycle *cycle)
 {
-	int i;
-	mdf_pfn_t pfn;
-	unsigned long long phys_start, phys_end;
-	mdf_pfn_t pfn_start, pfn_end;
-	mdf_pfn_t pfn_start_roundup, pfn_end_round;
-	unsigned long pfn_start_byte, pfn_end_byte;
-
-	/*
-	 * At first, clear all the bits on the 1st-bitmap.
-	 */
-	initialize_bitmap(info->bitmap1);
-
-	/*
-	 * If page is on memory hole, set bit on the 1st-bitmap.
-	 * (note that this is not done in cyclic mode)
-	 */
-	for (i = 0; get_pt_load(i, &phys_start, &phys_end, NULL, NULL); i++) {
-		pfn_start = MAX(paddr_to_pfn(phys_start), cycle->start_pfn);
-		pfn_end   = MIN(paddr_to_pfn(phys_end), cycle->end_pfn);
-
-		if (pfn_start >= pfn_end)
-			continue;
-
-		pfn_start_roundup = MIN(roundup(pfn_start, BITPERBYTE),
-					pfn_end);
-		pfn_end_round = MAX(round(pfn_end, BITPERBYTE), pfn_start);
-
-		for (pfn = pfn_start; pfn < pfn_start_roundup; pfn++) {
-			set_bit_on_1st_bitmap(pfn, cycle);
-		}
-
-		pfn_start_byte = (pfn_start_roundup - cycle->start_pfn) >> 3;
-		pfn_end_byte = (pfn_end_round - cycle->start_pfn) >> 3;
-
-		if (pfn_start_byte < pfn_end_byte) {
-			memset(info->bitmap1->buf + pfn_start_byte,
-			       0xff,
-			       pfn_end_byte - pfn_start_byte);
-		}
-
-		if (pfn_end_round >= pfn_start) {
-			for (pfn = pfn_end_round; pfn < pfn_end; pfn++) {
-				set_bit_on_1st_bitmap(pfn, cycle);
-			}
-		}
-	}
-
-	return TRUE;
+	return create_bitmap_from_memhole(cycle, info->bitmap1, TRUE,
+					  set_bit_on_1st_bitmap);
 }
 
 int
@@ -4853,28 +4810,41 @@ exclude_zero_pages_cyclic(struct cycle *cycle)
 	return TRUE;
 }
 
-static int
+int
 initialize_2nd_bitmap_cyclic(struct cycle *cycle)
 {
+	return create_bitmap_from_memhole(cycle, info->bitmap2, FALSE,
+					  set_bit_on_2nd_bitmap_for_kernel);
+}
+
+int
+create_bitmap_from_memhole(struct cycle *cycle, struct dump_bitmap *bitmap, int count_memhole,
+			   int (*set_bit)(mdf_pfn_t pfn, struct cycle *cycle))
+{
 	int i;
 	mdf_pfn_t pfn;
 	unsigned long long phys_start, phys_end;
 	mdf_pfn_t pfn_start, pfn_end;
 	mdf_pfn_t pfn_start_roundup, pfn_end_round;
 	unsigned long pfn_start_byte, pfn_end_byte;
+	unsigned int num_pt_loads = get_num_pt_loads();
+	struct timeval tv_start;
 
 	/*
-	 * At first, clear all the bits on the 2nd-bitmap.
+	 * At first, clear all the bits on the bitmap.
 	 */
-	initialize_bitmap(info->bitmap2);
+	initialize_bitmap(bitmap);
 
 	/*
-	 * If page is on memory hole, set bit on the 2nd-bitmap.
+	 * If page is on memory hole, set bit on the bitmap.
 	 */
+	gettimeofday(&tv_start, NULL);
 	for (i = 0; get_pt_load(i, &phys_start, &phys_end, NULL, NULL); i++) {
 		pfn_start = MAX(paddr_to_pfn(phys_start), cycle->start_pfn);
 		pfn_end = MIN(paddr_to_pfn(phys_end), cycle->end_pfn);
 
+		print_progress(PROGRESS_HOLES, i, num_pt_loads);
+
 		if (pfn_start >= pfn_end)
 			continue;
 
@@ -4883,29 +4853,37 @@ initialize_2nd_bitmap_cyclic(struct cycle *cycle)
 		pfn_end_round = MAX(round(pfn_end, BITPERBYTE), pfn_start);
 
 		for (pfn = pfn_start; pfn < pfn_start_roundup; ++pfn) {
-			if (!set_bit_on_2nd_bitmap_for_kernel(pfn, cycle))
+			if (!set_bit(pfn, cycle))
 				return FALSE;
-			pfn_memhole--;
+			if (count_memhole)
+				pfn_memhole--;
 		}
 
 		pfn_start_byte = (pfn_start_roundup - cycle->start_pfn) >> 3;
 		pfn_end_byte = (pfn_end_round - cycle->start_pfn) >> 3;
 
 		if (pfn_start_byte < pfn_end_byte) {
-			memset(info->bitmap2->buf + pfn_start_byte,
+			memset(bitmap->buf + pfn_start_byte,
 			       0xff,
 			       pfn_end_byte - pfn_start_byte);
-			pfn_memhole -= (pfn_end_byte - pfn_start_byte) << 3;
+			if (count_memhole)
+				pfn_memhole -= (pfn_end_byte - pfn_start_byte) << 3;
 		}
 
 		if (pfn_end_round >= pfn_start) {
 			for (pfn = pfn_end_round; pfn < pfn_end; ++pfn) {
-				if (!set_bit_on_2nd_bitmap_for_kernel(pfn, cycle))
+				if (!set_bit(pfn, cycle))
 					return FALSE;
-				pfn_memhole--;
+				if (count_memhole)
+					pfn_memhole--;
 			}
 		}
 	}
+        /*
+         * print 100 %
+         */
+        print_progress(PROGRESS_HOLES, info->max_mapnr, info->max_mapnr);
+        print_execution_time(PROGRESS_HOLES, &tv_start);
 
 	return TRUE;
 }
-- 
1.7.1



More information about the kexec mailing list