[PATCHv3] makedumpfile: when using refiltering, initialize refiltered bitmap2 from the kdump file's bitmap2

Kazuhito Hagio k-hagio at ab.jp.nec.com
Wed Aug 8 07:13:17 PDT 2018


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 at ab.jp.nec.com>
> Signed-off-by: Pingfan Liu <piliu at redhat.com>
> ---
> 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
> 





More information about the kexec mailing list