On large nodes, bitmap creation takes a serious amount of time. But the progress indicator only starts after the bitmaps has been created, showing only the progress of the copy process. This patch adds a "message" parameter to the print_progress() function. That message is displayed first and gets overwritten by next message. So, the user sees Excluding zero pages : [ 0 %] Excluding zero pages : [... %] Excluding zero pages : [100 %] Copying data : [ 0 %] Copying data : [... %] Copying data : [100 %] in sequence. IMO that's the fastest option to implement such a progress. Signed-off-by: Bernhard Walle <bwalle at suse.de> --- makedumpfile.c | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) --- a/makedumpfile.c +++ b/makedumpfile.c @@ -32,6 +32,17 @@ int message_level; /* * Forward declarations */ +void print_progress(const char *msg, + unsigned long current, + unsigned long end); + +/* + * Message texts + */ +#define PROGRESS_COPY "Copying data" +#define PROGRESS_UNN_PAGES "Excluding unnecessary pages" +#define PROGRESS_ZERO_PAGES "Excluding zero pages" +#define PROGRESS_MAXLEN "35" /* * The numbers of the excluded pages @@ -4062,6 +4073,9 @@ exclude_zero_pages() } for (pfn = paddr = 0; pfn < info->max_mapnr; pfn++, paddr += info->page_size) { + + print_progress(PROGRESS_ZERO_PAGES, pfn, info->max_mapnr); + if (!is_in_segs(paddr)) continue; @@ -4100,6 +4114,8 @@ exclude_unnecessary_pages() goto out; } for (mm = 0; mm < info->num_mem_map; mm++) { + print_progress(PROGRESS_UNN_PAGES, mm, info->num_mem_map); + mmd = &info->mem_map_data[mm]; pfn = mmd->pfn_start; paddr = pfn*info->page_size; @@ -4670,7 +4686,7 @@ write_kdump_header() } void -print_progress(unsigned long current, unsigned long end) +print_progress(const char *msg, unsigned long current, unsigned long end) { int progress; time_t tm; @@ -4686,7 +4702,7 @@ print_progress(unsigned long current, un progress = 100; PROGRESS_MSG("\r"); - PROGRESS_MSG("[%3d %%]", progress); + PROGRESS_MSG("%-" PROGRESS_MAXLEN "s: [%3d %%] ", msg, progress); } int @@ -4912,7 +4928,7 @@ write_elf_pages() while (bufsz_remain > 0) { if ((num_dumped % per) == 0) - print_progress(num_dumped, num_dumpable); + print_progress(PROGRESS_COPY, num_dumped, num_dumpable); if (bufsz_remain >= page_size) bufsz_write = page_size; @@ -5009,7 +5025,7 @@ write_elf_pages() while (bufsz_remain > 0) { if ((num_dumped % per) == 0) - print_progress(num_dumped, num_dumpable); + print_progress(PROGRESS_COPY, num_dumped, num_dumpable); if (bufsz_remain >= page_size) bufsz_write = page_size; @@ -5038,7 +5054,7 @@ write_elf_pages() if (!write_cache_bufsz(&cd_seg)) goto out; - print_progress(num_dumpable, num_dumpable); + print_progress(PROGRESS_COPY, num_dumpable, num_dumpable); PROGRESS_MSG("\n"); ret = TRUE; @@ -5247,7 +5263,7 @@ write_kdump_pages() for (pfn = 0; pfn < info->max_mapnr; pfn++) { if ((num_dumped % per) == 0) - print_progress(num_dumped, num_dumpable); + print_progress(PROGRESS_COPY, num_dumped, num_dumpable); if ((pfn % PFN_BUFBITMAP) == 0) { if (info->len_bitmap - bm2.offset < BUFSIZE_BITMAP) @@ -5325,7 +5341,7 @@ write_kdump_pages() /* * Print the progress of the end. */ - print_progress(num_dumpable, num_dumpable); + print_progress(PROGRESS_COPY, num_dumpable, num_dumpable); PROGRESS_MSG("\n"); ret = TRUE;