Kexec Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3 0/3] Enable crash hotplug support on powerpc
@ 2024-07-07 15:24 Sourabh Jain
  2024-07-07 15:24 ` [PATCH v3 1/3] kexec_load: Use new kexec flag for hotplug support Sourabh Jain
                   ` (3 more replies)
  0 siblings, 4 replies; 10+ messages in thread
From: Sourabh Jain @ 2024-07-07 15:24 UTC (permalink / raw)
  To: kexec
  Cc: Sourabh Jain, Aditya Gupta, Baoquan He, Coiby Xu, Hari Bathini,
	Mahesh Salgaonkar, Simon Horman

The primary goal of this patch series is to enable crash hotplug on
powerpc architecture for the `kexec_load` system call.

The first patch in the series introduces a new kexec flag added in the
kernel to generalize crash hotplug support. The second patch enables
crash hotplug support on PowerPC for `kexec_load` system call. The third
patch updates the documentation about crash hotplug support.

Changes log:

v4:
  - Do not remove the KEXEC_UPDATE_ELFCOREHDR kexec flag. It is needed to
    maintain backward compatibility on x86. 1/3
  - Send the KEXEC_UPDATE_ELFCOREHDR kexec flag for x86, and for the rest
    of the architectures, send KEXEC_CRASH_HOTPLUG_SUPPORT to enable
    crash hotplug support kexec_load system call. 1/3
  - Since there is a significant change in 1/3, hence Hari's Acked-by
    is removed form only first patch. 1/3
  - Rename and reorder the function arch_do_exclude_segment() parameters
    as suggested. 1/3
  - Keep the implementation of arch_do_exclude_segment() function same
    for x86_64 and i386. 1/3

v3:
  https://lists.infradead.org/pipermail/kexec/2024-July/030361.html
  - Updated --hotplug option description 3/3

v2:
  https://lists.infradead.org/pipermail/kexec/2024-June/030309.html
  - Find CPUs in the system using the /sys/devices/system/cpu/present sysfs
    instead of traversing all nodes under /proc/device-tree/cpus. 2/3
  - Added a new function to find present CPUs in the system. 2/3
  - Removed unnecessary NULL check on seg_ptr from arch_do_exclude_segment(). 2/3
  - Updated --hotplug option description 3/3

v1:
  https://lists.infradead.org/pipermail/kexec/2024-May/030051.html


Cc: Aditya Gupta <adityag@linux.ibm.com>
Cc: Baoquan He <bhe@redhat.com>
Cc: Coiby Xu <coxu@redhat.com>
Cc: Hari Bathini <hbathini@linux.ibm.com>
Cc: Mahesh Salgaonkar <mahesh@linux.ibm.com>
Cc: Simon Horman <horms@kernel.org>
Cc: Sourabh Jain <sourabhjain@linux.ibm.com>

Sourabh Jain (3):
  kexec_load: Use new kexec flag for hotplug support
  powerpc/kexec_load: add hotplug support
  doc/hotplug: update man and --help

 kexec/arch/arm/kexec-arm.c             |   5 +
 kexec/arch/arm64/kexec-arm64.c         |   5 +
 kexec/arch/cris/kexec-cris.c           |   4 +
 kexec/arch/hppa/kexec-hppa.c           |   5 +
 kexec/arch/i386/kexec-x86.c            |   8 +
 kexec/arch/ia64/kexec-ia64.c           |   4 +
 kexec/arch/loongarch/kexec-loongarch.c |   5 +
 kexec/arch/m68k/kexec-m68k.c           |   5 +
 kexec/arch/mips/kexec-mips.c           |   4 +
 kexec/arch/ppc/kexec-ppc.c             |   4 +
 kexec/arch/ppc64/crashdump-ppc64.c     |  16 +-
 kexec/arch/ppc64/fdt.c                 | 236 ++++++++++++++++++++++++-
 kexec/arch/ppc64/include/arch/fdt.h    |   2 +-
 kexec/arch/ppc64/kexec-elf-ppc64.c     |   2 +-
 kexec/arch/ppc64/kexec-ppc64.c         |  12 ++
 kexec/arch/s390/kexec-s390.c           |   5 +
 kexec/arch/sh/kexec-sh.c               |   5 +
 kexec/arch/x86_64/kexec-x86_64.c       |   8 +
 kexec/kexec-syscall.h                  |   1 +
 kexec/kexec.8                          |   8 +-
 kexec/kexec.c                          |  44 ++++-
 kexec/kexec.h                          |   2 +
 22 files changed, 373 insertions(+), 17 deletions(-)

-- 
2.45.1


_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH v3 1/3] kexec_load: Use new kexec flag for hotplug support
  2024-07-07 15:24 [PATCH v3 0/3] Enable crash hotplug support on powerpc Sourabh Jain
