Hi On Thu, Sep 14, 2023 at 5:03 AM Stephen Brennan <stephen.s.bren...@oracle.com> wrote: > > This can be used from QMP command line as "-R" to mirror the > corresponding flag for makedumpfile. This enables the kdump_reassembled > flag introduced in the previous patch. > > Signed-off-by: Stephen Brennan <stephen.s.bren...@oracle.com> > --- > dump/dump-hmp-cmds.c | 8 +++++++- > dump/dump.c | 12 +++++++++++- > hmp-commands.hx | 7 +++++-- > qapi/dump.json | 14 +++++++++++++- > 4 files changed, 36 insertions(+), 5 deletions(-) > > diff --git a/dump/dump-hmp-cmds.c b/dump/dump-hmp-cmds.c > index b038785fee..1d882e4bd8 100644 > --- a/dump/dump-hmp-cmds.c > +++ b/dump/dump-hmp-cmds.c > @@ -24,9 +24,11 @@ void hmp_dump_guest_memory(Monitor *mon, const QDict > *qdict) > bool has_begin = qdict_haskey(qdict, "begin"); > bool has_length = qdict_haskey(qdict, "length"); > bool has_detach = qdict_haskey(qdict, "detach"); > + bool has_reassembled = qdict_haskey(qdict, "reassembled"); > int64_t begin = 0; > int64_t length = 0; > bool detach = false; > + bool reassembled = false; > enum DumpGuestMemoryFormat dump_format = DUMP_GUEST_MEMORY_FORMAT_ELF; > char *prot; > > @@ -61,11 +63,15 @@ void hmp_dump_guest_memory(Monitor *mon, const QDict > *qdict) > if (has_detach) { > detach = qdict_get_bool(qdict, "detach"); > } > + if (has_reassembled) { > + reassembled = qdict_get_bool(qdict, "reassembled"); > + } > > prot = g_strconcat("file:", file, NULL); > > qmp_dump_guest_memory(paging, prot, true, detach, has_begin, begin, > - has_length, length, true, dump_format, &err); > + has_length, length, true, has_reassembled, > + reassembled, dump_format, &err); > hmp_handle_error(mon, err); > g_free(prot); > } > diff --git a/dump/dump.c b/dump/dump.c > index fb9040cfbc..42d4015fb3 100644 > --- a/dump/dump.c > +++ b/dump/dump.c > @@ -2089,6 +2089,7 @@ void qmp_dump_guest_memory(bool paging, const char > *file, > bool has_detach, bool detach, > bool has_begin, int64_t begin, bool has_length, > int64_t length, bool has_format, > + bool has_reassembled, bool reassembled, > DumpGuestMemoryFormat format, Error **errp) > { > ERRP_GUARD(); > @@ -2119,6 +2120,12 @@ void qmp_dump_guest_memory(bool paging, const char > *file, > "filter"); > return; > } > + if (has_reassembled && format != DUMP_GUEST_MEMORY_FORMAT_KDUMP_ZLIB > + && format != DUMP_GUEST_MEMORY_FORMAT_KDUMP_LZO > + && format != DUMP_GUEST_MEMORY_FORMAT_KDUMP_SNAPPY) { > + error_setg(errp, "'reassembled' only applies to kdump format"); > + return; > + } > if (has_begin && !has_length) { > error_setg(errp, QERR_MISSING_PARAMETER, "length"); > return; > @@ -2130,6 +2137,9 @@ void qmp_dump_guest_memory(bool paging, const char > *file, > if (has_detach) { > detach_p = detach; > } > + if (!has_reassembled) { > + reassembled = false; > + } > > /* check whether lzo/snappy is supported */ > #ifndef CONFIG_LZO > @@ -2192,7 +2202,7 @@ void qmp_dump_guest_memory(bool paging, const char > *file, > dump_state_prepare(s); > > dump_init(s, fd, has_format, format, paging, has_begin, > - begin, length, false, errp); > + begin, length, reassembled, errp); > if (*errp) { > qatomic_set(&s->status, DUMP_STATUS_FAILED); > return; > diff --git a/hmp-commands.hx b/hmp-commands.hx > index 2cbd0f77a0..c3062da470 100644 > --- a/hmp-commands.hx > +++ b/hmp-commands.hx > @@ -1085,14 +1085,15 @@ ERST > > { > .name = "dump-guest-memory", > - .args_type = > "paging:-p,detach:-d,windmp:-w,zlib:-z,lzo:-l,snappy:-s,filename:F,begin:l?,length:l?", > - .params = "[-p] [-d] [-z|-l|-s|-w] filename [begin length]", > + .args_type = > "paging:-p,detach:-d,windmp:-w,zlib:-z,lzo:-l,snappy:-s,reassembled:-R,filename:F,begin:l?,length:l?", > + .params = "[-p] [-d] [-z|-l|-s|-w] [-R] filename [begin length]", > .help = "dump guest memory into file 'filename'.\n\t\t\t" > "-p: do paging to get guest's memory mapping.\n\t\t\t" > "-d: return immediately (do not wait for > completion).\n\t\t\t" > "-z: dump in kdump-compressed format, with zlib > compression.\n\t\t\t" > "-l: dump in kdump-compressed format, with lzo > compression.\n\t\t\t" > "-s: dump in kdump-compressed format, with snappy > compression.\n\t\t\t" > + "-R: when using kdump (-z, -l, -s), try to avoid the > flattened format.\n\t\t\t" > "-w: dump in Windows crashdump format (can be used > instead of ELF-dump converting),\n\t\t\t" > " for Windows x86 and x64 guests with vmcoreinfo > driver only.\n\t\t\t" > "begin: the starting physical address.\n\t\t\t" > @@ -1115,6 +1116,8 @@ SRST > dump in kdump-compressed format, with lzo compression. > ``-s`` > dump in kdump-compressed format, with snappy compression. > + ``-R`` > + when using kdump (-z, -l, -s), try to avoid the flattened format. > ``-w`` > dump in Windows crashdump format (can be used instead of ELF-dump > converting), > for Windows x64 guests with vmcoreinfo driver only > diff --git a/qapi/dump.json b/qapi/dump.json > index 4ae1f722a9..9cc7c3ea93 100644 > --- a/qapi/dump.json > +++ b/qapi/dump.json > @@ -69,6 +69,18 @@ > # to dump all guest's memory, please specify the start @begin and > # @length > # > +# @reassembled: if false (the default), the kdump output formats will use the > +# "makedumpfile flattened" variant of the format, which is less broadly > +# compatible with analysis tools. The flattened dump can be reassembled > +# after the fact using the command "makedumpfile -R". If true, Qemu
QEMU > +# attempts to generate the standard kdump format. This requires a > +# seekable file as output -- if the output file is not seekable, then > +# the flattened format is still generated. The standard format is more Will have to be adjusted to return an error if we drop the fallback behaviour. > +# broadly compatible with debugging tools, but generating it requires a > +# seekable output file descriptor, and could use more system memory due > +# to page cache utilization. This should be left unspecified for > non-kdump > +# output formats. > +# > # @format: if specified, the format of guest memory dump. But non-elf > # format is conflict with paging and filter, ie. @paging, @begin > # and @length is not allowed to be specified with non-elf @format > @@ -89,7 +101,7 @@ > { 'command': 'dump-guest-memory', > 'data': { 'paging': 'bool', 'protocol': 'str', '*detach': 'bool', > '*begin': 'int', '*length': 'int', > - '*format': 'DumpGuestMemoryFormat'} } > + '*reassembled': 'bool', '*format': 'DumpGuestMemoryFormat'} } > > ## > # @DumpStatus: > -- > 2.39.3 > -- Marc-André Lureau