[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