@ 2024-07-07 15:24 ` Sourabh Jain
  2024-07-08  1:39   ` Baoquan He
  2024-07-08 10:30   ` Baoquan He
  2024-07-07 15:24 ` [PATCH v3 2/3] powerpc/kexec_load: add " Sourabh Jain
                   ` (2 subsequent siblings)
  3 siblings, 2 replies; 10+ messages in thread
From: Sourabh Jain @ 2024-07-07 15:24 UTC (permalink / raw)
  To: kexec
  Cc: Sourabh Jain, Aditya Gupta, Baoquan He, Coiby Xu, Hari Bathini,
	Mahesh Salgaonkar, Simon Horman

Kernel commit 79365026f869 (crash: add a new kexec flag for hotplug
support) has introduced a new kexec flag to generalize hotplug support.
The newly introduced kexec flags for hotplug allow architectures to
exclude all the required kexec segments from SHA calculation so that
the kernel can update them on hotplug events. This was not possible
earlier with the KEXEC_UPDATE_ELFCOREHDR kexec flags since it was added
only for the elfcorehdr segment.

To enable architectures to control the list of kexec segments to exclude
when hotplug support is enabled, add a new architecture-specific
function named arch_do_exclude_segment. During the SHA calculation, this
function gets called to let the architecture decide whether a specific
kexec segment should be considered for SHA calculation or not.

Note: To avoid breaking backward compatibility, the new kexec flag
KEXEC_CRASH_HOTPLUG_SUPPORT is not used for x86 for now.

Cc: Aditya Gupta <adityag@linux.ibm.com>
Cc: Baoquan He <bhe@redhat.com>
Cc: Coiby Xu <coxu@redhat.com>
Cc: Hari Bathini <hbathini@linux.ibm.com>
Cc: Mahesh Salgaonkar <mahesh@linux.ibm.com>
Cc: Simon Horman <horms@kernel.org>
Signed-off-by: Sourabh Jain <sourabhjain@linux.ibm.com>
---
 kexec/arch/arm/kexec-arm.c             |  5 ++++
 kexec/arch/arm64/kexec-arm64.c         |  5 ++++
 kexec/arch/cris/kexec-cris.c           |  4 +++
 kexec/arch/hppa/kexec-hppa.c           |  5 ++++
 kexec/arch/i386/kexec-x86.c            |  8 ++++++
 kexec/arch/ia64/kexec-ia64.c           |  4 +++
 kexec/arch/loongarch/kexec-loongarch.c |  5 ++++
 kexec/arch/m68k/kexec-m68k.c           |  5 ++++
 kexec/arch/mips/kexec-mips.c           |  4 +++
 kexec/arch/ppc/kexec-ppc.c             |  4 +++
 kexec/arch/ppc64/kexec-ppc64.c         |  5 ++++
 kexec/arch/s390/kexec-s390.c           |  5 ++++
 kexec/arch/sh/kexec-sh.c               |  5 ++++
 kexec/arch/x86_64/kexec-x86_64.c       |  8 ++++++
 kexec/kexec-syscall.h                  |  1 +
 kexec/kexec.c                          | 40 ++++++++++++++++++++++----
 kexec/kexec.h                          |  2 ++
 17 files changed, 109 insertions(+), 6 deletions(-)

diff --git a/kexec/arch/arm/kexec-arm.c b/kexec/arch/arm/kexec-arm.c
index 49f35b1..4216327 100644
--- a/kexec/arch/arm/kexec-arm.c
+++ b/kexec/arch/arm/kexec-arm.c
@@ -148,3 +148,8 @@ int have_sysfs_fdt(void)
 {
 	return !access(SYSFS_FDT, F_OK);
 }
+
+int arch_do_exclude_segment(struct kexec_info *UNUSED(info), struct kexec_segment *UNUSED(segment))
+{
+	return 0;
+}
diff --git a/kexec/arch/arm64/kexec-arm64.c b/kexec/arch/arm64/kexec-arm64.c
index 4a67b0d..55e822b 100644
--- a/kexec/arch/arm64/kexec-arm64.c
+++ b/kexec/arch/arm64/kexec-arm64.c
@@ -1363,3 +1363,8 @@ void arch_reuse_initrd(void)
 void arch_update_purgatory(struct kexec_info *UNUSED(info))
 {
 }
+
+int arch_do_exclude_segment(struct kexec_info *UNUSED(info), struct kexec_segment *UNUSED(segment))
+{
+	return 0;
+}
diff --git a/kexec/arch/cris/kexec-cris.c b/kexec/arch/cris/kexec-cris.c
index 3b69709..6d048d3 100644
--- a/kexec/arch/cris/kexec-cris.c
+++ b/kexec/arch/cris/kexec-cris.c
@@ -109,3 +109,7 @@ unsigned long add_buffer(struct kexec_info *info, const void *buf,
                                     buf_min, buf_max, buf_end, 1);
 }
 
+int arch_do_exclude_segment(struct kexec_info *UNUSED(info), struct kexec_segment *UNUSED(segment))
+{
+	return 0;
+}
diff --git a/kexec/arch/hppa/kexec-hppa.c b/kexec/arch/hppa/kexec-hppa.c
index 77c9739..b2c74ab 100644
--- a/kexec/arch/hppa/kexec-hppa.c
+++ b/kexec/arch/hppa/kexec-hppa.c
@@ -146,3 +146,8 @@ unsigned long virt_to_phys(unsigned long addr)
 {
 	return addr - phys_offset;
 }
+
+int arch_do_exclude_segment(struct kexec_info *UNUSED(info), struct kexec_segment *UNUSED(segment))
+{
+	return 0;
+}
diff --git a/kexec/arch/i386/kexec-x86.c b/kexec/arch/i386/kexec-x86.c
index 444cb69..eac01e5 100644
--- a/kexec/arch/i386/kexec-x86.c
+++ b/kexec/arch/i386/kexec-x86.c
@@ -208,3 +208,11 @@ void arch_update_purgatory(struct kexec_info *info)
 	elf_rel_set_symbol(&info->rhdr, "panic_kernel",
 		&panic_kernel, sizeof(panic_kernel));
 }
+
+int arch_do_exclude_segment(struct kexec_info *info, struct kexec_segment *segment)
+{
+	if (info->elfcorehdr == (unsigned long) segment->mem)
+		return 1;
+
+	return 0;
+}
diff --git a/kexec/arch/ia64/kexec-ia64.c b/kexec/arch/ia64/kexec-ia64.c
index 418d997..548a3af 100644
--- a/kexec/arch/ia64/kexec-ia64.c
+++ b/kexec/arch/ia64/kexec-ia64.c
@@ -245,3 +245,7 @@ void arch_update_purgatory(struct kexec_info *UNUSED(info))
 {
 }
 
+int arch_do_exclude_segment(struct kexec_info *UNUSED(info), struct kexec_segment *UNUSED(segment))
+{
+	return 0;
+}
diff --git a/kexec/arch/loongarch/kexec-loongarch.c b/kexec/arch/loongarch/kexec-loongarch.c
index ac75030..ea0c316 100644
--- a/kexec/arch/loongarch/kexec-loongarch.c
+++ b/kexec/arch/loongarch/kexec-loongarch.c
@@ -381,3 +381,8 @@ unsigned long add_buffer(struct kexec_info *info, const void *buf,
 	return add_buffer_phys_virt(info, buf, bufsz, memsz, buf_align,
 				    buf_min, buf_max, buf_end, 1);
 }
+
+int arch_do_exclude_segment(struct kexec_info *UNUSED(info), struct kexec_segment *UNUSED(segment))
+{
+	return 0;
+}
diff --git a/kexec/arch/m68k/kexec-m68k.c b/kexec/arch/m68k/kexec-m68k.c
index cb54927..4824a02 100644
--- a/kexec/arch/m68k/kexec-m68k.c
+++ b/kexec/arch/m68k/kexec-m68k.c
@@ -108,3 +108,8 @@ void add_segment(struct kexec_info *info, const void *buf, size_t bufsz,
 {
 	add_segment_phys_virt(info, buf, bufsz, base, memsz, 1);
 }
+
+int arch_do_exclude_segment(struct kexec_info *UNUSED(info), struct kexec_segment *UNUSED(segment))
+{
+	return 0;
+}
diff --git a/kexec/arch/mips/kexec-mips.c b/kexec/arch/mips/kexec-mips.c
index d8cbea8..fb5a5d4 100644
--- a/kexec/arch/mips/kexec-mips.c
+++ b/kexec/arch/mips/kexec-mips.c
@@ -189,3 +189,7 @@ unsigned long add_buffer(struct kexec_info *info, const void *buf,
 				    buf_min, buf_max, buf_end, 1);
 }
 
+int arch_do_exclude_segment(struct kexec_info *UNUSED(info), struct kexec_segment *UNUSED(segment))
+{
+	return 0;
+}
diff --git a/kexec/arch/ppc/kexec-ppc.c b/kexec/arch/ppc/kexec-ppc.c
index 03bec36..d3dad0f 100644
--- a/kexec/arch/ppc/kexec-ppc.c
+++ b/kexec/arch/ppc/kexec-ppc.c
@@ -966,3 +966,7 @@ void arch_update_purgatory(struct kexec_info *UNUSED(info))
 {
 }
 
+int arch_do_exclude_segment(struct kexec_info *UNUSED(info), struct kexec_segment *UNUSED(segment))
+{
+	return 0;
+}
diff --git a/kexec/arch/ppc64/kexec-ppc64.c b/kexec/arch/ppc64/kexec-ppc64.c
index bd5274c..90734fe 100644
--- a/kexec/arch/ppc64/kexec-ppc64.c
+++ b/kexec/arch/ppc64/kexec-ppc64.c
@@ -967,3 +967,8 @@ int arch_compat_trampoline(struct kexec_info *UNUSED(info))
 void arch_update_purgatory(struct kexec_info *UNUSED(info))
 {
 }
+
+int arch_do_exclude_segment(struct kexec_info *UNUSED(info), struct kexec_segment *UNUSED(segment))
+{
+	return 0;
+}
diff --git a/kexec/arch/s390/kexec-s390.c b/kexec/arch/s390/kexec-s390.c
index 33ba6b9..f4dd7dc 100644
--- a/kexec/arch/s390/kexec-s390.c
+++ b/kexec/arch/s390/kexec-s390.c
@@ -267,3 +267,8 @@ int get_crash_kernel_load_range(uint64_t *start, uint64_t *end)
 {
 	return parse_iomem_single("Crash kernel\n", start, end);
 }
+
+int arch_do_exclude_segment(struct kexec_info *UNUSED(info), struct kexec_segment *UNUSED(segment))
+{
+	return 0;
+}
diff --git a/kexec/arch/sh/kexec-sh.c b/kexec/arch/sh/kexec-sh.c
index ce341c8..7b9ac1c 100644
--- a/kexec/arch/sh/kexec-sh.c
+++ b/kexec/arch/sh/kexec-sh.c
@@ -257,3 +257,8 @@ unsigned long add_buffer(struct kexec_info *info, const void *buf,
 	return add_buffer_phys_virt(info, buf, bufsz, memsz, buf_align,
 				    buf_min, buf_max, buf_end, 1);
 }
+
+int arch_do_exclude_segment(struct kexec_info *UNUSED(info), struct kexec_segment *UNUSED(segment))
+{
+	return 0;
+}
diff --git a/kexec/arch/x86_64/kexec-x86_64.c b/kexec/arch/x86_64/kexec-x86_64.c
index ffd84f0..7b2453f 100644
--- a/kexec/arch/x86_64/kexec-x86_64.c
+++ b/kexec/arch/x86_64/kexec-x86_64.c
@@ -188,3 +188,11 @@ void arch_update_purgatory(struct kexec_info *info)
 	elf_rel_set_symbol(&info->rhdr, "panic_kernel",
 				&panic_kernel, sizeof(panic_kernel));
 }
+
+int arch_do_exclude_segment(struct kexec_info *info, struct kexec_segment *segment)
+{
+	if (info->elfcorehdr == (unsigned long) segment->mem)
+		return 1;
+
+	return 0;
+}
diff --git a/kexec/kexec-syscall.h b/kexec/kexec-syscall.h
index 73e5254..cc32c01 100644
--- a/kexec/kexec-syscall.h
+++ b/kexec/kexec-syscall.h
@@ -113,6 +113,7 @@ static inline long kexec_file_load(int kernel_fd, int initrd_fd,
 #define KEXEC_ON_CRASH		0x00000001
 #define KEXEC_PRESERVE_CONTEXT	0x00000002
 #define KEXEC_UPDATE_ELFCOREHDR	0x00000004
+#define KEXEC_CRASH_HOTPLUG_SUPPORT	0x00000008
 #define KEXEC_ARCH_MASK		0xffff0000
 
 /* Flags for kexec file based system call */
diff --git a/kexec/kexec.c b/kexec/kexec.c
index 222f79e..59be075 100644
--- a/kexec/kexec.c
+++ b/kexec/kexec.c
@@ -701,10 +701,13 @@ static void update_purgatory(struct kexec_info *info)
 			continue;
 		}
 
-		/* Don't include elfcorehdr in the checksum, if hotplug
-		 * support enabled.
+		/*
+		 * Let architecture decide which segments to exclude from checksum
+		 * if hotplug support is enabled.
 		 */
-		if (do_hotplug && (info->segment[i].mem == (void *)info->elfcorehdr)) {
+		if (do_hotplug && arch_do_exclude_segment(info, &info->segment[i])) {
+			dbgprintf("Skipping segment mem: 0x%lx from SHA calculation\n",
+				  (unsigned long)info->segment[i].mem);
 			continue;
 		}
 
@@ -1419,6 +1422,30 @@ static int do_kexec_file_load(int fileind, int argc, char **argv,
 	return ret;
 }
 
+/*
+ * Hotplug support for x86 in the kernel was added with the
+ * `KEXEC_UPDATE_ELFCOREHDR` kexec bit, and later it was generalized
+ * with the `KEXEC_CRASH_HOTPLUG_SUPPORT` kexec bit.
+ *
+ * Passing the `KEXEC_CRASH_HOTPLUG_SUPPORT` kexec bit to kernel
+ * versions 6.5 to 6.9 on x86 with the `kexec_load` system call will
+ * fail with `-EINVAL`.
+ *
+ * So for now, pass `KEXEC_UPDATE_ELFCOREHDR` for x86, and for other
+ * architectures, use the `KEXEC_CRASH_HOTPLUG_SUPPORT` kexec bit. But
+ * in the future, we can decide to get rid of `KEXEC_UPDATE_ELFCOREHDR`.
+ *
+ * NOTE: Xen KEXEC_LIVE_UPDATE and KEXEC_UPDATE_ELFCOREHDR collide
+ */
+static inline unsigned long get_hotplug_kexec_flag(void)
+{
+#if defined(__i386__) || defined(__x86_64__)
+		return KEXEC_UPDATE_ELFCOREHDR;
+#else
+		return KEXEC_CRASH_HOTPLUG_SUPPORT;
+#endif
+}
+
 static void print_crashkernel_region_size(void)
 {
 	uint64_t start = 0, end = 0;
@@ -1651,7 +1678,6 @@ int main(int argc, char *argv[])
 		die("--load-live-update can only be used with xen\n");
 	}
 
-	/* NOTE: Xen KEXEC_LIVE_UPDATE and KEXEC_UPDATE_ELFCOREHDR collide */
 	if (do_hotplug) {
 		const char *ces = "/sys/kernel/crash_elfcorehdr_size";
 		char *buf, *endptr = NULL;
@@ -1665,8 +1691,10 @@ int main(int argc, char *argv[])
 		if (!elfcorehdrsz || (endptr && *endptr != '\0'))
 			die("Path %s does not exist, the kernel needs CONFIG_CRASH_HOTPLUG\n", ces);
 		dbgprintf("ELFCOREHDR_SIZE %lu\n", elfcorehdrsz);
-		/* Indicate to the kernel it is ok to modify the elfcorehdr */
-		kexec_flags |= KEXEC_UPDATE_ELFCOREHDR;
+		/* Indicate to the kernel it is ok to modify the relevant kexec segments */
+
+		kexec_flags |= get_hotplug_kexec_flag();
+
 	}
 
 	fileind = optind;
diff --git a/kexec/kexec.h b/kexec/kexec.h
index 1004aff..31c323f 100644
--- a/kexec/kexec.h
+++ b/kexec/kexec.h
@@ -307,6 +307,8 @@ extern int do_hotplug;
 #define BOOTLOADER_VERSION PACKAGE_VERSION
 
 void arch_usage(void);
+/* Return non-zero if segment needs to be excluded from SHA calculation, else 0. */
+int arch_do_exclude_segment(struct kexec_info *info, struct kexec_segment *segment);
 int arch_process_options(int argc, char **argv);
 int arch_compat_trampoline(struct kexec_info *info);
 void arch_update_purgatory(struct kexec_info *info);
-- 
2.45.1


_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH v3 2/3] powerpc/kexec_load: add hotplug support
  2024-07-07 15:24 [PATCH v3 0/3] Enable crash hotplug support on powerpc Sourabh Jain
  2024-07-07 15:24 ` [PATCH v3 1/3] kexec_load: Use new kexec flag for hotplug support Sourabh Jain
