For merging the routine corresponding to the bitmap, it's better if the partial bitmap is also managed by struct dump_bitmap. Signed-off-by: Atsushi Kumagai <ats-kumagai at wm.jp.nec.com> --- makedumpfile.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++------------ makedumpfile.h | 10 +++++----- 2 files changed, 54 insertions(+), 18 deletions(-) diff --git a/makedumpfile.c b/makedumpfile.c index cb172b4..1192cfe 100644 --- a/makedumpfile.c +++ b/makedumpfile.c @@ -237,7 +237,7 @@ is_in_same_page(unsigned long vaddr1, unsigned long vaddr2) #define BITMAP_SECT_LEN 4096 static inline int is_dumpable(struct dump_bitmap *, mdf_pfn_t); -static inline int is_dumpable_cyclic(char *bitmap, mdf_pfn_t, struct cycle *cycle); +static inline int is_dumpable_cyclic(struct dump_bitmap *, mdf_pfn_t, struct cycle *cycle); unsigned long pfn_to_pos(mdf_pfn_t pfn) { @@ -3038,6 +3038,12 @@ initialize_bitmap_memory(void) strerror(errno)); return FALSE; } + bmp->buf = malloc(BUFSIZE_BITMAP); + if (bmp->buf == NULL) { + ERRMSG("Can't allocate memory for the bitmap buffer. %s\n", + strerror(errno)); + return FALSE; + } bmp->fd = info->fd_memory; bmp->file_name = info->name_memory; bmp->no_block = -1; @@ -3053,6 +3059,7 @@ initialize_bitmap_memory(void) if (info->valid_pages == NULL) { ERRMSG("Can't allocate memory for the valid_pages. %s\n", strerror(errno)); + free(bmp->buf); free(bmp); return FALSE; } @@ -3362,9 +3369,12 @@ initialize_bitmap(struct dump_bitmap *bitmap) } void -initialize_bitmap_cyclic(char *bitmap) +initialize_bitmap_cyclic(struct dump_bitmap *bitmap) { - memset(bitmap, 0, info->bufsize_cyclic); + bitmap->fd = 0; + bitmap->file_name = NULL; + bitmap->no_block = -1; + memset(bitmap->buf, 0, info->bufsize_cyclic); } void @@ -3430,7 +3440,7 @@ set_bitmap(struct dump_bitmap *bitmap, mdf_pfn_t pfn, int val) } int -set_bitmap_cyclic(char *bitmap, mdf_pfn_t pfn, int val, struct cycle *cycle) +set_bitmap_cyclic(struct dump_bitmap *bitmap, mdf_pfn_t pfn, int val, struct cycle *cycle) { int byte, bit; static int warning = 0; @@ -3450,9 +3460,9 @@ set_bitmap_cyclic(char *bitmap, mdf_pfn_t pfn, int val, struct cycle *cycle) byte = (pfn - cycle->start_pfn)>>3; bit = (pfn - cycle->start_pfn) & 7; if (val) - bitmap[byte] |= 1<<bit; + bitmap->buf[byte] |= 1<<bit; else - bitmap[byte] &= ~(1<<bit); + bitmap->buf[byte] &= ~(1<<bit); return TRUE; } @@ -4715,7 +4725,7 @@ create_1st_bitmap_cyclic(struct cycle *cycle) pfn_end_byte = (pfn_end_round - cycle->start_pfn) >> 3; if (pfn_start_byte < pfn_end_byte) { - memset(info->partial_bitmap1 + pfn_start_byte, + memset(info->partial_bitmap1->buf + pfn_start_byte, 0xff, pfn_end_byte - pfn_start_byte); } @@ -4863,7 +4873,7 @@ initialize_2nd_bitmap_cyclic(struct cycle *cycle) pfn_end_byte = (pfn_end_round - cycle->start_pfn) >> 3; if (pfn_start_byte < pfn_end_byte) { - memset(info->partial_bitmap2 + pfn_start_byte, + memset(info->partial_bitmap2->buf + pfn_start_byte, 0xff, pfn_end_byte - pfn_start_byte); pfn_memhole -= (pfn_end_byte - pfn_start_byte) << 3; @@ -5318,11 +5328,16 @@ prepare_bitmap1_buffer_cyclic(void) /* * Prepare partial bitmap buffers for cyclic processing. */ - if ((info->partial_bitmap1 = (char *)malloc(info->bufsize_cyclic)) == NULL) { + if ((info->partial_bitmap1 = malloc(sizeof(struct dump_bitmap))) == NULL) { ERRMSG("Can't allocate memory for the 1st bitmaps. %s\n", strerror(errno)); return FALSE; } + if ((info->partial_bitmap1->buf = (char *)malloc(info->bufsize_cyclic)) == NULL) { + ERRMSG("Can't allocate memory for the 1st bitmaps's buffer. %s\n", + strerror(errno)); + return FALSE; + } initialize_bitmap_cyclic(info->partial_bitmap1); return TRUE; @@ -5344,11 +5359,16 @@ prepare_bitmap2_buffer_cyclic(void) /* * Prepare partial bitmap buffers for cyclic processing. */ - if ((info->partial_bitmap2 = (char *)malloc(info->bufsize_cyclic)) == NULL) { + if ((info->partial_bitmap2 = malloc(sizeof(struct dump_bitmap))) == NULL) { ERRMSG("Can't allocate memory for the 2nd bitmaps. %s\n", strerror(errno)); return FALSE; } + if ((info->partial_bitmap2->buf = (char *)malloc(info->bufsize_cyclic)) == NULL) { + ERRMSG("Can't allocate memory for the 2nd bitmaps's buffer. %s\n", + strerror(errno)); + return FALSE; + } initialize_bitmap_cyclic(info->partial_bitmap2); return TRUE; @@ -5358,6 +5378,10 @@ void free_bitmap1_buffer(void) { if (info->bitmap1) { + if (info->bitmap1->buf) { + free(info->bitmap1->buf); + info->bitmap1->buf = NULL; + } free(info->bitmap1); info->bitmap1 = NULL; } @@ -5367,6 +5391,10 @@ void free_bitmap2_buffer(void) { if (info->bitmap2) { + if (info->bitmap2->buf) { + free(info->bitmap2->buf); + info->bitmap2->buf = NULL; + } free(info->bitmap2); info->bitmap2 = NULL; } @@ -5383,6 +5411,10 @@ void free_bitmap1_buffer_cyclic() { if (info->partial_bitmap1 != NULL){ + if (info->partial_bitmap1->buf != NULL) { + free(info->partial_bitmap1->buf); + info->partial_bitmap1->buf = NULL; + } free(info->partial_bitmap1); info->partial_bitmap1 = NULL; } @@ -5392,6 +5424,10 @@ void free_bitmap2_buffer_cyclic() { if (info->partial_bitmap2 != NULL){ + if (info->partial_bitmap2->buf != NULL) { + free(info->partial_bitmap2->buf); + info->partial_bitmap2->buf = NULL; + } free(info->partial_bitmap2); info->partial_bitmap2 = NULL; } @@ -6918,7 +6954,7 @@ write_kdump_pages_cyclic(struct cache_data *cd_header, struct cache_data *cd_pag /* * Check the excluded page. */ - if (!is_on(info->partial_bitmap2, pfn - cycle->start_pfn)) + if (!is_on(info->partial_bitmap2->buf, pfn - cycle->start_pfn)) continue; num_dumped++; @@ -7291,7 +7327,7 @@ write_kdump_bitmap1_cyclic(struct cycle *cycle) offset = info->offset_bitmap1; if (!write_buffer(info->fd_dumpfile, offset + info->bufsize_cyclic * (cycle->start_pfn / info->pfn_cyclic), - info->partial_bitmap1, increment, info->name_dumpfile)) + info->partial_bitmap1->buf, increment, info->name_dumpfile)) goto out; ret = TRUE; @@ -7315,7 +7351,7 @@ write_kdump_bitmap2_cyclic(struct cycle *cycle) offset = info->offset_bitmap1; offset += info->len_bitmap / 2; if (!write_buffer(info->fd_dumpfile, offset, - info->partial_bitmap2, increment, info->name_dumpfile)) + info->partial_bitmap2->buf, increment, info->name_dumpfile)) goto out; info->offset_bitmap1 += increment; diff --git a/makedumpfile.h b/makedumpfile.h index d2fadbd..4beac65 100644 --- a/makedumpfile.h +++ b/makedumpfile.h @@ -897,7 +897,7 @@ struct dump_bitmap { int fd; int no_block; char *file_name; - char buf[BUFSIZE_BITMAP]; + char *buf; off_t offset; }; @@ -1149,8 +1149,8 @@ struct DumpInfo { /* * for cyclic processing */ - char *partial_bitmap1; - char *partial_bitmap2; + struct dump_bitmap *partial_bitmap1; + struct dump_bitmap *partial_bitmap2; mdf_pfn_t num_dumpable; unsigned long bufsize_cyclic; unsigned long pfn_cyclic; @@ -1756,12 +1756,12 @@ is_dumpable(struct dump_bitmap *bitmap, mdf_pfn_t pfn) } static inline int -is_dumpable_cyclic(char *bitmap, mdf_pfn_t pfn, struct cycle *cycle) +is_dumpable_cyclic(struct dump_bitmap *bitmap, mdf_pfn_t pfn, struct cycle *cycle) { if (pfn < cycle->start_pfn || cycle->end_pfn <= pfn) return FALSE; else - return is_on(bitmap, pfn - cycle->start_pfn); + return is_on(bitmap->buf, pfn - cycle->start_pfn); } static inline int -- 1.9.0