qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v2 3/4] kdump: add vmcoreinfo


From: Andrew Jones
Subject: Re: [Qemu-devel] [PATCH v2 3/4] kdump: add vmcoreinfo
Date: Mon, 5 Jun 2017 10:07:05 +0200
User-agent: Mutt/1.6.0.1 (2016-04-01)

On Thu, Jun 01, 2017 at 05:03:24PM +0400, Marc-André Lureau wrote:
> kdump header provides offset and size of the vmcoreinfo note, append it
> if available.
> 
> Signed-off-by: Marc-André Lureau <address@hidden>
> ---
>  dump.c | 48 ++++++++++++++++++++++++++++++++++++++++++++----
>  1 file changed, 44 insertions(+), 4 deletions(-)
> 
> diff --git a/dump.c b/dump.c
> index 6911ffad8b..ba7676a514 100644
> --- a/dump.c
> +++ b/dump.c
> @@ -791,8 +791,9 @@ static void create_header32(DumpState *s, Error **errp)
>      uint32_t sub_hdr_size;
>      uint32_t bitmap_blocks;
>      uint32_t status = 0;
> -    uint64_t offset_note;
> +    uint64_t offset_note, offset_vmcoreinfo, size_vmcoreinfo = 0;
>      Error *local_err = NULL;
> +    uint8_t *vmcoreinfo = NULL;
>  
>      /* write common header, the version of kdump-compressed format is 6th */
>      size = sizeof(DiskDumpHeader32);
> @@ -841,7 +842,18 @@ static void create_header32(DumpState *s, Error **errp)
>      kh->phys_base = cpu_to_dump32(s, s->dump_info.phys_base);
>      kh->dump_level = cpu_to_dump32(s, DUMP_LEVEL);
>  
> -    offset_note = DISKDUMP_HEADER_BLOCKS * block_size + size;
> +    offset_vmcoreinfo = DISKDUMP_HEADER_BLOCKS * block_size + size;
> +    if (s->vmcoreinfo) {
> +        uint64_t hsize, name_size;
> +
> +        get_note_sizes(s, s->vmcoreinfo, &hsize, &name_size, 
> &size_vmcoreinfo);
> +        vmcoreinfo =
> +            s->vmcoreinfo + ((hsize + 3) / 4 + (name_size + 3) / 4) * 4;
> +        kh->offset_vmcoreinfo = cpu_to_dump64(s, offset_vmcoreinfo);
> +        kh->size_vmcoreinfo = cpu_to_dump32(s, size_vmcoreinfo);
> +    }
> +
> +    offset_note = offset_vmcoreinfo + size_vmcoreinfo;
>      kh->offset_note = cpu_to_dump64(s, offset_note);
>      kh->note_size = cpu_to_dump32(s, s->note_size);
>  
> @@ -851,6 +863,14 @@ static void create_header32(DumpState *s, Error **errp)
>          goto out;
>      }
>  
> +    if (vmcoreinfo) {
> +        if (write_buffer(s->fd, offset_vmcoreinfo, vmcoreinfo,
> +                         size_vmcoreinfo) < 0) {
> +            error_setg(errp, "dump: failed to vmcoreinfo");
> +            goto out;
> +        }
> +    }
> +
>      /* write note */
>      s->note_buf = g_malloc0(s->note_size);
>      s->note_buf_offset = 0;
> @@ -891,8 +911,9 @@ static void create_header64(DumpState *s, Error **errp)
>      uint32_t sub_hdr_size;
>      uint32_t bitmap_blocks;
>      uint32_t status = 0;
> -    uint64_t offset_note;
> +    uint64_t offset_note, offset_vmcoreinfo, size_vmcoreinfo = 0;
>      Error *local_err = NULL;
> +    uint8_t *vmcoreinfo = NULL;
>  
>      /* write common header, the version of kdump-compressed format is 6th */
>      size = sizeof(DiskDumpHeader64);
> @@ -941,7 +962,18 @@ static void create_header64(DumpState *s, Error **errp)
>      kh->phys_base = cpu_to_dump64(s, s->dump_info.phys_base);
>      kh->dump_level = cpu_to_dump32(s, DUMP_LEVEL);
>  
> -    offset_note = DISKDUMP_HEADER_BLOCKS * block_size + size;
> +    offset_vmcoreinfo = DISKDUMP_HEADER_BLOCKS * block_size + size;
> +    if (s->vmcoreinfo) {
> +        uint64_t hsize, name_size;
> +
> +        get_note_sizes(s, s->vmcoreinfo, &hsize, &name_size, 
> &size_vmcoreinfo);
> +        vmcoreinfo =
> +            s->vmcoreinfo + ((hsize + 3) / 4 + (name_size + 3) / 4) * 4;
> +        kh->offset_vmcoreinfo = cpu_to_dump64(s, offset_vmcoreinfo);
> +        kh->size_vmcoreinfo = cpu_to_dump64(s, size_vmcoreinfo);
> +    }
> +
> +    offset_note = offset_vmcoreinfo + size_vmcoreinfo;
>      kh->offset_note = cpu_to_dump64(s, offset_note);
>      kh->note_size = cpu_to_dump64(s, s->note_size);
>  
> @@ -951,6 +983,14 @@ static void create_header64(DumpState *s, Error **errp)
>          goto out;
>      }
>  
> +    if (vmcoreinfo) {
> +        if (write_buffer(s->fd, offset_vmcoreinfo, vmcoreinfo,
> +                         size_vmcoreinfo) < 0) {
> +            error_setg(errp, "dump: failed to vmcoreinfo");
> +            goto out;
> +        }
> +    }
> +
>      /* write note */
>      s->note_buf = g_malloc0(s->note_size);
>      s->note_buf_offset = 0;
> -- 
> 2.13.0.91.g00982b8dd
> 
>

Besides the + 3 / 4 * 4, which might be nicer as ROUND_UP()
 
Reviewed-by: Andrew Jones <address@hidden>



reply via email to

[Prev in Thread] Current Thread [Next in Thread]