@ 2024-07-07 15:24 ` Sourabh Jain
  2024-07-07 15:24 ` [PATCH v3 3/3] doc/hotplug: update man and --help Sourabh Jain
  2024-07-09  7:29 ` [PATCH v3 0/3] Enable crash hotplug support on powerpc Simon Horman
  3 siblings, 0 replies; 10+ messages in thread
From: Sourabh Jain @ 2024-07-07 15:24 UTC (permalink / raw)
  To: kexec
  Cc: Sourabh Jain, Aditya Gupta, Baoquan He, Coiby Xu,
	Mahesh Salgaonkar, Simon Horman, Hari Bathini

Kernel commits b741092d5976 ("powerpc/crash: add crash CPU hotplug
support") and 849599b702ef ("powerpc/crash: add crash memory hotplug
support") added crash CPU/Memory hotplug support on PowerPC. This patch
extends that support for the kexec_load syscall.

During CPU/Memory hotplug events on PowerPC, two kexec segments,
elfcorehdr, and FDT, get updated by the kernel. To ensure the kernel
can safely update these two kexec segments for the kdump image loaded
using the kexec_load system call, the following changes are made:

1. Extra size is allocated for both elfcorehdr and FDT to accommodate
   additional resources in the future. For the elfcorehdr, the size hint
   is taken from /sys/kernel/crash_elfcorehdr_size sysfs, while for FDT,
   extra size is allocated to hold possible CPU nodes.

2. Both elfcorehdr and FDT are skipped from SHA calculation.

Cc: Aditya Gupta <adityag@linux.ibm.com>
Cc: Baoquan He <bhe@redhat.com>
Cc: Coiby Xu <coxu@redhat.com>
Cc: Mahesh Salgaonkar <mahesh@linux.ibm.com>
Cc: Simon Horman <horms@kernel.org>
Acked-by: Hari Bathini <hbathini@linux.ibm.com>
Signed-off-by: Sourabh Jain <sourabhjain@linux.ibm.com>
---
 kexec/arch/ppc64/crashdump-ppc64.c  |  16 +-
 kexec/arch/ppc64/fdt.c              | 236 +++++++++++++++++++++++++++-
 kexec/arch/ppc64/include/arch/fdt.h |   2 +-
 kexec/arch/ppc64/kexec-elf-ppc64.c  |   2 +-
 kexec/arch/ppc64/kexec-ppc64.c      |   9 +-
 5 files changed, 258 insertions(+), 7 deletions(-)

diff --git a/kexec/arch/ppc64/crashdump-ppc64.c b/kexec/arch/ppc64/crashdump-ppc64.c
index 6d47898..98d439a 100644
--- a/kexec/arch/ppc64/crashdump-ppc64.c
+++ b/kexec/arch/ppc64/crashdump-ppc64.c
@@ -476,7 +476,7 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
 				uint64_t max_addr, unsigned long min_base)
 {
 	void *tmp;
-	unsigned long sz;
+	unsigned long sz, memsz;
 	uint64_t elfcorehdr;
 	int nr_ranges, align = 1024, i;
 	unsigned long long end;
@@ -531,8 +531,18 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
 		}
 	}
 
-	elfcorehdr = add_buffer(info, tmp, sz, sz, align, min_base,
-				max_addr, 1);
+	memsz = sz;
+	/* To support --hotplug, replace the calculated memsz with the value
+	 * from /sys/kernel/crash_elfcorehdr_size and align it correctly.
+	 */
+	if (do_hotplug) {
+		if (elfcorehdrsz > sz)
+			memsz = _ALIGN(elfcorehdrsz, align);
+	}
+
+	/* Record the location of the elfcorehdr for hotplug handling */
+	info->elfcorehdr = elfcorehdr = add_buffer(info, tmp, sz, memsz, align,
+						   min_base, max_addr, 1);
 	reserve(elfcorehdr, sz);
 	/* modify and store the cmdline in a global array. This is later
 	 * read by flatten_device_tree and modified if required
diff --git a/kexec/arch/ppc64/fdt.c b/kexec/arch/ppc64/fdt.c
index 8bc6d2d..879240f 100644
--- a/kexec/arch/ppc64/fdt.c
+++ b/kexec/arch/ppc64/fdt.c
@@ -17,6 +17,13 @@
 #include <libfdt.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <limits.h>
+#include <stdbool.h>
+#include <dirent.h>
+#include <sys/stat.h>
+
+#include "../../kexec.h"
+#include "../../kexec-syscall.h"
 
 /*
  * Let the kernel know it booted from kexec, as some things (e.g.
@@ -46,17 +53,244 @@ static int fixup_kexec_prop(void *fdt)
 	return 0;
 }
 
+static inline bool is_dot_dir(char * d_path)
+{
+	return d_path[0] == '.';
+}
+
+/*
+ * get_cpu_node_size - Returns size of files including file name size under
+ *                     the given @cpu_node_path.
+ */
+static int get_cpu_node_size(char *cpu_node_path)
+{
+	DIR *d;
+	struct dirent *de;
+	struct stat statbuf;
+	int cpu_node_size = 0;
+	char cpu_prop_path[2 * PATH_MAX];
+
+	d = opendir(cpu_node_path);
+	if (!d)
+		return 0;
+
+	while ((de = readdir(d)) != NULL) {
+		if (de->d_type != DT_REG)
+			continue;
+
+		memset(cpu_prop_path, '\0', PATH_MAX);
+		snprintf(cpu_prop_path, 2 * PATH_MAX, "%s/%s", cpu_node_path,
+			 de->d_name);
+
+		if (stat(cpu_prop_path, &statbuf))
+			continue;
+
+		cpu_node_size += statbuf.st_size;
+		cpu_node_size += strlen(de->d_name);
+	}
+
+	return cpu_node_size;
+}
+
+/*
+ * is_cpu_node - Checks if the node specified by the given @path
+ *               represents a CPU node.
+ *
+ * Returns true if the @path has a "device_type" file containing "cpu";
+ * otherwise, returns false.
+ */
+static bool is_cpu_node(char *path)
+{
+	FILE *file;
+	bool ret = false;
+	char device_type[4];
+
+	file = fopen(path, "r");
+	if (!file)
+		return false;
+
+	memset(device_type, '\0', 4);
+	if (fread(device_type, 1, 3, file) < 3)
+		goto out;
+
+	if (strcmp(device_type, "cpu"))
+		goto out;
+
+	ret = true;
+out:
+	fclose(file);
+	return ret;
+}
+
+static int get_threads_per_cpu(char *path)
+{
+	struct stat statbuf;
+	if (stat(path, &statbuf))
+		return 0;
+
+	return statbuf.st_size / 4;
+}
+
+/**
+ * get_present_cpus - finds the present CPUs in the system
+ *
+ * This function opens the file `/sys/devices/system/cpu/present` to read
+ * the range of present CPUs. It parses the range and calculates the
+ * total number of present CPUs in the system.
+ *
+ * Returns total number of present CPUs on success, -1 on failure.
+ */
+static int get_present_cpus()
+{
+	char *range;
+	char buf[1024];
+	int start, end;
+	int cpu_count = 0;
+	FILE *file = fopen("/sys/devices/system/cpu/present", "r");
+
+	if (!file)
+		return -1;
+
+	if (!fgets(buf, sizeof(buf), file))
+		return -1;
+
+	fclose(file);
+
+	range = strtok(buf, ",");
+	while (range != NULL) {
+		if (sscanf(range, "%d-%d", &start, &end) == 2) {
+			for (int i = start; i <= end; i++)
+				cpu_count++;
+		} else if (sscanf(range, "%d", &start) == 1) {
+			cpu_count++;
+		} else {
+			return -1;
+		}
+		range = strtok(NULL, ",");
+	}
+
+	return cpu_count;
+}
+
+/*
+ * get_cpu_info - Finds the following CPU attributes:
+ *
+ * threads_per_cpu: Number of threads per CPU, based on the device tree entry
+ *                  /proc/device-tree/cpus/<cpu_node>/ibm,ppc-interrupt-server#s.
+ * cpu_node_size: Size of files including file name size under a CPU node.
+ *
+ * Returns 0 on success, else -1.
+ */
+static int get_cpu_info(int *_present_cpus, int *_threads_per_cpu, int *_cpu_node_size)
+{
+	DIR *d;
+	struct dirent *de;
+	char path[PATH_MAX];
+	int present_cpus = 0, threads_per_cpu = 0, cpu_node_size = 0;
+	char *cpus_node_path = "/proc/device-tree/cpus";
+
+	present_cpus = get_present_cpus();
+	if (present_cpus < 0)
+		return -1;
+
+	d = opendir(cpus_node_path);
+	if (!d)
+		return -1;
+
+	while ((de = readdir(d)) != NULL) {
+		if ((de->d_type != DT_DIR) || is_dot_dir(de->d_name))
+			continue;
+
+		memset(path, '\0', PATH_MAX);
+		snprintf(path, PATH_MAX, "%s/%s/%s", cpus_node_path,
+			 de->d_name, "device_type");
+
+		/* Skip nodes with device_type != "cpu" */
+		if (!is_cpu_node(path))
+			continue;
+
+		/*
+		 * Found the first node under /proc/device-tree/cpus with
+		 * device_type == "cpu"
+		 */
+		memset(path, '\0', PATH_MAX);
+		snprintf(path, PATH_MAX, "%s/%s", cpus_node_path, de->d_name);
+		cpu_node_size = get_cpu_node_size(path);
+
+		memset(path, '\0', PATH_MAX);
+		snprintf(path, PATH_MAX, "%s/%s/%s", cpus_node_path,
+		de->d_name, "ibm,ppc-interrupt-server#s");
+		threads_per_cpu = get_threads_per_cpu(path);
+		break;
+	}
+
+	closedir(d);
+
+	if (!(threads_per_cpu && cpu_node_size))
+		return -1;
+
+	*_present_cpus = present_cpus;
+	*_cpu_node_size = cpu_node_size;
+	*_threads_per_cpu = threads_per_cpu;
+
+	dbgprintf("present_cpus: %d, threads_per_cpu: %d, cpu_node_size: %d\n",
+		  present_cpus, threads_per_cpu, cpu_node_size);
+
+	return 0;
+}
+
+/*
+ * kdump_fdt_extra_size - Calculates the extra size needed for the Flattened
+ *                        Device Tree (FDT) based on the possible and present
+ *                        CPUs in the system.
+ */
+static unsigned int kdump_fdt_extra_size(void)
+{
+	int cpus_in_system;
+	unsigned int extra_size = 0;
+	int present_cpus = 0, threads_per_cpu = 0, cpu_node_size = 0;
+	int possible_cpus;
+
+	/* ALL possible CPUs are present in FDT so no extra size required */
+	if (sysconf(_SC_NPROCESSORS_ONLN) == sysconf(_SC_NPROCESSORS_CONF))
+		return 0;
+
+	if (get_cpu_info(&present_cpus, &threads_per_cpu, &cpu_node_size)) {
+		die("Failed to get cpu info\n");
+	}
+
+	cpus_in_system = present_cpus / threads_per_cpu;
+	possible_cpus = sysconf(_SC_NPROCESSORS_CONF) / threads_per_cpu;
+	dbgprintf("cpus_in_system: %d, possible_cpus: %d\n", cpus_in_system,
+		  possible_cpus);
+
+	if (cpus_in_system > possible_cpus)
+		die("Possible CPU nodes can't be less than active CPU nodes\n");
+
+	extra_size = (possible_cpus - cpus_in_system) * cpu_node_size;
+	dbgprintf("kdump fdt extra size: %u\n", extra_size);
+
+	return extra_size;
+}
 
 /*
  * For now, assume that the added content fits in the file.
  * This should be the case when flattening from /proc/device-tree,
  * and when passing in a dtb, dtc can be told to add padding.
  */
-int fixup_dt(char **fdt, off_t *size)
+int fixup_dt(char **fdt, off_t *size, unsigned long kexec_flags)
 {
 	int ret;
 
 	*size += 4096;
+
+	/* To support --hotplug option for the kexec_load syscall, consider
+	 * adding extra buffer to FDT so that the kernel can add CPU nodes
+	 * of hot-added CPUs.
+	 */
+	if (do_hotplug && (kexec_flags & KEXEC_ON_CRASH))
+		*size += kdump_fdt_extra_size();
+
 	*fdt = realloc(*fdt, *size);
 	if (!*fdt) {
 		fprintf(stderr, "%s: out of memory\n", __func__);
diff --git a/kexec/arch/ppc64/include/arch/fdt.h b/kexec/arch/ppc64/include/arch/fdt.h
index b19f185..5f340b0 100644
--- a/kexec/arch/ppc64/include/arch/fdt.h
+++ b/kexec/arch/ppc64/include/arch/fdt.h
@@ -3,6 +3,6 @@
 
 #include <sys/types.h>
 
-int fixup_dt(char **fdt, off_t *size);
+int fixup_dt(char **fdt, off_t *size, unsigned long kexec_flags);
 
 #endif
diff --git a/kexec/arch/ppc64/kexec-elf-ppc64.c b/kexec/arch/ppc64/kexec-elf-ppc64.c
index bdcfd20..858c994 100644
--- a/kexec/arch/ppc64/kexec-elf-ppc64.c
+++ b/kexec/arch/ppc64/kexec-elf-ppc64.c
@@ -345,7 +345,7 @@ int elf_ppc64_load(int argc, char **argv, const char *buf, off_t len,
 		create_flatten_tree(&seg_buf, &seg_size, cmdline);
 	}
 
-	result = fixup_dt(&seg_buf, &seg_size);
+	result = fixup_dt(&seg_buf, &seg_size, info->kexec_flags);
 	if (result < 0)
 		return result;
 
diff --git a/kexec/arch/ppc64/kexec-ppc64.c b/kexec/arch/ppc64/kexec-ppc64.c
index 90734fe..6653246 100644
--- a/kexec/arch/ppc64/kexec-ppc64.c
+++ b/kexec/arch/ppc64/kexec-ppc64.c
@@ -24,6 +24,7 @@
 #include <errno.h>
 #include <stdint.h>
 #include <string.h>
+#include <libfdt.h>
 #include <sys/stat.h>
 #include <sys/types.h>
 #include <dirent.h>
@@ -968,7 +969,13 @@ void arch_update_purgatory(struct kexec_info *UNUSED(info))
 {
 }
 
-int arch_do_exclude_segment(struct kexec_info *UNUSED(info), struct kexec_segment *UNUSED(segment))
+int arch_do_exclude_segment(struct kexec_info *info, struct kexec_segment *segment)
 {
+	if (info->elfcorehdr == (unsigned long) segment->mem)
+		return 1;
+
+	if (segment->buf && fdt_magic(segment->buf) == FDT_MAGIC)
+		return 1;
+
 	return 0;
 }
-- 
2.45.1


_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH v3 3/3] doc/hotplug: update man and --help
  2024-07-07 15:24 [PATCH v3 0/3] Enable crash hotplug support on powerpc Sourabh Jain
  2024-07-07 15:24 ` [PATCH v3 1/3] kexec_load: Use new kexec flag for hotplug support Sourabh Jain
  2024-07-07 15:24 ` [PATCH v3 2/3] powerpc/kexec_load: add " Sourabh Jain
@ 2024-07-07 15:24 ` Sourabh Jain
  2024-07-09  7:29 ` [PATCH v3 0/3] Enable crash hotplug support on powerpc Simon Horman
  3 siblings, 0 replies; 10+ messages in thread
From: Sourabh Jain @ 2024-07-07 15:24 UTC (permalink / raw)
  To: kexec
  Cc: Sourabh Jain, Aditya Gupta, Coiby Xu, Mahesh Salgaonkar,
	Simon Horman, Baoquan He, Hari Bathini

Update the man page and --help option to make the description of the
--hotplug option easier to understand.

Cc: Aditya Gupta <adityag@linux.ibm.com>
Cc: Coiby Xu <coxu@redhat.com>
Cc: Mahesh Salgaonkar <mahesh@linux.ibm.com>
Cc: Simon Horman <horms@kernel.org>
Acked-by: Baoquan He <bhe@redhat.com>
Acked-by: Hari Bathini <hbathini@linux.ibm.com>
Signed-off-by: Sourabh Jain <sourabhjain@linux.ibm.com>
---
 kexec/kexec.8 | 8 ++++----
 kexec/kexec.c | 4 +++-
 2 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/kexec/kexec.8 b/kexec/kexec.8
index 9e995fe..793e876 100644
--- a/kexec/kexec.8
+++ b/kexec/kexec.8
@@ -140,10 +140,10 @@ Open a help file for
 .BR kexec .
 .TP
 .B \-\-hotplug
-Setup for kernel modification of the elfcorehdr. This option performs
-the steps needed to support kernel updates to the elfcorehdr in the
-presence of hot un/plug and/or on/offline events. This option only
-useful for KEXEC_LOAD syscall.
+Setup kexec segments such that kernel can safely update them on CPU/Memory
+hot add/remove events. If this option is enabled, kernel does in-kernel
+update of kexec segments on CPU/Memory hot add/remove events, thus avoiding
+the need to reload kdump kernel.
 .TP
 .B \-i\ (\-\-no-checks)
 Fast reboot, no memory integrity checks.
diff --git a/kexec/kexec.c b/kexec/kexec.c
index 59be075..7c614b0 100644
--- a/kexec/kexec.c
+++ b/kexec/kexec.c
@@ -1093,7 +1093,9 @@ void usage(void)
 	       "                      back to the compatibility syscall when file based\n"
 	       "                      syscall is not supported or the kernel did not\n"
 	       "                      understand the image (default)\n"
-	       " --hotplug            Setup for kernel modification of elfcorehdr.\n"
+	       " --hotplug            Do in-kernel update of kexec segments on CPU/Memory\n"
+	       "                      hot add/remove events, avoiding the need to reload\n"
+	       "                      kdump kernel on online/offline events.\n"
 	       " -d, --debug          Enable debugging to help spot a failure.\n"
 	       " -S, --status         Return 1 if the type (by default crash) is loaded,\n"
 	       "                      0 if not.\n"
-- 
2.45.1


_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH v3 1/3] kexec_load: Use new kexec flag for hotplug support
  2024-07-07 15:24 ` [PATCH v3 1/3] kexec_load: Use new kexec flag for hotplug support Sourabh Jain
