zipl/boot: Fix progress_print to correctly display 'Dump file size'

- Adjust progress_print() calls to pass updated address after the set of
  blocks has been written to disk.
- Currently total_dump_size value is updated only after the entire dump
  segment is written to disk what leads to ambiguos Dump file size values
  displayed by progress_print(). Change write_addr_range() to re-calculate
  total_dump_size after each set of blocks has been written to disk thus
  printing the correct value at the end of each log entry.
- Avoid final log entry duplication.

Signed-off-by: Mikhail Zaslonko <zaslonko@linux.ibm.com>
Acked-by: Alexander Egorenkov <egorenar@linux.ibm.com>
Signed-off-by: Jan Höppner <hoeppner@linux.ibm.com>
This commit is contained in:
Mikhail Zaslonko
2023-07-14 16:37:29 +02:00
committed by Jan Höppner
parent e35d05a5e3
commit f1db473d11
8 changed files with 14 additions and 16 deletions

View File

@@ -470,9 +470,10 @@ unsigned long write_addr_range(unsigned long blk, unsigned long start,
writeblock(blk, addr, blk_count, zero_page);
free_page(zero_page);
blk += blk_count;
addr += b2m(blk_count);
total_dump_size += b2m(blk_count);
if (print_progress)
progress_print(addr);
addr += b2m(blk_count);
}
return blk;
}

View File

@@ -269,7 +269,6 @@ static unsigned long write_volume(unsigned long addr,
/* Reserve one block for the next segment header */
if (free_space)
free_space -= b2m(1);
total_dump_size += dump_segm->len;
/* Check if no more dump segments follow */
if (dump_segm->stop_marker) {
/* Write end marker */

View File

@@ -60,14 +60,14 @@ static unsigned long dt_dump_mem_non_compressed(unsigned long addr,
while (addr < end) {
addr = find_dump_segment(addr, end, 0, dump_segm);
blk = write_dump_segment(blk, dump_segm);
total_dump_size += dump_segm->len;
if (dump_segm->stop_marker) {
addr = end;
if (dump_segm->start + dump_segm->len < end)
progress_print(addr);
break;
}
}
free_page(__pa(dump_segm));
progress_print(addr);
return blk;
}
@@ -88,7 +88,6 @@ static unsigned long dt_dump_mem_compressed(unsigned long addr,
dump_segm->start = addr;
dump_segm->len = ZLIB_WORKSPACE_LIMIT;
blk = write_dump_segment(blk, dump_segm);
total_dump_size += dump_segm->len;
addr += dump_segm->len;
/* Initialize zlib workarea, return value 0 is expected */
if (zlib_workarea_init(dump_segm->start, &strm)) {
@@ -118,16 +117,15 @@ static unsigned long dt_dump_mem_compressed(unsigned long addr,
addr = find_dump_segment(addr, end, DUMP_SEGM_ZLIB_MAXLEN,
dump_segm);
blk = write_compressed_dump_segment(blk, dump_segm, &strm);
total_dump_size += dump_segm->size_on_disk ?
b2m(dump_segm->size_on_disk) : dump_segm->len;
if (dump_segm->stop_marker) {
addr = end;
if (dump_segm->start + dump_segm->len < end)
progress_print(addr);
break;
}
}
zlib_deflateEnd(&strm);
free_page(__pa(dump_segm));
progress_print(addr);
return blk;
}
@@ -157,5 +155,6 @@ void dt_dump_mem(void)
page = get_zeroed_page();
df_s390_em_page_init(page);
writeblock(blk, page, 1, 0);
blk++;
free_page(page);
}

View File

@@ -166,7 +166,7 @@ unsigned long write_compressed_dump_segment(unsigned long blk,
segm->entry_offset[i] |= DUMP_SEGM_ENTRY_UNCOMPRESSED;
offset += blk - start_blk;
/* Print progress after each compressed chunk written */
progress_print(segm->start + i * chunk_size);
progress_print(segm->start + i * chunk_size + len);
}
/* Compression successful, store compressed size in the segment header */
segm->size_on_disk = (uint32_t)offset;

View File

@@ -153,9 +153,10 @@ unsigned long write_dump_segment_fba(unsigned long blk,
zero_page = get_zeroed_page();
writeblock_fba(blk, addr, blk_count, zero_page);
free_page(zero_page);
progress_print(addr);
blk += blk_count;
addr += b2m(blk_count);
total_dump_size += b2m(blk_count);
progress_print(addr);
}
return blk;
}
@@ -207,7 +208,6 @@ void dt_dump_mem(void)
while (addr < end) {
addr = find_dump_segment(addr, end, 0, dump_segm);
blk = write_dump_segment_fba(blk, dump_segm);
total_dump_size += dump_segm->len;
if (dump_segm->stop_marker) {
addr = end;
break;

View File

@@ -74,7 +74,6 @@ void progress_print(unsigned long addr)
}
if (time < next && addr != dump_hdr->mem_size)
return;
printf("%08lu / %08lu MB (Dump file size %08lu MB)", addr >> 20,
dump_hdr->mem_size >> 20, total_dump_size >> 20);
next = time + delta;

View File

@@ -39,7 +39,6 @@ extern unsigned long total_dump_size;
*/
void create_ida_list(unsigned long *list, int len, unsigned long addr,
unsigned long zero_page);
void init_progress_print(void);
void progress_print(unsigned long addr);
void df_s390_em_page_init(unsigned long page);
void pgm_check_handler(void);

View File

@@ -206,13 +206,14 @@ void dt_dump_mem(void)
setup_idrc_compression();
ccw_write_tapemark();
total_dump_size = 0;
ccw_write_block((unsigned long) dump_hdr, DF_S390_HDR_SIZE, 0);
for (addr = 0; addr < dump_hdr->mem_size; addr += BLK_SIZE) {
ccw_write_block(addr, BLK_SIZE, page);
progress_print(addr);
progress_print_disp(addr);
total_dump_size += BLK_SIZE;
progress_print(addr + BLK_SIZE);
progress_print_disp(addr + BLK_SIZE);
}
progress_print(addr);
df_s390_em_page_init(page);
ccw_write_block(page, sizeof(struct df_s390_em), 0);
free_page(page);