[PATCH 10/13] Adjust --split/--reassemble path to the new code.

Atsushi Kumagai ats-kumagai at wm.jp.nec.com
Sun May 10 23:32:55 PDT 2015


Do small some fixes to adjust --split/--reassemble path to
the new code.

Signed-off-by: Atsushi Kumagai <ats-kumagai at wm.jp.nec.com>
---
 makedumpfile.c | 177 +++++++++++++++++++++++----------------------------------
 1 file changed, 71 insertions(+), 106 deletions(-)

diff --git a/makedumpfile.c b/makedumpfile.c
index c2c07fc..e58940b 100644
--- a/makedumpfile.c
+++ b/makedumpfile.c
@@ -1033,7 +1033,7 @@ open_dump_bitmap(void)
 	char *tmpname;
 
 	/* Unnecessary to open */
-	if (!info->working_dir && !info->flag_mem_usage)
+	if (!info->working_dir && !info->flag_reassemble && !info->flag_mem_usage)
 		return TRUE;
 
 	tmpname = getenv("TMPDIR");
@@ -3256,7 +3256,7 @@ out:
 	if (!get_max_mapnr())
 		return FALSE;
 
-	if (info->working_dir || info->flag_mem_usage) {
+	if (info->working_dir || info->flag_reassemble || info->flag_mem_usage) {
 		/* Implemented as non-cyclic mode based on the file */
 		info->flag_cyclic = FALSE;
 		info->pfn_cyclic = info->max_mapnr;
@@ -5334,51 +5334,6 @@ free_bitmap_buffer(void)
 }
 
 int
-create_dump_bitmap(void)
-{
-	int ret = FALSE;
-
-	if (info->flag_cyclic) {
-		if (!prepare_bitmap2_buffer())
-			goto out;
-		if (info->flag_split) {
-			if (!prepare_splitblock_table())
-				goto out;
-
-			info->num_dumpable = get_num_dumpable_cyclic_withsplit();
-		} else {
-			info->num_dumpable = get_num_dumpable_cyclic();
-		}
-
-		if (!info->flag_elf_dumpfile)
-			free_bitmap2_buffer();
-
-	} else {
-		struct cycle cycle = {0};
-		first_cycle(0, info->max_mapnr, &cycle);
-		if (!prepare_bitmap_buffer())
-			goto out;
-
-		pfn_memhole = info->max_mapnr;
-		if (!create_1st_bitmap(&cycle))
-			goto out;
-
-		if (!create_2nd_bitmap(&cycle))
-			goto out;
-
-		info->num_dumpable = get_num_dumpable_cyclic();
-	}
-
-	ret = TRUE;
-out:
-	/* Should keep the buffer in the 1-cycle case. */
-	if (info->flag_cyclic)
-		free_bitmap_buffer();
-
-	return ret;
-}
-
-int
 prepare_cache_data(struct cache_data *cd)
 {
 	cd->fd         = info->fd_dumpfile;
@@ -5897,12 +5852,11 @@ mdf_pfn_t
 get_num_dumpable(void)
 {
 	mdf_pfn_t pfn, num_dumpable;
-	struct dump_bitmap bitmap2;
 
-	initialize_2nd_bitmap(&bitmap2);
+	initialize_2nd_bitmap(info->bitmap2);
 
 	for (pfn = 0, num_dumpable = 0; pfn < info->max_mapnr; pfn++) {
-		if (is_dumpable(&bitmap2, pfn, NULL))
+		if (is_dumpable(info->bitmap2, pfn, NULL))
 			num_dumpable++;
 	}
 	return num_dumpable;
@@ -5920,11 +5874,11 @@ get_num_dumpable_cyclic_withsplit(void)
 	struct cycle cycle = {0};
 	int pos = 0;
 
-	pfn_memhole = info->max_mapnr;
-
 	for_each_cycle(0, info->max_mapnr, &cycle) {
-		if (!create_2nd_bitmap(&cycle))
-			return FALSE;
+		if (info->flag_cyclic) {
+			if (!create_2nd_bitmap(&cycle))
+				return FALSE;
+		}
 
 		for (pfn = cycle.start_pfn; pfn < cycle.end_pfn; pfn++) {
 			if (is_dumpable(info->bitmap2, pfn, &cycle)) {
@@ -5945,7 +5899,7 @@ get_num_dumpable_cyclic_withsplit(void)
 }
 
 mdf_pfn_t
-get_num_dumpable_cyclic(void)
+get_num_dumpable_cyclic_single(void)
 {
 	mdf_pfn_t pfn, num_dumpable=0;
 	struct cycle cycle = {0};
@@ -5965,6 +5919,59 @@ get_num_dumpable_cyclic(void)
 	return num_dumpable;
 }
 
+mdf_pfn_t
+get_num_dumpable_cyclic(void)
+{
+	if (info->flag_split)
+		return get_num_dumpable_cyclic_withsplit();
+	else
+		return get_num_dumpable_cyclic_single();
+}
+
+int
+create_dump_bitmap(void)
+{
+	int ret = FALSE;
+
+	if (info->flag_split) {
+		if (!prepare_splitblock_table())
+			goto out;
+	}
+
+	if (info->flag_cyclic) {
+		if (!prepare_bitmap2_buffer())
+			goto out;
+
+		info->num_dumpable = get_num_dumpable_cyclic();
+
+		if (!info->flag_elf_dumpfile)
+			free_bitmap2_buffer();
+
+	} else {
+		struct cycle cycle = {0};
+		first_cycle(0, info->max_mapnr, &cycle);
+		if (!prepare_bitmap_buffer())
+			goto out;
+
+		pfn_memhole = info->max_mapnr;
+		if (!create_1st_bitmap(&cycle))
+			goto out;
+
+		if (!create_2nd_bitmap(&cycle))
+			goto out;
+
+		info->num_dumpable = get_num_dumpable_cyclic();
+	}
+
+	ret = TRUE;
+out:
+	/* Should keep the buffer in the 1-cycle case. */
+	if (info->flag_cyclic)
+		free_bitmap_buffer();
+
+	return ret;
+}
+
 int
 write_elf_load_segment(struct cache_data *cd_page, unsigned long long paddr,
 		       off_t off_memory, long long size)
@@ -6938,7 +6945,7 @@ close_dump_file(void)
 void
 close_dump_bitmap(void)
 {
-	if (!info->working_dir && !info->flag_mem_usage)
+	if (!info->working_dir && !info->flag_reassemble && !info->flag_mem_usage)
 		return;
 
 	if ((info->fd_bitmap = close(info->fd_bitmap)) < 0)
@@ -7946,13 +7953,16 @@ calculate_end_pfn_by_splitblock(mdf_pfn_t start_pfn,
 /*
  * calculate start_pfn and end_pfn in each output file.
  */
-static int setup_splitting_cyclic(void)
+static int setup_splitting(void)
 {
 	int i;
 	mdf_pfn_t start_pfn, end_pfn;
 	int cur_splitblock_num = 0;
 	start_pfn = end_pfn = 0;
 
+	if (info->num_dumpfile <= 1)
+		return FALSE;
+
 	for (i = 0; i < info->num_dumpfile - 1; i++) {
 		start_pfn = end_pfn;
 		end_pfn = calculate_end_pfn_by_splitblock(start_pfn,
@@ -7966,52 +7976,6 @@ static int setup_splitting_cyclic(void)
 	return TRUE;
 }
 
-int
-setup_splitting(void)
-{
-	int i;
-	mdf_pfn_t j, pfn_per_dumpfile;
-	mdf_pfn_t start_pfn, end_pfn;
-	mdf_pfn_t num_dumpable = get_num_dumpable();
-	struct dump_bitmap bitmap2;
-
-	if (info->num_dumpfile <= 1)
-		return FALSE;
-
-	if (info->flag_cyclic) {
-		int ret = FALSE;
-
-		if (!prepare_bitmap2_buffer()) {
-			free_bitmap_buffer();
-			return ret;
-		}
-		ret = setup_splitting_cyclic();
-		free_bitmap2_buffer();
-
-		return ret;
-        } 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, NULL))
-						j++;
-				}
-			}
-			SPLITTING_START_PFN(i) = start_pfn;
-			SPLITTING_END_PFN(i)   = end_pfn;
-		}
-	}
-
-	return TRUE;
-}
-
 /*
  * This function is for creating split dumpfiles by multiple
  * processes. Each child process should re-open a /proc/vmcore
@@ -8582,7 +8546,6 @@ reassemble_kdump_pages(void)
 	mdf_pfn_t pfn, start_pfn, end_pfn;
 	mdf_pfn_t num_dumpable;
 	unsigned long size_eraseinfo;
-	struct dump_bitmap bitmap2;
 	struct disk_dump_header dh;
 	struct page_desc pd, pd_zero;
 	struct cache_data cd_pd, cd_data;
@@ -8590,7 +8553,8 @@ reassemble_kdump_pages(void)
 	char *data = NULL;
 	unsigned long data_buf_size = info->page_size;
 
-	initialize_2nd_bitmap(&bitmap2);
+	if (!prepare_bitmap2_buffer())
+		return FALSE;
 
 	if (!read_disk_dump_header(&dh, SPLITTING_DUMPFILE(0)))
 		return FALSE;
@@ -8651,7 +8615,7 @@ reassemble_kdump_pages(void)
 
 		offset_ph_org = offset_first_ph;
 		for (pfn = start_pfn; pfn < end_pfn; pfn++) {
-			if (!is_dumpable(&bitmap2, pfn, NULL))
+			if (!is_dumpable(info->bitmap2, pfn, NULL))
 				continue;
 
 			num_dumped++;
@@ -8760,6 +8724,7 @@ reassemble_kdump_pages(void)
 out:
 	free_cache_data(&cd_pd);
 	free_cache_data(&cd_data);
+	free_bitmap2_buffer();
 
 	if (data)
 		free(data);
-- 
1.9.0



More information about the kexec mailing list