@ 2024-07-08  1:39   ` Baoquan He
  2024-07-08  7:55     ` Sourabh Jain
  2024-07-08 10:30   ` Baoquan He
  1 sibling, 1 reply; 10+ messages in thread
From: Baoquan He @ 2024-07-08  1:39 UTC (permalink / raw)
  To: Sourabh Jain
  Cc: kexec, Aditya Gupta, Coiby Xu, Hari Bathini, Mahesh Salgaonkar,
	Simon Horman

Hi Sourabh,

On 07/07/24 at 08:54pm, Sourabh Jain wrote:
> Kernel commit 79365026f869 (crash: add a new kexec flag for hotplug
> support) has introduced a new kexec flag to generalize hotplug support.
> The newly introduced kexec flags for hotplug allow architectures to
> exclude all the required kexec segments from SHA calculation so that
> the kernel can update them on hotplug events. This was not possible
> earlier with the KEXEC_UPDATE_ELFCOREHDR kexec flags since it was added
> only for the elfcorehdr segment.
> 
> To enable architectures to control the list of kexec segments to exclude
> when hotplug support is enabled, add a new architecture-specific
> function named arch_do_exclude_segment. During the SHA calculation, this
> function gets called to let the architecture decide whether a specific
> kexec segment should be considered for SHA calculation or not.
> 
> Note: To avoid breaking backward compatibility, the new kexec flag
> KEXEC_CRASH_HOTPLUG_SUPPORT is not used for x86 for now.

For x86, both KEXEC_UPDATE_ELFCOREHDR and KEXEC_CRASH_HOTPLUG_SUPPORT
should be OK for kexec_file_load. Your change will make a difference
between kexec_load and kexec_file_load. But I agree with you on the
backward cmpatibility with KEXEC_CRASH_HOTPLUG_SUPPORT flag.

Anyway, if it's in a hurry to catch up with Simon's new release, this is
fine, we can change it later. Otherwise, we may be better to remove the
difference, namely, not making x86 only be able to accept
KEXEC_UPDATE_ELFCOREHDR flag on kexec_load. My personal opinion.


_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v3 1/3] kexec_load: Use new kexec flag for hotplug support
  2024-07-08  1:39   ` Baoquan He
