[PATCH v1 3/5] makedumpfile: Add module of generating table

Zhou Wenjian zhouwj-fnst at cn.fujitsu.com
Mon Sep 29 00:06:25 PDT 2014


set block size and generate basic information of block table

Signed-off-by: HATAYAMA Daisuke <d.hatayama at jp.fujitsu.com>
Signed-off-by: Qiao Nuohan <qiaonuohan at cn.fujitsu.com>
Signed-off-by: Zhou Wenjian <zhouwj-fnst at cn.fujitsu.com>
---
 makedumpfile.c |   86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 86 insertions(+), 0 deletions(-)

diff --git a/makedumpfile.c b/makedumpfile.c
index a4cb9b6..c6ea635 100644
--- a/makedumpfile.c
+++ b/makedumpfile.c
@@ -5731,6 +5731,52 @@ read_value_from_block_table(char *block_inner)
 	return ret;
 }
 
+/*
+ * The block size is specified as Kbyte with --block-size <size> option.
+ * if not specified ,set default value
+ */
+int
+check_block_size(void)
+{
+	if (info->block_size){
+		info->block_size <<= 10;
+		if (info->block_size < info->page_size) {
+			ERRMSG("The block size could not be smaller than page_size. %s.\n",
+									strerror(errno));
+		return FALSE;
+		}
+	}
+	else{
+		// set default 1GB
+		info->block_size = 1 << 30;
+	}
+	return TRUE;
+}
+
+int
+prepare_block_table(void)
+{
+	check_block_size();
+	if ((block = calloc(1, sizeof(struct Block))) == NULL) {
+		ERRMSG("Can't allocate memory for the block. %s.\n", strerror(errno));
+		return FALSE;
+	}
+	block->page_per_block = info->block_size/info->page_size;
+	/*
+	 *divide memory into blocks.
+	 *if there is a remainder, called it memory not managed by block
+	 *and it will be also dealt with in function calculate_end_pfn_by_block()
+	 */
+	block->num = info->max_mapnr/block->page_per_block;
+	block->entry_size = calculate_entry_size();
+	if ((block->table = (char *)calloc(sizeof(char),(block->entry_size * block->num)))
+										== NULL) {
+		ERRMSG("Can't allocate memory for the block_table. %s.\n", strerror(errno));
+		return FALSE;
+	}
+	return TRUE;
+}
+
 mdf_pfn_t
 get_num_dumpable(void)
 {
@@ -5746,9 +5792,43 @@ get_num_dumpable(void)
 	return num_dumpable;
 }
 
+/*
+ * generate block_table
+ * modified from function get_num_dumpable_cyclic
+ */
+mdf_pfn_t
+get_num_dumpable_cyclic_withsplit(void)
+{
+	mdf_pfn_t pfn, num_dumpable = 0;
+	mdf_pfn_t dumpable_pfn_num = 0, pfn_num = 0;
+	struct cycle cycle = {0};
+	int pos = 0;
+	prepare_block_table();
+	for_each_cycle(0, info->max_mapnr, &cycle) {
+		if (!exclude_unnecessary_pages_cyclic(&cycle))
+			return FALSE;
+		for (pfn = cycle.start_pfn; pfn < cycle.end_pfn; pfn++) {
+			if (is_dumpable_cyclic(info->partial_bitmap2, pfn, &cycle)) {
+				num_dumpable++;
+				dumpable_pfn_num++;
+			}
+			if (++pfn_num >= block->page_per_block) {
+				write_value_into_block_table(block->table + pos, dumpable_pfn_num);
+				pos += block->entry_size;
+				pfn_num = 0;
+				dumpable_pfn_num = 0;
+			}
+		}
+	}
+	return num_dumpable;
+}
+
 mdf_pfn_t
 get_num_dumpable_cyclic(void)
 {
+	if(info->flag_split)
+		return get_num_dumpable_cyclic_withsplit();
+
 	mdf_pfn_t pfn, num_dumpable=0;
 	struct cycle cycle = {0};
 
@@ -9703,6 +9783,12 @@ out:
 		if (info->page_buf != NULL)
 			free(info->page_buf);
 		free(info);
+
+		if (block) {
+			if (block->table)
+				free(block->table);
+		free(block);
+		}
 	}
 	free_elf_info();
 
-- 
1.7.1




More information about the kexec mailing list