[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