[PATCH v1 1/5] makedumpfile: Add support for block
Atsushi Kumagai
kumagai-atsushi at mxc.nes.nec.co.jp
Fri Oct 10 01:11:28 PDT 2014
>When --split option is specified, fair I/O workloads shoud be assigned
>for each process. So the start and end pfn of each dumpfile should be
>calculated with excluding unnecessary pages. However, it costs a lot of
>time to execute excluding for the whole memory. That is why struct Block
>exists. Struct Block is designed to manage memory, mainly for recording
>the number of dumpable pages. We can use the number of dumpable pages to
>calculate start and end pfn instead of execute excluding for the whole
>memory.
*Block* is a general word, it may suggest other things (e.g. Disk Block).
Actually, --block-size is confusing since -b option uses *block_order*.
I prefer a more specific name like... SplitBlock.
Thanks,
Atsushi Kumagai
>The char array *table in struct Block is used to record the number of
>dumpable pages.
>The table entry size is calculated as
> divideup(log2(block_size / page_size), 8) bytes
>The table entry size is calculated, so that the
>space table taken will be small enough. And the code will also have a
>good performence when the number of pages in one block is big enough.
>
>Signed-off-by: Qiao Nuohan <qiaonuohan at cn.fujitsu.com>
>Signed-off-by: Zhou Wenjian <zhouwj-fnst at cn.fujitsu.com>
>---
> makedumpfile.c | 23 +++++++++++++++++++++++
> makedumpfile.h | 14 ++++++++++++++
> 2 files changed, 37 insertions(+), 0 deletions(-)
>
>diff --git a/makedumpfile.c b/makedumpfile.c
>index b4d43d8..2feda01 100644
>--- a/makedumpfile.c
>+++ b/makedumpfile.c
>@@ -34,6 +34,7 @@ struct srcfile_table srcfile_table;
>
> struct vm_table vt = { 0 };
> struct DumpInfo *info = NULL;
>+struct Block *block = NULL;
>
> char filename_stdout[] = FILENAME_STDOUT;
>
>@@ -5685,6 +5686,28 @@ out:
> return ret;
> }
>
>+/*
>+ * cyclic_split mode:
>+ * manage memory by blocks,
>+ * divide memory into blocks
>+ * use block_table to record numbers of dumpable pages in each block
>+ */
>+
>+//calculate entry size based on the amount of pages in one block
>+int
>+calculate_entry_size(void){
>+ int entry_num = 1, count = 1;
>+ int entry_size;
>+ while (entry_num < block->page_per_block){
>+ entry_num = entry_num << 1;
>+ count++;
>+ }
>+ entry_size = count/BITPERBYTE;
>+ if (count %BITPERBYTE)
>+ entry_size++;
>+ return entry_size;
>+}
>+
> mdf_pfn_t
> get_num_dumpable(void)
> {
>diff --git a/makedumpfile.h b/makedumpfile.h
>index 96830b0..ed4f799 100644
>--- a/makedumpfile.h
>+++ b/makedumpfile.h
>@@ -1168,10 +1168,24 @@ struct DumpInfo {
> */
> int (*page_is_buddy)(unsigned long flags, unsigned int _mapcount,
> unsigned long private, unsigned int _count);
>+ /*
>+ *for cyclic_splitting mode, setup block_size
>+ */
>+ long long block_size;
> };
> extern struct DumpInfo *info;
>
> /*
>+ *for cyclic_splitting mode,Manage memory by block
>+ */
>+struct Block{
>+ char *table;
>+ long long num;
>+ long long page_per_block;
>+ int entry_size; //counted by byte
>+};
>+
>+/*
> * kernel VM-related data
> */
> struct vm_table {
>--
>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