@ 2024-07-08  7:55     ` Sourabh Jain
  2024-07-08 10:27       ` Baoquan He
  0 siblings, 1 reply; 10+ messages in thread
From: Sourabh Jain @ 2024-07-08  7:55 UTC (permalink / raw)
  To: Baoquan He
  Cc: kexec, Aditya Gupta, Coiby Xu, Hari Bathini, Mahesh Salgaonkar,
	Simon Horman

Hello Baoquan,

On 08/07/24 07:09, Baoquan He wrote:
> Hi Sourabh,
>
> On 07/07/24 at 08:54pm, Sourabh Jain wrote:
>> Kernel commit 79365026f869 (crash: add a new kexec flag for hotplug
>> support) has introduced a new kexec flag to generalize hotplug support.
>> The newly introduced kexec flags for hotplug allow architectures to
>> exclude all the required kexec segments from SHA calculation so that
>> the kernel can update them on hotplug events. This was not possible
>> earlier with the KEXEC_UPDATE_ELFCOREHDR kexec flags since it was added
>> only for the elfcorehdr segment.
>>
>> To enable architectures to control the list of kexec segments to exclude
>> when hotplug support is enabled, add a new architecture-specific
>> function named arch_do_exclude_segment. During the SHA calculation, this
>> function gets called to let the architecture decide whether a specific
>> kexec segment should be considered for SHA calculation or not.
>>
>> Note: To avoid breaking backward compatibility, the new kexec flag
>> KEXEC_CRASH_HOTPLUG_SUPPORT is not used for x86 for now.
> For x86, both KEXEC_UPDATE_ELFCOREHDR and KEXEC_CRASH_HOTPLUG_SUPPORT
> should be OK for kexec_file_load.

