Commit 79365026 authored by Sourabh Jain's avatar Sourabh Jain Committed by Michael Ellerman
Browse files

crash: add a new kexec flag for hotplug support



Commit a72bbec7 ("crash: hotplug support for kexec_load()")
introduced a new kexec flag, `KEXEC_UPDATE_ELFCOREHDR`. Kexec tool uses
this flag to indicate to the kernel that it is safe to modify the
elfcorehdr of the kdump image loaded using the kexec_load system call.

However, it is possible that architectures may need to update kexec
segments other then elfcorehdr. For example, FDT (Flatten Device Tree)
on PowerPC. Introducing a new kexec flag for every new kexec segment
may not be a good solution. Hence, a generic kexec flag bit,
`KEXEC_CRASH_HOTPLUG_SUPPORT`, is introduced to share the CPU/Memory
hotplug support intent between the kexec tool and the kernel for the
kexec_load system call.

Now we have two kexec flags that enables crash hotplug support for
kexec_load system call. First is KEXEC_UPDATE_ELFCOREHDR (only used in
x86), and second is KEXEC_CRASH_HOTPLUG_SUPPORT (for all architectures).

To simplify the process of finding and reporting the crash hotplug
support the following changes are introduced.

1. Define arch specific function to process the kexec flags and
   determine crash hotplug support

2. Rename the @update_elfcorehdr member of struct kimage to
   @hotplug_support and populate it for both kexec_load and
   kexec_file_load syscalls, because architecture can update more than
   one kexec segment

3. Let generic function crash_check_hotplug_support report hotplug
   support for loaded kdump image based on value of @hotplug_support

To bring the x86 crash hotplug support in line with the above points,
the following changes have been made:

- Introduce the arch_crash_hotplug_support function to process kexec
  flags and determine crash hotplug support

- Remove the arch_crash_hotplug_[cpu|memory]_support functions

Signed-off-by: default avatarSourabh Jain <sourabhjain@linux.ibm.com>
Acked-by: default avatarBaoquan He <bhe@redhat.com>
Acked-by: default avatarHari Bathini <hbathini@linux.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://msgid.link/20240326055413.186534-3-sourabhjain@linux.ibm.com
parent 11800571
Loading
Loading
Loading
Loading
+2 −9
Original line number Diff line number Diff line
@@ -210,15 +210,8 @@ extern void kdump_nmi_shootdown_cpus(void);
void arch_crash_handle_hotplug_event(struct kimage *image, void *arg);
#define arch_crash_handle_hotplug_event arch_crash_handle_hotplug_event

#ifdef CONFIG_HOTPLUG_CPU
int arch_crash_hotplug_cpu_support(void);
#define crash_hotplug_cpu_support arch_crash_hotplug_cpu_support
#endif

#ifdef CONFIG_MEMORY_HOTPLUG
int arch_crash_hotplug_memory_support(void);
#define crash_hotplug_memory_support arch_crash_hotplug_memory_support
#endif
int arch_crash_hotplug_support(struct kimage *image, unsigned long kexec_flags);
#define arch_crash_hotplug_support arch_crash_hotplug_support

unsigned int arch_crash_get_elfcorehdr_size(void);
#define crash_get_elfcorehdr_size arch_crash_get_elfcorehdr_size
+17 −11
Original line number Diff line number Diff line
@@ -402,20 +402,26 @@ int crash_load_segments(struct kimage *image)
#undef pr_fmt
#define pr_fmt(fmt) "crash hp: " fmt

/* These functions provide the value for the sysfs crash_hotplug nodes */
#ifdef CONFIG_HOTPLUG_CPU
int arch_crash_hotplug_cpu_support(void)
int arch_crash_hotplug_support(struct kimage *image, unsigned long kexec_flags)
{
	return crash_check_update_elfcorehdr();
}
#endif

#ifdef CONFIG_MEMORY_HOTPLUG
int arch_crash_hotplug_memory_support(void)
{
	return crash_check_update_elfcorehdr();
}
#ifdef CONFIG_KEXEC_FILE
	if (image->file_mode)
		return 1;
#endif
	/*
	 * Initially, crash hotplug support for kexec_load was added
	 * with the KEXEC_UPDATE_ELFCOREHDR flag. Later, this
	 * functionality was expanded to accommodate multiple kexec
	 * segment updates, leading to the introduction of the
	 * KEXEC_CRASH_HOTPLUG_SUPPORT kexec flag bit. Consequently,
	 * when the kexec tool sends either of these flags, it indicates
	 * that the required kexec segment (elfcorehdr) is excluded from
	 * the SHA calculation.
	 */
	return (kexec_flags & KEXEC_UPDATE_ELFCOREHDR ||
		kexec_flags & KEXEC_CRASH_HOTPLUG_SUPPORT);
}

unsigned int arch_crash_get_elfcorehdr_size(void)
{
+1 −1
Original line number Diff line number Diff line
@@ -306,7 +306,7 @@ static ssize_t crash_hotplug_show(struct device *dev,
				     struct device_attribute *attr,
				     char *buf)
{
	return sysfs_emit(buf, "%d\n", crash_hotplug_cpu_support());
	return sysfs_emit(buf, "%d\n", crash_check_hotplug_support());
}
static DEVICE_ATTR_ADMIN_RO(crash_hotplug);
#endif
+1 −1
Original line number Diff line number Diff line
@@ -535,7 +535,7 @@ static DEVICE_ATTR_RW(auto_online_blocks);
static ssize_t crash_hotplug_show(struct device *dev,
				       struct device_attribute *attr, char *buf)
{
	return sysfs_emit(buf, "%d\n", crash_hotplug_memory_support());
	return sysfs_emit(buf, "%d\n", crash_check_hotplug_support());
}
static DEVICE_ATTR_RO(crash_hotplug);
#endif
+6 −7
Original line number Diff line number Diff line
@@ -40,14 +40,13 @@ static inline void arch_kexec_unprotect_crashkres(void) { }
static inline void arch_crash_handle_hotplug_event(struct kimage *image, void *arg) { }
#endif

int crash_check_update_elfcorehdr(void);
int crash_check_hotplug_support(void);

#ifndef crash_hotplug_cpu_support
static inline int crash_hotplug_cpu_support(void) { return 0; }
#endif

#ifndef crash_hotplug_memory_support
static inline int crash_hotplug_memory_support(void) { return 0; }
#ifndef arch_crash_hotplug_support
static inline int arch_crash_hotplug_support(struct kimage *image, unsigned long kexec_flags)
{
	return 0;
}
#endif

#ifndef crash_get_elfcorehdr_size
Loading