[PATCH v4 11/11] kexec: Add option to get crash kernel region size

Daniel Kiper daniel.kiper at oracle.com
Tue Feb 14 14:34:21 PST 2017


On Tue, Feb 14, 2017 at 03:09:23PM -0600, Eric DeVolder wrote:
> From: Daniel Kiper <daniel.kiper at oracle.com>
>
> Crash kernel region size is available via sysfs on Linux running on
> bare metal. However, this does not work when Linux runs as Xen dom0.
> In this case Xen crash kernel region size should be established using
> __HYPERVISOR_kexec_op hypercall (Linux kernel kexec functionality does
> not make a lot of sense in Xen dom0). Sadly hypercalls are not easily
> accessible using shell scripts or something like that. Potentially we
> can check "xl dmesg" output for crashkernel option but this is not nice.
> So, let's add this functionality, for Linux running on bare metal and
> as Xen dom0, to kexec-tools. This way kdump scripts may establish crash
> kernel region size in one way regardless of platform. All burden of
> platform detection lies on kexec-tools.
>
> Figure (and unit) displayed by this new kexec-tools functionality is
> the same as one taken from /sys/kernel/kexec_crash_size.
>
> Signed-off-by: Daniel Kiper <daniel.kiper at oracle.com>
> Signed-off-by: Eric DeVolder <eric.devolder at oracle.com>
> Reviewed-by: Daniel Kiper <daniel.kiper at oracle.com>
> ---
> v4: Incorporated feedback:
>     - changes for coding convention and formatting
>     - Changed commit description to make it clear that
>       get_crash_kernel_load_range() is a stub on some archs
> v3: Incorporated feedback:
>     - changes for coding convention and formatting
>     - restructured to introduce get_crash_kernel_load_range() for each
>       architecture, and then a single function in kexec/kexec.c to call
>       the per-architecture get_crash_kernel_load_range() and print the
>       result.
> v2: Incorporated feedback:
>     - utilize the is_crashkernel_mem_reserved() function common in all archs
>     - for ppc and ppc64, utilize device-tree values to print size
>     - for unsupported architectures, print appropriate message
> v1: Posted to kexec-tools mailing list
> ---
>  kexec/kexec.8 |  3 +++
>  kexec/kexec.c | 19 +++++++++++++++++++
>  kexec/kexec.h |  4 +++-
>  3 files changed, 25 insertions(+), 1 deletion(-)
>
> diff --git a/kexec/kexec.8 b/kexec/kexec.8
> index f4b39a6..e0131b4 100644
> --- a/kexec/kexec.8
> +++ b/kexec/kexec.8
> @@ -179,6 +179,9 @@ Load a helper image to jump back to original kernel.
>  .TP
>  .BI \-\-reuseinitrd
>  Reuse initrd from first boot.
> +.TP
> +.BI \-\-print-ckr-size
> +Print crash kernel region size, if available.
>
>
>  .SH SUPPORTED KERNEL FILE TYPES AND OPTIONS
> diff --git a/kexec/kexec.c b/kexec/kexec.c
> index a2ba79d..eccd988 100644
> --- a/kexec/kexec.c
> +++ b/kexec/kexec.c
> @@ -995,6 +995,7 @@ void usage(void)
>  	       "     --mem-max=<addr> Specify the highest memory address to\n"
>  	       "                      load code into.\n"
>  	       "     --reuseinitrd    Reuse initrd from first boot.\n"
> +	       "     --print-ckr-size Print crash kernel region size.\n"
>  	       "     --load-preserve-context Load the new kernel and preserve\n"
>  	       "                      context of current kernel during kexec.\n"
>  	       "     --load-jump-back-helper Load a helper image to jump back\n"
> @@ -1218,6 +1219,21 @@ static int do_kexec_file_load(int fileind, int argc, char **argv,
>  	return ret;
>  }
>
> +static void print_crashkernel_region_size(void)
> +{
> +	uint64_t start = 0, end = 0;
> +
> +	if (is_crashkernel_mem_reserved() &&
> +		get_crash_kernel_load_range(&start, &end)) {

get_crash_kernel_load_range() call should start in the same
column as is_crashkernel_mem_reserved() call starts.

So, we should have:

        if (is_crashkernel_mem_reserved() &&
            get_crash_kernel_load_range(&start, &end)) {

> +			fprintf(stderr, "get_crash_kernel_load_range() failed.\n");
> +			return;

Please just only two tabs.

Daniel



More information about the kexec mailing list