[PATCH V3 3/5] Add module of generating table

Atsushi Kumagai kumagai-atsushi at mxc.nes.nec.co.jp
Tue Nov 4 20:18:01 PST 2014


>set block size and generate basic information of block table
>
>Signed-off-by: Qiao Nuohan <qiaonuohan at cn.fujitsu.com>
>Signed-off-by: Zhou Wenjian <zhouwj-fnst at cn.fujitsu.com>
>---
> makedumpfile.c |  109 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
> makedumpfile.h |    4 ++
> 2 files changed, 112 insertions(+), 1 deletions(-)
>
>diff --git a/makedumpfile.c b/makedumpfile.c
>index f86dfd2..9ead207 100644
>--- a/makedumpfile.c
>+++ b/makedumpfile.c
>@@ -5208,7 +5208,14 @@ create_dump_bitmap(void)
> 	if (info->flag_cyclic) {
> 		if (!prepare_bitmap2_buffer_cyclic())
> 			goto out;
>-		info->num_dumpable = get_num_dumpable_cyclic();
>+		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_cyclic();
>@@ -5745,6 +5752,61 @@ read_from_splitblock_table(char *entry)
> 	return value;
> }
>
>+/*
>+ * The splitblock size is specified as Kbyte with --splitblock-size <size> option.
>+ * If not specified, set default value.
>+ */
>+int
>+check_splitblock_size(void)
>+{
>+	if (info->splitblock_size) {
>+		info->splitblock_size <<= 10;
>+		if (info->splitblock_size == 0) {
>+			ERRMSG("The splitblock size could not be 0. %s.\n",
>+				strerror(errno));
>+			return FALSE;
>+		}
>+		if (info->splitblock_size % info->page_size != 0) {
>+			ERRMSG("The splitblock size must be align to page_size. %s.\n",
>+				strerror(errno));
>+			return FALSE;
>+		}
>+	} else {
>+		info->splitblock_size = DEFAULT_SPLITBLOCK_SIZE;
>+	}
>+
>+	return TRUE;
>+}
>+
>+int
>+prepare_splitblock_table(void)
>+{
>+	size_t table_size;
>+
>+	if(!check_splitblock_size())
>+		return FALSE;
>+	if ((splitblock = calloc(1, sizeof(struct SplitBlock))) == NULL) {
>+		ERRMSG("Can't allocate memory for the splitblock. %s.\n",
>+			strerror(errno));
>+		return FALSE;
>+	}
>+
>+	splitblock->page_per_splitblock = info->splitblock_size / info->page_size;
>+	splitblock->num = (info->max_mapnr + splitblock->page_per_splitblock -1) /
>+			  splitblock->page_per_splitblock;

Please use "divideup(info->max_mapnr, splitblock->page_per_splitblock)".


Thanks,
Atsushi Kumagai

>+	splitblock->entry_size = calculate_entry_size();
>+	table_size = splitblock->entry_size * splitblock->num;
>+
>+	splitblock->table = (char *)calloc(sizeof(char), table_size);
>+	if (!splitblock->table) {
>+		ERRMSG("Can't allocate memory for the splitblock_table. %s.\n",
>+			 strerror(errno));
>+		return FALSE;
>+	}
>+
>+	return TRUE;
>+}
>+
> mdf_pfn_t
> get_num_dumpable(void)
> {
>@@ -5760,6 +5822,45 @@ get_num_dumpable(void)
> 	return num_dumpable;
> }
>
>+/*
>+ * generate splitblock_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;
>+
>+	pfn_memhole = info->max_mapnr;
>+
>+	for_each_cycle(0, info->max_mapnr, &cycle) {
>+		if (!exclude_unnecessary_pages_cyclic(&cycle))
>+			return FALSE;
>+
>+		if (info->flag_mem_usage)
>+			exclude_zero_pages_cyclic(&cycle);
>+
>+		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 >= splitblock->page_per_splitblock) {
>+				write_into_splitblock_table(splitblock->table + pos,
>+							    dumpable_pfn_num);
>+				pos += splitblock->entry_size;
>+				pfn_num = 0;
>+				dumpable_pfn_num = 0;
>+			}
>+		}
>+	}
>+
>+	return num_dumpable;
>+}
>+
> mdf_pfn_t
> get_num_dumpable_cyclic(void)
> {
>@@ -9717,6 +9818,12 @@ out:
> 		if (info->page_buf != NULL)
> 			free(info->page_buf);
> 		free(info);
>+
>+		if (splitblock) {
>+			if (splitblock->table)
>+				free(splitblock->table);
>+			free(splitblock);
>+		}
> 	}
> 	free_elf_info();
>
>diff --git a/makedumpfile.h b/makedumpfile.h
>index 7d9c2e6..39c49b8 100644
>--- a/makedumpfile.h
>+++ b/makedumpfile.h
>@@ -1178,6 +1178,8 @@ extern struct DumpInfo		*info;
> /*
>  * for cyclic_splitting mode,Manage memory by splitblock
>  */
>+#define DEFAULT_SPLITBLOCK_SIZE (1LL << 30)
>+
> struct SplitBlock{
>         char *table;
>         long long num;
>@@ -1888,9 +1890,11 @@ struct elf_prstatus {
>  * Function Prototype.
>  */
> mdf_pfn_t get_num_dumpable_cyclic(void);
>+mdf_pfn_t get_num_dumpable_cyclic_withsplit(void);
> int get_loads_dumpfile_cyclic(void);
> int initial_xen(void);
> unsigned long long get_free_memory_size(void);
> int calculate_cyclic_buffer_size(void);
>+int prepare_splitblock_table(void);
>
> #endif /* MAKEDUMPFILE_H */
>--
>1.7.1
>
>
>_______________________________________________
>kexec mailing list
>kexec at lists.infradead.org
>http://lists.infradead.org/mailman/listinfo/kexec



More information about the kexec mailing list