Message ID | 1470661733-22154-1-git-send-email-lvivier@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Mon, Aug 08, 2016 at 03:08:53PM +0200, Laurent Vivier wrote: > If we don't provide the page size in target-ppc:cpu_get_dump_info(), > the default one (TARGET_PAGE_SIZE, 4KB) is used to create > the compressed dump. It works fine with Macintosh, but not with > pseries as the kernel default page size is 64KB. > > Without this patch, if we generate a compressed dump in the QEMU monitor: > > (qemu) dump-guest-memory -z qemu.dump > > This dump cannot be read by crash: > > # crash vmlinux qemu.dump > ... > WARNING: cannot translate vmemmap kernel virtual addresses: > commands requiring page structure contents will fail > ... > > Page_size is used to determine the dumpfile's block size. The > block size needs to be at least the page size, but a multiple of page > size works fine too. For PPC64, linux supports either 4KB or 64KB software > page size. So we define the page_size to 64KB. > > Signed-off-by: Laurent Vivier <lvivier@redhat.com> > Reviewed-by: Andrew Jones <drjones@redhat.com> > --- > v2: Update commit and source comments about the max page size I've applied this to ppc-for-2.7 for now, since it definitely improves matters. > > target-ppc/arch_dump.c | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/target-ppc/arch_dump.c b/target-ppc/arch_dump.c > index df1fd8c..ea3d1a3 100644 > --- a/target-ppc/arch_dump.c > +++ b/target-ppc/arch_dump.c > @@ -220,6 +220,11 @@ int cpu_get_dump_info(ArchDumpInfo *info, > } else { > info->d_endian = ELFDATA2LSB; > } > + /* 64KB is the max page size for pseries kernel */ > + if (strncmp(object_get_typename(qdev_get_machine()), > + "pseries-", 8) == 0) { > + info->page_size = (1U << 16); > + } However, I think doing this based on machine type actually isn't great. It's entirely plausible that a modern kernel built for Mac would also have 64KiB page size - especially if it's a multiplatform kernel that can run on both Mac and pSeries. Still, that's something we can polish later. > > return 0; > }
diff --git a/target-ppc/arch_dump.c b/target-ppc/arch_dump.c index df1fd8c..ea3d1a3 100644 --- a/target-ppc/arch_dump.c +++ b/target-ppc/arch_dump.c @@ -220,6 +220,11 @@ int cpu_get_dump_info(ArchDumpInfo *info, } else { info->d_endian = ELFDATA2LSB; } + /* 64KB is the max page size for pseries kernel */ + if (strncmp(object_get_typename(qdev_get_machine()), + "pseries-", 8) == 0) { + info->page_size = (1U << 16); + } return 0; }