Do we even need these flags for kexec_file_load at all?
My understanding is that these flags are only needed for the kexec_load 
system call.


> Your change will make a difference
> between kexec_load and kexec_file_load.

I am confused by the above statement.

Given that we don't even send any of the above flags for 
kexec_file_load, I am not
sure how these changes make a difference between the two system calls.

> But I agree with you on the
> backward cmpatibility with KEXEC_CRASH_HOTPLUG_SUPPORT flag.
>
> Anyway, if it's in a hurry to catch up with Simon's new release, this is
> fine, we can change it later.

It would be great if we could consider this patch series for the next 
release, but not at
the cost of breaking any backward compatibility for x86. If you think 
these changes are
breaking anything for any kernel version, I would prefer to update my 
patch series.

> Otherwise, we may be better to remove the
> difference, namely, not making x86 only be able to accept
> KEXEC_UPDATE_ELFCOREHDR flag on kexec_load. My personal opinion

On x86, passing the KEXEC_CRASH_HOTPLUG_SUPPORT kexec bit to kernel 
versions 6.5 to 6.9
with the kexec_load system call will fail with -EINVAL. However, from 
kernel 6.10 onward,
both KEXEC_UPDATE_ELFCOREHDR and KEXEC_CRASH_HOTPLUG_SUPPORT kexec bits 
are acceptable for x86.

