Hi Pingfan, Thank you for the update. Looks good, and applied. Kazu On 8/8/2018 1:21 AM, Pingfan Liu wrote: > When refiltering on kdump format file, there is no info about pt_load[] for > exclude_nodata_pages(), and also we can not expect more data than the kdump > file can provide, hence this patch suggests to initialize the refiltered > bitmap2 from the kdump file's bitmap2. As for the statics of pfn_hole, it > should be calculated and discount the bits in kdump file's bitmap1. > > Note about the bug reported by the following ops: > makedumpfile -l --message-level 1 -d 31 /proc/vmcore /path/to/vmcore > makedumpfile --split -d 31 ./vmcore dumpfile_{1,2,3} 2>&1 > And get the following error: > Excluding unnecessary pages : [100.0 %] \ > readpage_kdump_compressed: pfn(9b) is excluded from /var/crash/127.0.0.1-2018-07-02-22:10:38/vmcore. > readmem: type_addr: 1, addr:9b000, size:4096 > read_pfn: Can't get the page data. > writeout_multiple_dumpfiles: Child process(2277) finished incompletely.(256) > Copying data : [ 24.6 %] - eta: 2s > makedumpfile Failed. > > Cc: Kazuhito Hagio <k-hagio@xxxxxxxxxxxxx> > Signed-off-by: Pingfan Liu <piliu@xxxxxxxxxx> > --- > v2 -> v3: fix the statics of pfn_hole > makedumpfile.c | 39 ++++++++++++++++++++++++++++++++++----- > 1 file changed, 34 insertions(+), 5 deletions(-) > > diff --git a/makedumpfile.c b/makedumpfile.c > index 915cbf4..edb7687 100644 > --- a/makedumpfile.c > +++ b/makedumpfile.c > @@ -5516,6 +5516,26 @@ out: > "follow free lists instead of mem_map array.\n"); > } > > +static mdf_pfn_t count_bits(char *buf, int sz) > +{ > + char *p = buf; > + int i, j; > + mdf_pfn_t cnt = 0; > + for (i = 0; i < sz; i++, p++) { > + if (*p == 0) > + continue; > + else if (*p == 0xff) { > + cnt += 8; > + continue; > + } > + for (j = 0; j < 8; j++) { > + if (*p & 1<<j) > + cnt++; > + } > + } > + return cnt; > +} > + > /* > * If using a dumpfile in kdump-compressed format as a source file > * instead of /proc/vmcore, 1st-bitmap of a new dumpfile must be > @@ -5549,6 +5569,7 @@ copy_1st_bitmap_from_memory(void) > info->name_memory, strerror(errno)); > return FALSE; > } > + pfn_memhole -= count_bits(buf, sizeof(buf)); > if (write(info->bitmap1->fd, buf, sizeof(buf)) != sizeof(buf)) { > ERRMSG("Can't write the bitmap(%s). %s\n", > info->bitmap1->file_name, strerror(errno)); > @@ -6093,19 +6114,27 @@ copy_bitmap_buffer(void) > int > copy_bitmap_file(void) > { > - off_t offset; > + off_t base, offset = 0; > unsigned char buf[info->page_size]; > const off_t failed = (off_t)-1; > + int fd; > + struct disk_dump_header *dh = info->dh_memory; > > - offset = 0; > + if (info->flag_refiltering) { > + fd = info->fd_memory; > + base = info->len_bitmap / 2; > + base += (DISKDUMP_HEADER_BLOCKS + dh->sub_hdr_size) * dh->block_size; > + } else { > + fd = info->bitmap1->fd; > + base = info->bitmap1->offset; > + } > while (offset < (info->len_bitmap / 2)) { > - if (lseek(info->bitmap1->fd, info->bitmap1->offset + offset, > - SEEK_SET) == failed) { > + if (lseek(fd, base + offset, SEEK_SET) == failed) { > ERRMSG("Can't seek the bitmap(%s). %s\n", > info->name_bitmap, strerror(errno)); > return FALSE; > } > - if (read(info->bitmap1->fd, buf, sizeof(buf)) != sizeof(buf)) { > + if (read(fd, buf, sizeof(buf)) != sizeof(buf)) { > ERRMSG("Can't read the dump memory(%s). %s\n", > info->name_memory, strerror(errno)); > return FALSE; > -- > 2.7.4 > _______________________________________________ kexec mailing list kexec@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/kexec