diff mbox

[v2] ppc64: fix compressed dump with pseries kernel

Message ID 1470661733-22154-1-git-send-email-lvivier@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Laurent Vivier Aug. 8, 2016, 1:08 p.m. UTC
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

 target-ppc/arch_dump.c | 5 +++++
 1 file changed, 5 insertions(+)

Comments

David Gibson Aug. 9, 2016, 3:09 a.m. UTC | #1
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 mbox

Patch

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;
 }