My proposal is to use KEXEC_UPDATE_ELFCOREHDR on x86 for some time 
(maybe a couple of kernel releases),
and eventually switch to KEXEC_CRASH_HOTPLUG_SUPPORT for x86 as well.

This proposal of shifting to the KEXEC_CRASH_HOTPLUG_SUPPORT kexec bit 
for x86 is also mentioned in the
comment for the get_hotplug_kexec_flag function.

Please let me know your opinion.

Thanks,
Sourabh Jain

_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v3 1/3] kexec_load: Use new kexec flag for hotplug support
  2024-07-08  7:55     ` Sourabh Jain
@ 2024-07-08 10:27       ` Baoquan He
  0 siblings, 0 replies; 10+ messages in thread
From: Baoquan He @ 2024-07-08 10:27 UTC (permalink / raw)
  To: Sourabh Jain
  Cc: kexec, Aditya Gupta, Coiby Xu, Hari Bathini, Mahesh Salgaonkar,
	Simon Horman

On 07/08/24 at 01:25pm, Sourabh Jain wrote:
> Hello Baoquan,
> 
> On 08/07/24 07:09, Baoquan He wrote:
> > Hi Sourabh,
> > 
> > On 07/07/24 at 08:54pm, Sourabh Jain wrote:
> > > Kernel commit 79365026f869 (crash: add a new kexec flag for hotplug
> > > support) has introduced a new kexec flag to generalize hotplug support.
> > > The newly introduced kexec flags for hotplug allow architectures to
> > > exclude all the required kexec segments from SHA calculation so that
> > > the kernel can update them on hotplug events. This was not possible
> > > earlier with the KEXEC_UPDATE_ELFCOREHDR kexec flags since it was added
> > > only for the elfcorehdr segment.
> > > 
> > > To enable architectures to control the list of kexec segments to exclude
> > > when hotplug support is enabled, add a new architecture-specific
> > > function named arch_do_exclude_segment. During the SHA calculation, this
> > > function gets called to let the architecture decide whether a specific
> > > kexec segment should be considered for SHA calculation or not.
> > > 
> > > Note: To avoid breaking backward compatibility, the new kexec flag
> > > KEXEC_CRASH_HOTPLUG_SUPPORT is not used for x86 for now.
> > For x86, both KEXEC_UPDATE_ELFCOREHDR and KEXEC_CRASH_HOTPLUG_SUPPORT
> > should be OK for kexec_file_load.
> 
> Do we even need these flags for kexec_file_load at all?
> My understanding is that these flags are only needed for the kexec_load
> system call.

Oh, sorry, my bad, I must have mixed this with KEXEC_FILE_DEBUG I
earlier added when I checked this patchset. I think everything is
like what you said.
> 
> 
> > Your change will make a difference
> > between kexec_load and kexec_file_load.
> 
> I am confused by the above statement.
> 
> Given that we don't even send any of the above flags for kexec_file_load, I
> am not
> sure how these changes make a difference between the two system calls.
> 
> > But I agree with you on the
> > backward cmpatibility with KEXEC_CRASH_HOTPLUG_SUPPORT flag.
> > 
> > Anyway, if it's in a hurry to catch up with Simon's new release, this is
> > fine, we can change it later.
> 
> It would be great if we could consider this patch series for the next
> release, but not at
> the cost of breaking any backward compatibility for x86. If you think these
> changes are
> breaking anything for any kernel version, I would prefer to update my patch
> series.
> 
> > Otherwise, we may be better to remove the
> > difference, namely, not making x86 only be able to accept
> > KEXEC_UPDATE_ELFCOREHDR flag on kexec_load. My personal opinion
> 
> On x86, passing the KEXEC_CRASH_HOTPLUG_SUPPORT kexec bit to kernel versions
> 6.5 to 6.9
> with the kexec_load system call will fail with -EINVAL. However, from kernel
> 6.10 onward,
> both KEXEC_UPDATE_ELFCOREHDR and KEXEC_CRASH_HOTPLUG_SUPPORT kexec bits are
> acceptable for x86.
> 
> My proposal is to use KEXEC_UPDATE_ELFCOREHDR on x86 for some time (maybe a
> couple of kernel releases),
> and eventually switch to KEXEC_CRASH_HOTPLUG_SUPPORT for x86 as well.
> 
> This proposal of shifting to the KEXEC_CRASH_HOTPLUG_SUPPORT kexec bit for
> x86 is also mentioned in the
> comment for the get_hotplug_kexec_flag function.
> 
> Please let me know your opinion.

It sounds like a good plan, thanks for the effort.


_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v3 1/3] kexec_load: Use new kexec flag for hotplug support
  2024-07-07 15:24 ` [PATCH v3 1/3] kexec_load: Use new kexec flag for hotplug support Sourabh Jain
  2024-07-08  1:39   ` Baoquan He
@ 2024-07-08 10:30   ` Baoquan He
  2024-07-08 13:22     ` Sourabh Jain
  1 sibling, 1 reply; 10+ messages in thread
From: Baoquan He @ 2024-07-08 10:30 UTC (permalink / raw)
  To: Sourabh Jain
  Cc: kexec, Aditya Gupta, Coiby Xu, Hari Bathini, Mahesh Salgaonkar,
	Simon Horman

On 07/07/24 at 08:54pm, Sourabh Jain wrote:
> Kernel commit 79365026f869 (crash: add a new kexec flag for hotplug
> support) has introduced a new kexec flag to generalize hotplug support.
> The newly introduced kexec flags for hotplug allow architectures to
> exclude all the required kexec segments from SHA calculation so that
> the kernel can update them on hotplug events. This was not possible
> earlier with the KEXEC_UPDATE_ELFCOREHDR kexec flags since it was added
> only for the elfcorehdr segment.
> 
> To enable architectures to control the list of kexec segments to exclude
> when hotplug support is enabled, add a new architecture-specific
> function named arch_do_exclude_segment. During the SHA calculation, this
> function gets called to let the architecture decide whether a specific
> kexec segment should be considered for SHA calculation or not.
> 
> Note: To avoid breaking backward compatibility, the new kexec flag
> KEXEC_CRASH_HOTPLUG_SUPPORT is not used for x86 for now.
> 
> Cc: Aditya Gupta <adityag@linux.ibm.com>
> Cc: Baoquan He <bhe@redhat.com>
> Cc: Coiby Xu <coxu@redhat.com>
> Cc: Hari Bathini <hbathini@linux.ibm.com>
> Cc: Mahesh Salgaonkar <mahesh@linux.ibm.com>
> Cc: Simon Horman <horms@kernel.org>
> Signed-off-by: Sourabh Jain <sourabhjain@linux.ibm.com>
> ---
>  kexec/arch/arm/kexec-arm.c             |  5 ++++
>  kexec/arch/arm64/kexec-arm64.c         |  5 ++++
>  kexec/arch/cris/kexec-cris.c           |  4 +++
>  kexec/arch/hppa/kexec-hppa.c           |  5 ++++
>  kexec/arch/i386/kexec-x86.c            |  8 ++++++
>  kexec/arch/ia64/kexec-ia64.c           |  4 +++
>  kexec/arch/loongarch/kexec-loongarch.c |  5 ++++
>  kexec/arch/m68k/kexec-m68k.c           |  5 ++++
>  kexec/arch/mips/kexec-mips.c           |  4 +++
>  kexec/arch/ppc/kexec-ppc.c             |  4 +++
>  kexec/arch/ppc64/kexec-ppc64.c         |  5 ++++
>  kexec/arch/s390/kexec-s390.c           |  5 ++++
>  kexec/arch/sh/kexec-sh.c               |  5 ++++
>  kexec/arch/x86_64/kexec-x86_64.c       |  8 ++++++
>  kexec/kexec-syscall.h                  |  1 +
>  kexec/kexec.c                          | 40 ++++++++++++++++++++++----
>  kexec/kexec.h                          |  2 ++
>  17 files changed, 109 insertions(+), 6 deletions(-)

