[Crash-utility] [PATCH] add support to "virsh dump-guest-memory"(qemu memory dump)
Dave Anderson
anderson at redhat.com
Fri Aug 10 18:46:11 UTC 2012
----- Original Message -----
> At 2012-8-8 21:26, Dave Anderson wrote:
> >
> >
> > ----- Original Message -----
> >> At 2012-8-8 2:59, Dave Anderson wrote:
> >>
> >> >
> >> > Anyway, it was surprising to note is that the two dumpfiles can already
> >> > can be read with no problem by the crash utility -- with no additional
> >> > patches to support it. The crash utility just thinks that it's a kdump
> >> > with some unknown "QEMU" ELF notes:
> >>
> >> That's right. The formats are extremely similar, except the qemu note
> >> section.
> >>
> >> > I should have suggested moving one of the currently-existing pc->flags bits into
> >> > pc->flags2, and keeping all the dumpfile types in pc->flags. Or at least create a
> >>
> >> I think it's a better choice. But encountering a new type of dump file,
> >> creating a patch used to move bits in pc->flags can easily put things
> >> into a mess. Why not use a new flag only used to keep dumpfile types?
> >
> > Yes, that's probably a better idea. When the next "real" dumpfile type
> > comes along, perhaps we can go that route.
>
> I see. And I reworked the patches to treat qemu memory dump as kdump.
> >
> >> > But -- it seems that we can just leave the dumpfile type as a "KDUMP_ELF32/KDUMP_ELF64",
> >> > and then based upon the existence of a "QEMU" note, just set a QEMU_MEM_DUMP pc->flags2
> >> > bit that can be used everywhere that you're interested in accessing the "QEMU"
> >> > notes/registers section? Wouldn't that be far simpler?
> >>
> >> Treat it as a kdump files seems cool to me. The only problem is I still
> >> need to distinguish kdump and qemu memory dump, not only using qemu note
> >> section, but also the first 640K is special(when doing qemu memory dump,
> >> the second kernel is working).
> >
> > Right, and you will be able to set the new QEMU_MEM_DUMP flag very early
> > on during the dumpfile determination phase so that later you will have
> > that knowledge at hand later on when you want to deal with the notes.
> >
> > With respect to the "second-kernel" issue, I would presume that you would
> > have to use the currently-existing "--machdep phys_base=<physaddr>" capability
> > for x86_64?
>
> Yes, that's right. To see dump image from the 2nd kernel's view,
> phys_base should be set.
>
> P.S.
> I will suspend the work for about one week because of personal affairs.
Hello Qiao,
Here are my comments on your latest patch.
First, I have a couple problems with your check_elf_note() implementation.
It gets called regardless whether it's a QEMU-generated dumpfile or not.
You call the function here in is_netdump():
if ((load32->p_offset & (MIN_PAGE_SIZE-1)) &&
(load32->p_align == 0)) {
tmp_flags |= KDUMP_ELF32;
if (check_elf_note(eheader, fd, file, 0))
pc->flags2 |= QEMU_MEM_DUMP;
} else
if ((load64->p_offset & (MIN_PAGE_SIZE-1)) &&
(load64->p_align == 0)) {
tmp_flags |= KDUMP_ELF64;
if (check_elf_note(eheader, fd, file, 1))
pc->flags2 |= QEMU_MEM_DUMP;
} else
That forces *all* non-QEMU netdumps and kdumps to run through the
complete check_elf_note() function for no reason at all.
But more importantly, the check_elf_note() is a huge duplication
of effort. It completely parses the ELF header looking for ELF
notes, and when it finds a "QEMU" note string:
if (STREQ(name, "QEMU")) {
qemu_memory_dump = TRUE;
break;
}
it ends up returning TRUE back to is_netdump(), which sets the
QEMU_MEM_DUMP flag.
But then later on, is_netdump() calls either dump_Elf32_Nhdr()
or dump_Elf64_Nhdr for every ELF note. And in those two functions
you've added this:
qemu_info = STRNEQ(buf, "QEMU");
in order to decide whether to display the register data.
But given that you are again just checking for the "QEMU" string in
those two functions above, then check_elf_note() is completely
unnecessary. Just set the QEMU_MEM_DUMP flag in those two locations
in dump_Elf32_Nhdr() and dump_Elf64_Nhdr() -- that's what those two
function are there for.
And lastly, the output of "crash -d1" and "help -n" is really kind
of ugly. Plus this looks to be a bug in both dump_Elf32_Nhdr()
and dump_Elf64_Nhdr() where you've got:
if (CRASHDEBUG(1) & qemu_info) {
It should be "&&" so that "help -n" does not display the register
data unless CRASHDEBUG(x) is turned on.
But speaking to the "ugliness" issue, it really is confusing to
see the "normal" PT_NOTE raw data display interspersed with your
new QEMU register translation.
How about separating it into a unique display? Maybe something
like "help -q" could do something like:
crash> help q
CPU 0:
<register data>
CPU 1:
<register data>
...
Thanks,
Dave
More information about the Crash-utility
mailing list