LGTM,

Acked-by: Baoquan He <bhe@redhat.com>


_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v3 1/3] kexec_load: Use new kexec flag for hotplug support
  2024-07-08 10:30   ` Baoquan He
@ 2024-07-08 13:22     ` Sourabh Jain
  0 siblings, 0 replies; 10+ messages in thread
From: Sourabh Jain @ 2024-07-08 13:22 UTC (permalink / raw)
  To: Baoquan He
  Cc: kexec, Aditya Gupta, Coiby Xu, Hari Bathini, Mahesh Salgaonkar,
	Simon Horman

Hello Baoquan,

On 08/07/24 16:00, Baoquan He wrote:
> On 07/07/24 at 08:54pm, Sourabh Jain wrote:
>> Kernel commit 79365026f869 (crash: add a new kexec flag for hotplug
>> support) has introduced a new kexec flag to generalize hotplug support.
>> The newly introduced kexec flags for hotplug allow architectures to
>> exclude all the required kexec segments from SHA calculation so that
>> the kernel can update them on hotplug events. This was not possible
>> earlier with the KEXEC_UPDATE_ELFCOREHDR kexec flags since it was added
>> only for the elfcorehdr segment.
>>
>> To enable architectures to control the list of kexec segments to exclude
>> when hotplug support is enabled, add a new architecture-specific
>> function named arch_do_exclude_segment. During the SHA calculation, this
>> function gets called to let the architecture decide whether a specific
>> kexec segment should be considered for SHA calculation or not.
>>
>> Note: To avoid breaking backward compatibility, the new kexec flag
>> KEXEC_CRASH_HOTPLUG_SUPPORT is not used for x86 for now.
>>
>> Cc: Aditya Gupta <adityag@linux.ibm.com>
>> Cc: Baoquan He <bhe@redhat.com>
>> Cc: Coiby Xu <coxu@redhat.com>
>> Cc: Hari Bathini <hbathini@linux.ibm.com>
>> Cc: Mahesh Salgaonkar <mahesh@linux.ibm.com>
>> Cc: Simon Horman <horms@kernel.org>
>> Signed-off-by: Sourabh Jain <sourabhjain@linux.ibm.com>
>> ---
>>   kexec/arch/arm/kexec-arm.c             |  5 ++++
>>   kexec/arch/arm64/kexec-arm64.c         |  5 ++++
>>   kexec/arch/cris/kexec-cris.c           |  4 +++
>>   kexec/arch/hppa/kexec-hppa.c           |  5 ++++
>>   kexec/arch/i386/kexec-x86.c            |  8 ++++++
>>   kexec/arch/ia64/kexec-ia64.c           |  4 +++
>>   kexec/arch/loongarch/kexec-loongarch.c |  5 ++++
>>   kexec/arch/m68k/kexec-m68k.c           |  5 ++++
>>   kexec/arch/mips/kexec-mips.c           |  4 +++
>>   kexec/arch/ppc/kexec-ppc.c             |  4 +++
>>   kexec/arch/ppc64/kexec-ppc64.c         |  5 ++++
>>   kexec/arch/s390/kexec-s390.c           |  5 ++++
>>   kexec/arch/sh/kexec-sh.c               |  5 ++++
>>   kexec/arch/x86_64/kexec-x86_64.c       |  8 ++++++
>>   kexec/kexec-syscall.h                  |  1 +
>>   kexec/kexec.c                          | 40 ++++++++++++++++++++++----
>>   kexec/kexec.h                          |  2 ++
>>   17 files changed, 109 insertions(+), 6 deletions(-)
> LGTM,
>
> Acked-by: Baoquan He <bhe@redhat.com>

Thank you for the Ack.

- Sourabh Jain

_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v3 0/3] Enable crash hotplug support on powerpc
  2024-07-07 15:24 [PATCH v3 0/3] Enable crash hotplug support on powerpc Sourabh Jain
                   ` (2 preceding siblings ...)
  2024-07-07 15:24 ` [PATCH v3 3/3] doc/hotplug: update man and --help Sourabh Jain
@ 2024-07-09  7:29 ` Simon Horman
  3 siblings, 0 replies; 10+ messages in thread
From: Simon Horman @ 2024-07-09  7:29 UTC (permalink / raw)
  To: Sourabh Jain
  Cc: kexec, Aditya Gupta, Baoquan He, Coiby Xu, Hari Bathini,
	Mahesh Salgaonkar

On Sun, Jul 07, 2024 at 08:54:53PM +0530, Sourabh Jain wrote:
> The primary goal of this patch series is to enable crash hotplug on
> powerpc architecture for the `kexec_load` system call.
> 
> The first patch in the series introduces a new kexec flag added in the
> kernel to generalize crash hotplug support. The second patch enables
> crash hotplug support on PowerPC for `kexec_load` system call. The third
> patch updates the documentation about crash hotplug support.
> 
> Changes log:
> 
> v4:
>   - Do not remove the KEXEC_UPDATE_ELFCOREHDR kexec flag. It is needed to
>     maintain backward compatibility on x86. 1/3
>   - Send the KEXEC_UPDATE_ELFCOREHDR kexec flag for x86, and for the rest
>     of the architectures, send KEXEC_CRASH_HOTPLUG_SUPPORT to enable
>     crash hotplug support kexec_load system call. 1/3
>   - Since there is a significant change in 1/3, hence Hari's Acked-by
>     is removed form only first patch. 1/3
>   - Rename and reorder the function arch_do_exclude_segment() parameters
>     as suggested. 1/3
>   - Keep the implementation of arch_do_exclude_segment() function same
>     for x86_64 and i386. 1/3
> 
> v3:
>   https://lists.infradead.org/pipermail/kexec/2024-July/030361.html
>   - Updated --hotplug option description 3/3
> 
> v2:
>   https://lists.infradead.org/pipermail/kexec/2024-June/030309.html
>   - Find CPUs in the system using the /sys/devices/system/cpu/present sysfs
>     instead of traversing all nodes under /proc/device-tree/cpus. 2/3
>   - Added a new function to find present CPUs in the system. 2/3
>   - Removed unnecessary NULL check on seg_ptr from arch_do_exclude_segment(). 2/3
>   - Updated --hotplug option description 3/3
> 
> v1:
>   https://lists.infradead.org/pipermail/kexec/2024-May/030051.html

Thanks Sourabh,

Series applied.

_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2024-07-09  7:30 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-07-07 15:24 [PATCH v3 0/3] Enable crash hotplug support on powerpc Sourabh Jain
2024-07-07 15:24 ` [PATCH v3 1/3] kexec_load: Use new kexec flag for hotplug support Sourabh Jain
2024-07-08  1:39   ` Baoquan He
2024-07-08  7:55     ` Sourabh Jain
2024-07-08 10:27       ` Baoquan He
2024-07-08 10:30   ` Baoquan He
2024-07-08 13:22     ` Sourabh Jain
2024-07-07 15:24 ` [PATCH v3 2/3] powerpc/kexec_load: add " Sourabh Jain
2024-07-07 15:24 ` [PATCH v3 3/3] doc/hotplug: update man and --help Sourabh Jain
2024-07-09  7:29 ` [PATCH v3 0/3] Enable crash hotplug support on powerpc Simon Horman

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox