* [PATCH v2 0/4] kexec: print out debugging message if required for kexec_load
@ 2025-11-03 6:34 Qiang Ma
2025-11-03 6:34 ` [PATCH v2 1/4] kexec: Fix uninitialized struct kimage *image pointer Qiang Ma
` (3 more replies)
0 siblings, 4 replies; 21+ messages in thread
From: Qiang Ma @ 2025-11-03 6:34 UTC (permalink / raw)
To: akpm, bhe; +Cc: kexec, linux-kernel, Qiang Ma
Overview:
=========
The commit a85ee18c7900 ("kexec_file: print out debugging message
if required") has added general code printing in kexec_file_load(),
but not in kexec_load().
Since kexec_load and kexec_file_load are not triggered simultaneously,
we can unify the debug flag of kexec and kexec_file as kexec_core_dbg_print.
Next, we need to do some things in this patchset:
1. rename kexec_file_dbg_print to kexec_core_dbg_print
2. Add KEXEC_DEBUG
3. Initialize kexec_core_dbg_print for kexec
4. Fix uninitialized struct kimage *image pointer
5. Set the reset of kexec_file_dbg_print to kimage_free
Testing:
=========
I did testing on x86_64, arm64 and loongarch. On x86_64, the printed messages
look like below:
unset CONFIG_KEXEC_FILE:
[ 81.476959] kexec: nr_segments = 7
[ 81.477565] kexec: segment[0]: buf=0x00000000c22469d2 bufsz=0x70 mem=0x100000 memsz=0x1000
[ 81.478797] kexec: segment[1]: buf=0x00000000dedbb3b1 bufsz=0x140 mem=0x101000 memsz=0x1000
[ 81.480075] kexec: segment[2]: buf=0x00000000d7657a33 bufsz=0x30 mem=0x102000 memsz=0x1000
[ 81.481288] kexec: segment[3]: buf=0x00000000c7eb60a6 bufsz=0x16f40a8 mem=0x23bd0b000 memsz=0x16f5000
[ 81.489018] kexec: segment[4]: buf=0x00000000d1ca53c8 bufsz=0xd73400 mem=0x23d400000 memsz=0x2ab7000
[ 81.499697] kexec: segment[5]: buf=0x00000000697bac5a bufsz=0x50dc mem=0x23fff1000 memsz=0x6000
[ 81.501084] kexec: segment[6]: buf=0x000000001f743a68 bufsz=0x70e0 mem=0x23fff7000 memsz=0x9000
[ 81.502374] kexec: kexec_load: type:0, start:0x23fff7700 head:0x10a4b9002 flags:0x3e0010
set CONFIG_KEXEC_FILE
[ 36.774228] kexec_file: kernel: 0000000066c386c8 kernel_size: 0xd78400
[ 36.821814] kexec-bzImage64: Loaded purgatory at 0x23fffb000
[ 36.821826] kexec-bzImage64: Loaded boot_param, command line and misc at 0x23fff9000 bufsz=0x12d0 memsz=0x2000
[ 36.821829] kexec-bzImage64: Loaded 64bit kernel at 0x23d400000 bufsz=0xd73400 memsz=0x2ab7000
[ 36.821918] kexec-bzImage64: Loaded initrd at 0x23bd0b000 bufsz=0x16f40a8 memsz=0x16f40a8
[ 36.821920] kexec-bzImage64: Final command line is: root=/dev/mapper/test-root crashkernel=auto rd.lvm.lv=test/root
[ 36.821925] kexec-bzImage64: E820 memmap:
[ 36.821926] kexec-bzImage64: 0000000000000000-000000000009ffff (1)
[ 36.821928] kexec-bzImage64: 0000000000100000-0000000000811fff (1)
[ 36.821930] kexec-bzImage64: 0000000000812000-0000000000812fff (2)
[ 36.821931] kexec-bzImage64: 0000000000813000-00000000bee38fff (1)
[ 36.821933] kexec-bzImage64: 00000000bee39000-00000000beec2fff (2)
[ 36.821934] kexec-bzImage64: 00000000beec3000-00000000bf8ecfff (1)
[ 36.821935] kexec-bzImage64: 00000000bf8ed000-00000000bfb6cfff (2)
[ 36.821936] kexec-bzImage64: 00000000bfb6d000-00000000bfb7efff (3)
[ 36.821937] kexec-bzImage64: 00000000bfb7f000-00000000bfbfefff (4)
[ 36.821938] kexec-bzImage64: 00000000bfbff000-00000000bff7bfff (1)
[ 36.821939] kexec-bzImage64: 00000000bff7c000-00000000bfffffff (2)
[ 36.821940] kexec-bzImage64: 00000000feffc000-00000000feffffff (2)
[ 36.821941] kexec-bzImage64: 00000000ffc00000-00000000ffffffff (2)
[ 36.821942] kexec-bzImage64: 0000000100000000-000000023fffffff (1)
[ 36.872348] kexec_file: nr_segments = 4
[ 36.872356] kexec_file: segment[0]: buf=0x000000005314ece7 bufsz=0x4000 mem=0x23fffb000 memsz=0x5000
[ 36.872370] kexec_file: segment[1]: buf=0x000000006e59b143 bufsz=0x12d0 mem=0x23fff9000 memsz=0x2000
[ 36.872374] kexec_file: segment[2]: buf=0x00000000eb7b1fc3 bufsz=0xd73400 mem=0x23d400000 memsz=0x2ab7000
[ 36.882172] kexec_file: segment[3]: buf=0x000000006af76441 bufsz=0x16f40a8 mem=0x23bd0b000 memsz=0x16f5000
[ 36.889113] kexec_file: kexec_file_load: type:0, start:0x23fffb150 head:0x101a2e002 flags:0x8
Changes in v2:
==========
- Unify the debug flag of kexec and kexec_file
- Fix uninitialized struct kimage *image pointer
- Fix the issue of mismatch between loop variable types
Qiang Ma (4):
kexec: Fix uninitialized struct kimage *image pointer
kexec: add kexec_core flag to control debug printing
kexec: print out debugging message if required for kexec_load
kexec_file: Fix the issue of mismatch between loop variable types
include/linux/kexec.h | 9 +++++----
include/uapi/linux/kexec.h | 1 +
kernel/kexec.c | 16 +++++++++++++++-
kernel/kexec_core.c | 4 +++-
kernel/kexec_file.c | 9 ++++-----
5 files changed, 28 insertions(+), 11 deletions(-)
--
2.20.1
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH v2 1/4] kexec: Fix uninitialized struct kimage *image pointer
2025-11-03 6:34 [PATCH v2 0/4] kexec: print out debugging message if required for kexec_load Qiang Ma
@ 2025-11-03 6:34 ` Qiang Ma
2025-11-03 6:34 ` [PATCH v2 2/4] kexec: add kexec_core flag to control debug printing Qiang Ma
` (2 subsequent siblings)
3 siblings, 0 replies; 21+ messages in thread
From: Qiang Ma @ 2025-11-03 6:34 UTC (permalink / raw)
To: akpm, bhe; +Cc: kexec, linux-kernel, Qiang Ma
The image is initialized to NULL. Then, after calling kimage_alloc_init,
we can directly goto 'out' because at this time, the kimage_free will
determine whether image is a NULL pointer.
This can also prepare for the subsequent patch's kexec_core_dbg_print
to be reset to zero in kimage_free.
Signed-off-by: Qiang Ma <maqianga@uniontech.com>
---
kernel/kexec.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/kernel/kexec.c b/kernel/kexec.c
index 28008e3d462e..9bb1f2b6b268 100644
--- a/kernel/kexec.c
+++ b/kernel/kexec.c
@@ -95,6 +95,8 @@ static int do_kexec_load(unsigned long entry, unsigned long nr_segments,
unsigned long i;
int ret;
+ image = NULL;
+
/*
* Because we write directly to the reserved memory region when loading
* crash kernels we need a serialization here to prevent multiple crash
@@ -129,7 +131,7 @@ static int do_kexec_load(unsigned long entry, unsigned long nr_segments,
ret = kimage_alloc_init(&image, entry, nr_segments, segments, flags);
if (ret)
- goto out_unlock;
+ goto out;
if (flags & KEXEC_PRESERVE_CONTEXT)
image->preserve_context = 1;
--
2.20.1
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v2 2/4] kexec: add kexec_core flag to control debug printing
2025-11-03 6:34 [PATCH v2 0/4] kexec: print out debugging message if required for kexec_load Qiang Ma
2025-11-03 6:34 ` [PATCH v2 1/4] kexec: Fix uninitialized struct kimage *image pointer Qiang Ma
@ 2025-11-03 6:34 ` Qiang Ma
2025-11-05 3:09 ` Baoquan He
2025-11-03 6:34 ` [PATCH v2 3/4] kexec: print out debugging message if required for kexec_load Qiang Ma
2025-11-03 6:34 ` [PATCH v2 4/4] kexec_file: Fix the issue of mismatch between loop variable types Qiang Ma
3 siblings, 1 reply; 21+ messages in thread
From: Qiang Ma @ 2025-11-03 6:34 UTC (permalink / raw)
To: akpm, bhe; +Cc: kexec, linux-kernel, Qiang Ma
The commit a85ee18c7900 ("kexec_file: print out debugging message
if required") has added general code printing in kexec_file_load(),
but not in kexec_load().
Since kexec_load and kexec_file_load are not triggered
simultaneously, we can unify the debug flag of kexec and kexec_file
as kexec_core_dbg_print.
Next, we need to do four things:
1. rename kexec_file_dbg_print to kexec_core_dbg_print
2. Add KEXEC_DEBUG
3. Initialize kexec_core_dbg_print for kexec
4. Set the reset of kexec_file_dbg_print to kimage_free
Signed-off-by: Qiang Ma <maqianga@uniontech.com>
---
include/linux/kexec.h | 9 +++++----
include/uapi/linux/kexec.h | 1 +
kernel/kexec.c | 1 +
kernel/kexec_core.c | 4 +++-
kernel/kexec_file.c | 4 +---
5 files changed, 11 insertions(+), 8 deletions(-)
diff --git a/include/linux/kexec.h b/include/linux/kexec.h
index ff7e231b0485..cad8b5c362af 100644
--- a/include/linux/kexec.h
+++ b/include/linux/kexec.h
@@ -455,10 +455,11 @@ bool kexec_load_permitted(int kexec_image_type);
/* List of defined/legal kexec flags */
#ifndef CONFIG_KEXEC_JUMP
-#define KEXEC_FLAGS (KEXEC_ON_CRASH | KEXEC_UPDATE_ELFCOREHDR | KEXEC_CRASH_HOTPLUG_SUPPORT)
+#define KEXEC_FLAGS (KEXEC_ON_CRASH | KEXEC_UPDATE_ELFCOREHDR | KEXEC_CRASH_HOTPLUG_SUPPORT | \
+ KEXEC_DEBUG)
#else
#define KEXEC_FLAGS (KEXEC_ON_CRASH | KEXEC_PRESERVE_CONTEXT | KEXEC_UPDATE_ELFCOREHDR | \
- KEXEC_CRASH_HOTPLUG_SUPPORT)
+ KEXEC_CRASH_HOTPLUG_SUPPORT | KEXEC_DEBUG)
#endif
/* List of defined/legal kexec file flags */
@@ -525,10 +526,10 @@ static inline int arch_kexec_post_alloc_pages(void *vaddr, unsigned int pages, g
static inline void arch_kexec_pre_free_pages(void *vaddr, unsigned int pages) { }
#endif
-extern bool kexec_file_dbg_print;
+extern bool kexec_core_dbg_print;
#define kexec_dprintk(fmt, arg...) \
- do { if (kexec_file_dbg_print) pr_info(fmt, ##arg); } while (0)
+ do { if (kexec_core_dbg_print) pr_info(fmt, ##arg); } while (0)
extern void *kimage_map_segment(struct kimage *image, unsigned long addr, unsigned long size);
extern void kimage_unmap_segment(void *buffer);
diff --git a/include/uapi/linux/kexec.h b/include/uapi/linux/kexec.h
index 55749cb0b81d..819c600af125 100644
--- a/include/uapi/linux/kexec.h
+++ b/include/uapi/linux/kexec.h
@@ -14,6 +14,7 @@
#define KEXEC_PRESERVE_CONTEXT 0x00000002
#define KEXEC_UPDATE_ELFCOREHDR 0x00000004
#define KEXEC_CRASH_HOTPLUG_SUPPORT 0x00000008
+#define KEXEC_DEBUG 0x00000010
#define KEXEC_ARCH_MASK 0xffff0000
/*
diff --git a/kernel/kexec.c b/kernel/kexec.c
index 9bb1f2b6b268..c7a869d32f87 100644
--- a/kernel/kexec.c
+++ b/kernel/kexec.c
@@ -42,6 +42,7 @@ static int kimage_alloc_init(struct kimage **rimage, unsigned long entry,
if (!image)
return -ENOMEM;
+ kexec_core_dbg_print = !!(flags & KEXEC_DEBUG);
image->start = entry;
image->nr_segments = nr_segments;
memcpy(image->segment, segments, nr_segments * sizeof(*segments));
diff --git a/kernel/kexec_core.c b/kernel/kexec_core.c
index fa00b239c5d9..865f2b14f23b 100644
--- a/kernel/kexec_core.c
+++ b/kernel/kexec_core.c
@@ -53,7 +53,7 @@ atomic_t __kexec_lock = ATOMIC_INIT(0);
/* Flag to indicate we are going to kexec a new kernel */
bool kexec_in_progress = false;
-bool kexec_file_dbg_print;
+bool kexec_core_dbg_print;
/*
* When kexec transitions to the new kernel there is a one-to-one
@@ -576,6 +576,8 @@ void kimage_free(struct kimage *image)
kimage_entry_t *ptr, entry;
kimage_entry_t ind = 0;
+ kexec_core_dbg_print = false;
+
if (!image)
return;
diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c
index eb62a9794242..4a24aadbad02 100644
--- a/kernel/kexec_file.c
+++ b/kernel/kexec_file.c
@@ -138,8 +138,6 @@ void kimage_file_post_load_cleanup(struct kimage *image)
*/
kfree(image->image_loader_data);
image->image_loader_data = NULL;
-
- kexec_file_dbg_print = false;
}
#ifdef CONFIG_KEXEC_SIG
@@ -314,7 +312,7 @@ kimage_file_alloc_init(struct kimage **rimage, int kernel_fd,
if (!image)
return -ENOMEM;
- kexec_file_dbg_print = !!(flags & KEXEC_FILE_DEBUG);
+ kexec_core_dbg_print = !!(flags & KEXEC_FILE_DEBUG);
image->file_mode = 1;
#ifdef CONFIG_CRASH_DUMP
--
2.20.1
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v2 3/4] kexec: print out debugging message if required for kexec_load
2025-11-03 6:34 [PATCH v2 0/4] kexec: print out debugging message if required for kexec_load Qiang Ma
2025-11-03 6:34 ` [PATCH v2 1/4] kexec: Fix uninitialized struct kimage *image pointer Qiang Ma
2025-11-03 6:34 ` [PATCH v2 2/4] kexec: add kexec_core flag to control debug printing Qiang Ma
@ 2025-11-03 6:34 ` Qiang Ma
2025-11-05 3:01 ` Baoquan He
2025-11-03 6:34 ` [PATCH v2 4/4] kexec_file: Fix the issue of mismatch between loop variable types Qiang Ma
3 siblings, 1 reply; 21+ messages in thread
From: Qiang Ma @ 2025-11-03 6:34 UTC (permalink / raw)
To: akpm, bhe; +Cc: kexec, linux-kernel, Qiang Ma, kernel test robot
The commit a85ee18c7900 ("kexec_file: print out debugging message
if required") has added general code printing in kexec_file_load(),
but not in kexec_load().
Especially in the RISC-V architecture, kexec_image_info() has been
removed(commit eb7622d908a0 ("kexec_file, riscv: print out debugging
message if required")). As a result, when using '-d' for the kexec_load
interface, print nothing in the kernel space. This might be helpful for
verifying the accuracy of the data passed to the kernel. Therefore,
refer to this commit a85ee18c7900 ("kexec_file: print out debugging
message if required"), debug print information has been added.
Signed-off-by: Qiang Ma <maqianga@uniontech.com>
Reported-by: kernel test robot <lkp@intel.com>
Closes: https://lore.kernel.org/oe-kbuild-all/202510310332.6XrLe70K-lkp@intel.com/
---
kernel/kexec.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/kernel/kexec.c b/kernel/kexec.c
index c7a869d32f87..9b433b972cc1 100644
--- a/kernel/kexec.c
+++ b/kernel/kexec.c
@@ -154,7 +154,15 @@ static int do_kexec_load(unsigned long entry, unsigned long nr_segments,
if (ret)
goto out;
+ kexec_dprintk("nr_segments = %lu\n", nr_segments);
for (i = 0; i < nr_segments; i++) {
+ struct kexec_segment *ksegment;
+
+ ksegment = &image->segment[i];
+ kexec_dprintk("segment[%lu]: buf=0x%p bufsz=0x%zx mem=0x%lx memsz=0x%zx\n",
+ i, ksegment->buf, ksegment->bufsz, ksegment->mem,
+ ksegment->memsz);
+
ret = kimage_load_segment(image, i);
if (ret)
goto out;
@@ -166,6 +174,9 @@ static int do_kexec_load(unsigned long entry, unsigned long nr_segments,
if (ret)
goto out;
+ kexec_dprintk("kexec_load: type:%u, start:0x%lx head:0x%lx flags:0x%lx\n",
+ image->type, image->start, image->head, flags);
+
/* Install the new kernel and uninstall the old */
image = xchg(dest_image, image);
--
2.20.1
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v2 4/4] kexec_file: Fix the issue of mismatch between loop variable types
2025-11-03 6:34 [PATCH v2 0/4] kexec: print out debugging message if required for kexec_load Qiang Ma
` (2 preceding siblings ...)
2025-11-03 6:34 ` [PATCH v2 3/4] kexec: print out debugging message if required for kexec_load Qiang Ma
@ 2025-11-03 6:34 ` Qiang Ma
2025-11-05 3:05 ` Baoquan He
3 siblings, 1 reply; 21+ messages in thread
From: Qiang Ma @ 2025-11-03 6:34 UTC (permalink / raw)
To: akpm, bhe; +Cc: kexec, linux-kernel, Qiang Ma
The type of the struct kimage member variable nr_segments is unsigned long.
Correct the loop variable i and the print format specifier type.
Signed-off-by: Qiang Ma <maqianga@uniontech.com>
---
kernel/kexec_file.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c
index 4a24aadbad02..7afdaa0efc50 100644
--- a/kernel/kexec_file.c
+++ b/kernel/kexec_file.c
@@ -366,7 +366,8 @@ SYSCALL_DEFINE5(kexec_file_load, int, kernel_fd, int, initrd_fd,
int image_type = (flags & KEXEC_FILE_ON_CRASH) ?
KEXEC_TYPE_CRASH : KEXEC_TYPE_DEFAULT;
struct kimage **dest_image, *image;
- int ret = 0, i;
+ int ret = 0;
+ unsigned long i;
/* We only trust the superuser with rebooting the system. */
if (!kexec_load_permitted(image_type))
@@ -432,7 +433,7 @@ SYSCALL_DEFINE5(kexec_file_load, int, kernel_fd, int, initrd_fd,
struct kexec_segment *ksegment;
ksegment = &image->segment[i];
- kexec_dprintk("segment[%d]: buf=0x%p bufsz=0x%zx mem=0x%lx memsz=0x%zx\n",
+ kexec_dprintk("segment[%lu]: buf=0x%p bufsz=0x%zx mem=0x%lx memsz=0x%zx\n",
i, ksegment->buf, ksegment->bufsz, ksegment->mem,
ksegment->memsz);
--
2.20.1
^ permalink raw reply related [flat|nested] 21+ messages in thread
* Re: [PATCH v2 3/4] kexec: print out debugging message if required for kexec_load
2025-11-03 6:34 ` [PATCH v2 3/4] kexec: print out debugging message if required for kexec_load Qiang Ma
@ 2025-11-05 3:01 ` Baoquan He
2025-11-05 3:41 ` Qiang Ma
0 siblings, 1 reply; 21+ messages in thread
From: Baoquan He @ 2025-11-05 3:01 UTC (permalink / raw)
To: Qiang Ma; +Cc: akpm, kexec, linux-kernel, kernel test robot
On 11/03/25 at 02:34pm, Qiang Ma wrote:
> The commit a85ee18c7900 ("kexec_file: print out debugging message
> if required") has added general code printing in kexec_file_load(),
> but not in kexec_load().
>
> Especially in the RISC-V architecture, kexec_image_info() has been
> removed(commit eb7622d908a0 ("kexec_file, riscv: print out debugging
> message if required")). As a result, when using '-d' for the kexec_load
> interface, print nothing in the kernel space. This might be helpful for
> verifying the accuracy of the data passed to the kernel. Therefore,
> refer to this commit a85ee18c7900 ("kexec_file: print out debugging
> message if required"), debug print information has been added.
>
> Signed-off-by: Qiang Ma <maqianga@uniontech.com>
> Reported-by: kernel test robot <lkp@intel.com>
> Closes: https://lore.kernel.org/oe-kbuild-all/202510310332.6XrLe70K-lkp@intel.com/
> ---
> kernel/kexec.c | 11 +++++++++++
> 1 file changed, 11 insertions(+)
>
> diff --git a/kernel/kexec.c b/kernel/kexec.c
> index c7a869d32f87..9b433b972cc1 100644
> --- a/kernel/kexec.c
> +++ b/kernel/kexec.c
> @@ -154,7 +154,15 @@ static int do_kexec_load(unsigned long entry, unsigned long nr_segments,
> if (ret)
> goto out;
>
> + kexec_dprintk("nr_segments = %lu\n", nr_segments);
> for (i = 0; i < nr_segments; i++) {
> + struct kexec_segment *ksegment;
> +
> + ksegment = &image->segment[i];
> + kexec_dprintk("segment[%lu]: buf=0x%p bufsz=0x%zx mem=0x%lx memsz=0x%zx\n",
> + i, ksegment->buf, ksegment->bufsz, ksegment->mem,
> + ksegment->memsz);
There has already been a print_segments() in kexec-tools/kexec/kexec.c,
you will get duplicated printing. That sounds not good. Have you tested
this?
> +
> ret = kimage_load_segment(image, i);
> if (ret)
> goto out;
> @@ -166,6 +174,9 @@ static int do_kexec_load(unsigned long entry, unsigned long nr_segments,
> if (ret)
> goto out;
>
> + kexec_dprintk("kexec_load: type:%u, start:0x%lx head:0x%lx flags:0x%lx\n",
> + image->type, image->start, image->head, flags);
> +
> /* Install the new kernel and uninstall the old */
> image = xchg(dest_image, image);
>
> --
> 2.20.1
>
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v2 4/4] kexec_file: Fix the issue of mismatch between loop variable types
2025-11-03 6:34 ` [PATCH v2 4/4] kexec_file: Fix the issue of mismatch between loop variable types Qiang Ma
@ 2025-11-05 3:05 ` Baoquan He
2025-11-05 3:47 ` Qiang Ma
[not found] ` <c669d240-1ee8-4897-a30d-3efefe161085@uniontech.com>
0 siblings, 2 replies; 21+ messages in thread
From: Baoquan He @ 2025-11-05 3:05 UTC (permalink / raw)
To: Qiang Ma; +Cc: akpm, kexec, linux-kernel
On 11/03/25 at 02:34pm, Qiang Ma wrote:
> The type of the struct kimage member variable nr_segments is unsigned long.
> Correct the loop variable i and the print format specifier type.
I can't see what's meaningful with this change. nr_segments is unsigned
long, but it's the range 'i' will loop. If so, we need change all for
loop of the int iterator.
>
> Signed-off-by: Qiang Ma <maqianga@uniontech.com>
> ---
> kernel/kexec_file.c | 5 +++--
> 1 file changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c
> index 4a24aadbad02..7afdaa0efc50 100644
> --- a/kernel/kexec_file.c
> +++ b/kernel/kexec_file.c
> @@ -366,7 +366,8 @@ SYSCALL_DEFINE5(kexec_file_load, int, kernel_fd, int, initrd_fd,
> int image_type = (flags & KEXEC_FILE_ON_CRASH) ?
> KEXEC_TYPE_CRASH : KEXEC_TYPE_DEFAULT;
> struct kimage **dest_image, *image;
> - int ret = 0, i;
> + int ret = 0;
> + unsigned long i;
>
> /* We only trust the superuser with rebooting the system. */
> if (!kexec_load_permitted(image_type))
> @@ -432,7 +433,7 @@ SYSCALL_DEFINE5(kexec_file_load, int, kernel_fd, int, initrd_fd,
> struct kexec_segment *ksegment;
>
> ksegment = &image->segment[i];
> - kexec_dprintk("segment[%d]: buf=0x%p bufsz=0x%zx mem=0x%lx memsz=0x%zx\n",
> + kexec_dprintk("segment[%lu]: buf=0x%p bufsz=0x%zx mem=0x%lx memsz=0x%zx\n",
> i, ksegment->buf, ksegment->bufsz, ksegment->mem,
> ksegment->memsz);
>
> --
> 2.20.1
>
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v2 2/4] kexec: add kexec_core flag to control debug printing
2025-11-03 6:34 ` [PATCH v2 2/4] kexec: add kexec_core flag to control debug printing Qiang Ma
@ 2025-11-05 3:09 ` Baoquan He
2025-11-05 4:32 ` Qiang Ma
0 siblings, 1 reply; 21+ messages in thread
From: Baoquan He @ 2025-11-05 3:09 UTC (permalink / raw)
To: Qiang Ma; +Cc: akpm, kexec, linux-kernel
On 11/03/25 at 02:34pm, Qiang Ma wrote:
> The commit a85ee18c7900 ("kexec_file: print out debugging message
> if required") has added general code printing in kexec_file_load(),
> but not in kexec_load().
>
> Since kexec_load and kexec_file_load are not triggered
> simultaneously, we can unify the debug flag of kexec and kexec_file
> as kexec_core_dbg_print.
After reconsidering this, I regret calling it kexec_core_dbg_print.
That sounds a printing only happening in kexec_core. Maybe
kexec_dbg_print is better. Because here kexec refers to a generic
concept, but not limited to kexec_load interface only. Just my personal
thinking.
Other than the naming, the whole patch looks good to me. Thanks.
>
> Next, we need to do four things:
>
> 1. rename kexec_file_dbg_print to kexec_core_dbg_print
> 2. Add KEXEC_DEBUG
> 3. Initialize kexec_core_dbg_print for kexec
> 4. Set the reset of kexec_file_dbg_print to kimage_free
>
> Signed-off-by: Qiang Ma <maqianga@uniontech.com>
> ---
> include/linux/kexec.h | 9 +++++----
> include/uapi/linux/kexec.h | 1 +
> kernel/kexec.c | 1 +
> kernel/kexec_core.c | 4 +++-
> kernel/kexec_file.c | 4 +---
> 5 files changed, 11 insertions(+), 8 deletions(-)
>
> diff --git a/include/linux/kexec.h b/include/linux/kexec.h
> index ff7e231b0485..cad8b5c362af 100644
> --- a/include/linux/kexec.h
> +++ b/include/linux/kexec.h
> @@ -455,10 +455,11 @@ bool kexec_load_permitted(int kexec_image_type);
>
> /* List of defined/legal kexec flags */
> #ifndef CONFIG_KEXEC_JUMP
> -#define KEXEC_FLAGS (KEXEC_ON_CRASH | KEXEC_UPDATE_ELFCOREHDR | KEXEC_CRASH_HOTPLUG_SUPPORT)
> +#define KEXEC_FLAGS (KEXEC_ON_CRASH | KEXEC_UPDATE_ELFCOREHDR | KEXEC_CRASH_HOTPLUG_SUPPORT | \
> + KEXEC_DEBUG)
> #else
> #define KEXEC_FLAGS (KEXEC_ON_CRASH | KEXEC_PRESERVE_CONTEXT | KEXEC_UPDATE_ELFCOREHDR | \
> - KEXEC_CRASH_HOTPLUG_SUPPORT)
> + KEXEC_CRASH_HOTPLUG_SUPPORT | KEXEC_DEBUG)
> #endif
>
> /* List of defined/legal kexec file flags */
> @@ -525,10 +526,10 @@ static inline int arch_kexec_post_alloc_pages(void *vaddr, unsigned int pages, g
> static inline void arch_kexec_pre_free_pages(void *vaddr, unsigned int pages) { }
> #endif
>
> -extern bool kexec_file_dbg_print;
> +extern bool kexec_core_dbg_print;
>
> #define kexec_dprintk(fmt, arg...) \
> - do { if (kexec_file_dbg_print) pr_info(fmt, ##arg); } while (0)
> + do { if (kexec_core_dbg_print) pr_info(fmt, ##arg); } while (0)
>
> extern void *kimage_map_segment(struct kimage *image, unsigned long addr, unsigned long size);
> extern void kimage_unmap_segment(void *buffer);
> diff --git a/include/uapi/linux/kexec.h b/include/uapi/linux/kexec.h
> index 55749cb0b81d..819c600af125 100644
> --- a/include/uapi/linux/kexec.h
> +++ b/include/uapi/linux/kexec.h
> @@ -14,6 +14,7 @@
> #define KEXEC_PRESERVE_CONTEXT 0x00000002
> #define KEXEC_UPDATE_ELFCOREHDR 0x00000004
> #define KEXEC_CRASH_HOTPLUG_SUPPORT 0x00000008
> +#define KEXEC_DEBUG 0x00000010
> #define KEXEC_ARCH_MASK 0xffff0000
>
> /*
> diff --git a/kernel/kexec.c b/kernel/kexec.c
> index 9bb1f2b6b268..c7a869d32f87 100644
> --- a/kernel/kexec.c
> +++ b/kernel/kexec.c
> @@ -42,6 +42,7 @@ static int kimage_alloc_init(struct kimage **rimage, unsigned long entry,
> if (!image)
> return -ENOMEM;
>
> + kexec_core_dbg_print = !!(flags & KEXEC_DEBUG);
> image->start = entry;
> image->nr_segments = nr_segments;
> memcpy(image->segment, segments, nr_segments * sizeof(*segments));
> diff --git a/kernel/kexec_core.c b/kernel/kexec_core.c
> index fa00b239c5d9..865f2b14f23b 100644
> --- a/kernel/kexec_core.c
> +++ b/kernel/kexec_core.c
> @@ -53,7 +53,7 @@ atomic_t __kexec_lock = ATOMIC_INIT(0);
> /* Flag to indicate we are going to kexec a new kernel */
> bool kexec_in_progress = false;
>
> -bool kexec_file_dbg_print;
> +bool kexec_core_dbg_print;
>
> /*
> * When kexec transitions to the new kernel there is a one-to-one
> @@ -576,6 +576,8 @@ void kimage_free(struct kimage *image)
> kimage_entry_t *ptr, entry;
> kimage_entry_t ind = 0;
>
> + kexec_core_dbg_print = false;
> +
> if (!image)
> return;
>
> diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c
> index eb62a9794242..4a24aadbad02 100644
> --- a/kernel/kexec_file.c
> +++ b/kernel/kexec_file.c
> @@ -138,8 +138,6 @@ void kimage_file_post_load_cleanup(struct kimage *image)
> */
> kfree(image->image_loader_data);
> image->image_loader_data = NULL;
> -
> - kexec_file_dbg_print = false;
> }
>
> #ifdef CONFIG_KEXEC_SIG
> @@ -314,7 +312,7 @@ kimage_file_alloc_init(struct kimage **rimage, int kernel_fd,
> if (!image)
> return -ENOMEM;
>
> - kexec_file_dbg_print = !!(flags & KEXEC_FILE_DEBUG);
> + kexec_core_dbg_print = !!(flags & KEXEC_FILE_DEBUG);
> image->file_mode = 1;
>
> #ifdef CONFIG_CRASH_DUMP
> --
> 2.20.1
>
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v2 3/4] kexec: print out debugging message if required for kexec_load
2025-11-05 3:01 ` Baoquan He
@ 2025-11-05 3:41 ` Qiang Ma
2025-11-05 7:53 ` Baoquan He
0 siblings, 1 reply; 21+ messages in thread
From: Qiang Ma @ 2025-11-05 3:41 UTC (permalink / raw)
To: Baoquan He; +Cc: akpm, kexec, linux-kernel, kernel test robot
在 2025/11/5 11:01, Baoquan He 写道:
> On 11/03/25 at 02:34pm, Qiang Ma wrote:
>> The commit a85ee18c7900 ("kexec_file: print out debugging message
>> if required") has added general code printing in kexec_file_load(),
>> but not in kexec_load().
>>
>> Especially in the RISC-V architecture, kexec_image_info() has been
>> removed(commit eb7622d908a0 ("kexec_file, riscv: print out debugging
>> message if required")). As a result, when using '-d' for the kexec_load
>> interface, print nothing in the kernel space. This might be helpful for
>> verifying the accuracy of the data passed to the kernel. Therefore,
>> refer to this commit a85ee18c7900 ("kexec_file: print out debugging
>> message if required"), debug print information has been added.
>>
>> Signed-off-by: Qiang Ma <maqianga@uniontech.com>
>> Reported-by: kernel test robot <lkp@intel.com>
>> Closes: https://lore.kernel.org/oe-kbuild-all/202510310332.6XrLe70K-lkp@intel.com/
>> ---
>> kernel/kexec.c | 11 +++++++++++
>> 1 file changed, 11 insertions(+)
>>
>> diff --git a/kernel/kexec.c b/kernel/kexec.c
>> index c7a869d32f87..9b433b972cc1 100644
>> --- a/kernel/kexec.c
>> +++ b/kernel/kexec.c
>> @@ -154,7 +154,15 @@ static int do_kexec_load(unsigned long entry, unsigned long nr_segments,
>> if (ret)
>> goto out;
>>
>> + kexec_dprintk("nr_segments = %lu\n", nr_segments);
>> for (i = 0; i < nr_segments; i++) {
>> + struct kexec_segment *ksegment;
>> +
>> + ksegment = &image->segment[i];
>> + kexec_dprintk("segment[%lu]: buf=0x%p bufsz=0x%zx mem=0x%lx memsz=0x%zx\n",
>> + i, ksegment->buf, ksegment->bufsz, ksegment->mem,
>> + ksegment->memsz);
> There has already been a print_segments() in kexec-tools/kexec/kexec.c,
> you will get duplicated printing. That sounds not good. Have you tested
> this?
I have tested it, kexec-tools is the debug message printed
in user space, while kexec_dprintk is printed
in kernel space.
This might be helpful for verifying the accuracy of
the data passed to the kernel.
>> +
>> ret = kimage_load_segment(image, i);
>> if (ret)
>> goto out;
>> @@ -166,6 +174,9 @@ static int do_kexec_load(unsigned long entry, unsigned long nr_segments,
>> if (ret)
>> goto out;
>>
>> + kexec_dprintk("kexec_load: type:%u, start:0x%lx head:0x%lx flags:0x%lx\n",
>> + image->type, image->start, image->head, flags);
>> +
>> /* Install the new kernel and uninstall the old */
>> image = xchg(dest_image, image);
>>
>> --
>> 2.20.1
>>
>
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v2 4/4] kexec_file: Fix the issue of mismatch between loop variable types
2025-11-05 3:05 ` Baoquan He
@ 2025-11-05 3:47 ` Qiang Ma
2025-11-05 6:56 ` Baoquan He
[not found] ` <c669d240-1ee8-4897-a30d-3efefe161085@uniontech.com>
1 sibling, 1 reply; 21+ messages in thread
From: Qiang Ma @ 2025-11-05 3:47 UTC (permalink / raw)
To: Baoquan He; +Cc: akpm, kexec, linux-kernel
在 2025/11/5 11:05, Baoquan He 写道:
> On 11/03/25 at 02:34pm, Qiang Ma wrote:
>> The type of the struct kimage member variable nr_segments is unsigned long.
>> Correct the loop variable i and the print format specifier type.
> I can't see what's meaningful with this change. nr_segments is unsigned
> long, but it's the range 'i' will loop. If so, we need change all for
> loop of the int iterator.
If image->nr_segments is large enough, 'i' overflow causes an infinite loop.
>> Signed-off-by: Qiang Ma <maqianga@uniontech.com>
>> ---
>> kernel/kexec_file.c | 5 +++--
>> 1 file changed, 3 insertions(+), 2 deletions(-)
>>
>> diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c
>> index 4a24aadbad02..7afdaa0efc50 100644
>> --- a/kernel/kexec_file.c
>> +++ b/kernel/kexec_file.c
>> @@ -366,7 +366,8 @@ SYSCALL_DEFINE5(kexec_file_load, int, kernel_fd, int, initrd_fd,
>> int image_type = (flags & KEXEC_FILE_ON_CRASH) ?
>> KEXEC_TYPE_CRASH : KEXEC_TYPE_DEFAULT;
>> struct kimage **dest_image, *image;
>> - int ret = 0, i;
>> + int ret = 0;
>> + unsigned long i;
>>
>> /* We only trust the superuser with rebooting the system. */
>> if (!kexec_load_permitted(image_type))
>> @@ -432,7 +433,7 @@ SYSCALL_DEFINE5(kexec_file_load, int, kernel_fd, int, initrd_fd,
>> struct kexec_segment *ksegment;
>>
>> ksegment = &image->segment[i];
>> - kexec_dprintk("segment[%d]: buf=0x%p bufsz=0x%zx mem=0x%lx memsz=0x%zx\n",
>> + kexec_dprintk("segment[%lu]: buf=0x%p bufsz=0x%zx mem=0x%lx memsz=0x%zx\n",
>> i, ksegment->buf, ksegment->bufsz, ksegment->mem,
>> ksegment->memsz);
>>
>> --
>> 2.20.1
>>
>
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v2 4/4] kexec_file: Fix the issue of mismatch between loop variable types
[not found] ` <c669d240-1ee8-4897-a30d-3efefe161085@uniontech.com>
@ 2025-11-05 4:31 ` Qiang Ma
0 siblings, 0 replies; 21+ messages in thread
From: Qiang Ma @ 2025-11-05 4:31 UTC (permalink / raw)
To: Baoquan He; +Cc: akpm, kexec, linux-kernel
在 2025/11/5 11:47, Qiang Ma 写道:
>
> 在 2025/11/5 11:05, Baoquan He 写道:
>> On 11/03/25 at 02:34pm, Qiang Ma wrote:
>>> The type of the struct kimage member variable nr_segments is
>>> unsigned long.
>>> Correct the loop variable i and the print format specifier type.
>> I can't see what's meaningful with this change. nr_segments is unsigned
>> long, but it's the range 'i' will loop. If so, we need change all for
>> loop of the int iterator.
> If image->nr_segments is large enough, 'i' overflow causes an infinite
> loop.
Meanwhile, the do_kexec_load() was checked and also defined as 'unsigned
long i'.
>>> Signed-off-by: Qiang Ma <maqianga@uniontech.com>
>>> ---
>>> kernel/kexec_file.c | 5 +++--
>>> 1 file changed, 3 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c
>>> index 4a24aadbad02..7afdaa0efc50 100644
>>> --- a/kernel/kexec_file.c
>>> +++ b/kernel/kexec_file.c
>>> @@ -366,7 +366,8 @@ SYSCALL_DEFINE5(kexec_file_load, int, kernel_fd,
>>> int, initrd_fd,
>>> int image_type = (flags & KEXEC_FILE_ON_CRASH) ?
>>> KEXEC_TYPE_CRASH : KEXEC_TYPE_DEFAULT;
>>> struct kimage **dest_image, *image;
>>> - int ret = 0, i;
>>> + int ret = 0;
>>> + unsigned long i;
>>> /* We only trust the superuser with rebooting the system. */
>>> if (!kexec_load_permitted(image_type))
>>> @@ -432,7 +433,7 @@ SYSCALL_DEFINE5(kexec_file_load, int, kernel_fd,
>>> int, initrd_fd,
>>> struct kexec_segment *ksegment;
>>> ksegment = &image->segment[i];
>>> - kexec_dprintk("segment[%d]: buf=0x%p bufsz=0x%zx mem=0x%lx
>>> memsz=0x%zx\n",
>>> + kexec_dprintk("segment[%lu]: buf=0x%p bufsz=0x%zx mem=0x%lx
>>> memsz=0x%zx\n",
>>> i, ksegment->buf, ksegment->bufsz, ksegment->mem,
>>> ksegment->memsz);
>>> --
>>> 2.20.1
>>>
>>
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v2 2/4] kexec: add kexec_core flag to control debug printing
2025-11-05 3:09 ` Baoquan He
@ 2025-11-05 4:32 ` Qiang Ma
0 siblings, 0 replies; 21+ messages in thread
From: Qiang Ma @ 2025-11-05 4:32 UTC (permalink / raw)
To: Baoquan He; +Cc: akpm, kexec, linux-kernel
在 2025/11/5 11:09, Baoquan He 写道:
> On 11/03/25 at 02:34pm, Qiang Ma wrote:
>> The commit a85ee18c7900 ("kexec_file: print out debugging message
>> if required") has added general code printing in kexec_file_load(),
>> but not in kexec_load().
>>
>> Since kexec_load and kexec_file_load are not triggered
>> simultaneously, we can unify the debug flag of kexec and kexec_file
>> as kexec_core_dbg_print.
> After reconsidering this, I regret calling it kexec_core_dbg_print.
> That sounds a printing only happening in kexec_core. Maybe
> kexec_dbg_print is better. Because here kexec refers to a generic
> concept, but not limited to kexec_load interface only. Just my personal
> thinking.
This sounds reasonable. The next version will be renamed kexec_dbg_print.
>
> Other than the naming, the whole patch looks good to me. Thanks.
>
>> Next, we need to do four things:
>>
>> 1. rename kexec_file_dbg_print to kexec_core_dbg_print
>> 2. Add KEXEC_DEBUG
>> 3. Initialize kexec_core_dbg_print for kexec
>> 4. Set the reset of kexec_file_dbg_print to kimage_free
>>
>> Signed-off-by: Qiang Ma <maqianga@uniontech.com>
>> ---
>> include/linux/kexec.h | 9 +++++----
>> include/uapi/linux/kexec.h | 1 +
>> kernel/kexec.c | 1 +
>> kernel/kexec_core.c | 4 +++-
>> kernel/kexec_file.c | 4 +---
>> 5 files changed, 11 insertions(+), 8 deletions(-)
>>
>> diff --git a/include/linux/kexec.h b/include/linux/kexec.h
>> index ff7e231b0485..cad8b5c362af 100644
>> --- a/include/linux/kexec.h
>> +++ b/include/linux/kexec.h
>> @@ -455,10 +455,11 @@ bool kexec_load_permitted(int kexec_image_type);
>>
>> /* List of defined/legal kexec flags */
>> #ifndef CONFIG_KEXEC_JUMP
>> -#define KEXEC_FLAGS (KEXEC_ON_CRASH | KEXEC_UPDATE_ELFCOREHDR | KEXEC_CRASH_HOTPLUG_SUPPORT)
>> +#define KEXEC_FLAGS (KEXEC_ON_CRASH | KEXEC_UPDATE_ELFCOREHDR | KEXEC_CRASH_HOTPLUG_SUPPORT | \
>> + KEXEC_DEBUG)
>> #else
>> #define KEXEC_FLAGS (KEXEC_ON_CRASH | KEXEC_PRESERVE_CONTEXT | KEXEC_UPDATE_ELFCOREHDR | \
>> - KEXEC_CRASH_HOTPLUG_SUPPORT)
>> + KEXEC_CRASH_HOTPLUG_SUPPORT | KEXEC_DEBUG)
>> #endif
>>
>> /* List of defined/legal kexec file flags */
>> @@ -525,10 +526,10 @@ static inline int arch_kexec_post_alloc_pages(void *vaddr, unsigned int pages, g
>> static inline void arch_kexec_pre_free_pages(void *vaddr, unsigned int pages) { }
>> #endif
>>
>> -extern bool kexec_file_dbg_print;
>> +extern bool kexec_core_dbg_print;
>>
>> #define kexec_dprintk(fmt, arg...) \
>> - do { if (kexec_file_dbg_print) pr_info(fmt, ##arg); } while (0)
>> + do { if (kexec_core_dbg_print) pr_info(fmt, ##arg); } while (0)
>>
>> extern void *kimage_map_segment(struct kimage *image, unsigned long addr, unsigned long size);
>> extern void kimage_unmap_segment(void *buffer);
>> diff --git a/include/uapi/linux/kexec.h b/include/uapi/linux/kexec.h
>> index 55749cb0b81d..819c600af125 100644
>> --- a/include/uapi/linux/kexec.h
>> +++ b/include/uapi/linux/kexec.h
>> @@ -14,6 +14,7 @@
>> #define KEXEC_PRESERVE_CONTEXT 0x00000002
>> #define KEXEC_UPDATE_ELFCOREHDR 0x00000004
>> #define KEXEC_CRASH_HOTPLUG_SUPPORT 0x00000008
>> +#define KEXEC_DEBUG 0x00000010
>> #define KEXEC_ARCH_MASK 0xffff0000
>>
>> /*
>> diff --git a/kernel/kexec.c b/kernel/kexec.c
>> index 9bb1f2b6b268..c7a869d32f87 100644
>> --- a/kernel/kexec.c
>> +++ b/kernel/kexec.c
>> @@ -42,6 +42,7 @@ static int kimage_alloc_init(struct kimage **rimage, unsigned long entry,
>> if (!image)
>> return -ENOMEM;
>>
>> + kexec_core_dbg_print = !!(flags & KEXEC_DEBUG);
>> image->start = entry;
>> image->nr_segments = nr_segments;
>> memcpy(image->segment, segments, nr_segments * sizeof(*segments));
>> diff --git a/kernel/kexec_core.c b/kernel/kexec_core.c
>> index fa00b239c5d9..865f2b14f23b 100644
>> --- a/kernel/kexec_core.c
>> +++ b/kernel/kexec_core.c
>> @@ -53,7 +53,7 @@ atomic_t __kexec_lock = ATOMIC_INIT(0);
>> /* Flag to indicate we are going to kexec a new kernel */
>> bool kexec_in_progress = false;
>>
>> -bool kexec_file_dbg_print;
>> +bool kexec_core_dbg_print;
>>
>> /*
>> * When kexec transitions to the new kernel there is a one-to-one
>> @@ -576,6 +576,8 @@ void kimage_free(struct kimage *image)
>> kimage_entry_t *ptr, entry;
>> kimage_entry_t ind = 0;
>>
>> + kexec_core_dbg_print = false;
>> +
>> if (!image)
>> return;
>>
>> diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c
>> index eb62a9794242..4a24aadbad02 100644
>> --- a/kernel/kexec_file.c
>> +++ b/kernel/kexec_file.c
>> @@ -138,8 +138,6 @@ void kimage_file_post_load_cleanup(struct kimage *image)
>> */
>> kfree(image->image_loader_data);
>> image->image_loader_data = NULL;
>> -
>> - kexec_file_dbg_print = false;
>> }
>>
>> #ifdef CONFIG_KEXEC_SIG
>> @@ -314,7 +312,7 @@ kimage_file_alloc_init(struct kimage **rimage, int kernel_fd,
>> if (!image)
>> return -ENOMEM;
>>
>> - kexec_file_dbg_print = !!(flags & KEXEC_FILE_DEBUG);
>> + kexec_core_dbg_print = !!(flags & KEXEC_FILE_DEBUG);
>> image->file_mode = 1;
>>
>> #ifdef CONFIG_CRASH_DUMP
>> --
>> 2.20.1
>>
>
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v2 4/4] kexec_file: Fix the issue of mismatch between loop variable types
2025-11-05 3:47 ` Qiang Ma
@ 2025-11-05 6:56 ` Baoquan He
2025-11-05 7:06 ` Qiang Ma
0 siblings, 1 reply; 21+ messages in thread
From: Baoquan He @ 2025-11-05 6:56 UTC (permalink / raw)
To: Qiang Ma; +Cc: akpm, kexec, linux-kernel
On 11/05/25 at 11:47am, Qiang Ma wrote:
>
> 在 2025/11/5 11:05, Baoquan He 写道:
> > On 11/03/25 at 02:34pm, Qiang Ma wrote:
> > > The type of the struct kimage member variable nr_segments is unsigned long.
> > > Correct the loop variable i and the print format specifier type.
> > I can't see what's meaningful with this change. nr_segments is unsigned
> > long, but it's the range 'i' will loop. If so, we need change all for
> > loop of the int iterator.
> If image->nr_segments is large enough, 'i' overflow causes an infinite loop.
Please check kexec_add_buffer(), there's checking for the value which
upper limit is restricted to 16.
if (kbuf->image->nr_segments >= KEXEC_SEGMENT_MAX)
return -EINVAL;
> > > Signed-off-by: Qiang Ma <maqianga@uniontech.com>
> > > ---
> > > kernel/kexec_file.c | 5 +++--
> > > 1 file changed, 3 insertions(+), 2 deletions(-)
> > >
> > > diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c
> > > index 4a24aadbad02..7afdaa0efc50 100644
> > > --- a/kernel/kexec_file.c
> > > +++ b/kernel/kexec_file.c
> > > @@ -366,7 +366,8 @@ SYSCALL_DEFINE5(kexec_file_load, int, kernel_fd, int, initrd_fd,
> > > int image_type = (flags & KEXEC_FILE_ON_CRASH) ?
> > > KEXEC_TYPE_CRASH : KEXEC_TYPE_DEFAULT;
> > > struct kimage **dest_image, *image;
> > > - int ret = 0, i;
> > > + int ret = 0;
> > > + unsigned long i;
> > > /* We only trust the superuser with rebooting the system. */
> > > if (!kexec_load_permitted(image_type))
> > > @@ -432,7 +433,7 @@ SYSCALL_DEFINE5(kexec_file_load, int, kernel_fd, int, initrd_fd,
> > > struct kexec_segment *ksegment;
> > > ksegment = &image->segment[i];
> > > - kexec_dprintk("segment[%d]: buf=0x%p bufsz=0x%zx mem=0x%lx memsz=0x%zx\n",
> > > + kexec_dprintk("segment[%lu]: buf=0x%p bufsz=0x%zx mem=0x%lx memsz=0x%zx\n",
> > > i, ksegment->buf, ksegment->bufsz, ksegment->mem,
> > > ksegment->memsz);
> > > --
> > > 2.20.1
> > >
> >
>
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v2 4/4] kexec_file: Fix the issue of mismatch between loop variable types
2025-11-05 6:56 ` Baoquan He
@ 2025-11-05 7:06 ` Qiang Ma
0 siblings, 0 replies; 21+ messages in thread
From: Qiang Ma @ 2025-11-05 7:06 UTC (permalink / raw)
To: Baoquan He; +Cc: akpm, kexec, linux-kernel
在 2025/11/5 14:56, Baoquan He 写道:
> On 11/05/25 at 11:47am, Qiang Ma wrote:
>> 在 2025/11/5 11:05, Baoquan He 写道:
>>> On 11/03/25 at 02:34pm, Qiang Ma wrote:
>>>> The type of the struct kimage member variable nr_segments is unsigned long.
>>>> Correct the loop variable i and the print format specifier type.
>>> I can't see what's meaningful with this change. nr_segments is unsigned
>>> long, but it's the range 'i' will loop. If so, we need change all for
>>> loop of the int iterator.
>> If image->nr_segments is large enough, 'i' overflow causes an infinite loop.
> Please check kexec_add_buffer(), there's checking for the value which
> upper limit is restricted to 16.
>
> if (kbuf->image->nr_segments >= KEXEC_SEGMENT_MAX)
> return -EINVAL;
Oh, then this patch is really not necessary.
>>>> Signed-off-by: Qiang Ma <maqianga@uniontech.com>
>>>> ---
>>>> kernel/kexec_file.c | 5 +++--
>>>> 1 file changed, 3 insertions(+), 2 deletions(-)
>>>>
>>>> diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c
>>>> index 4a24aadbad02..7afdaa0efc50 100644
>>>> --- a/kernel/kexec_file.c
>>>> +++ b/kernel/kexec_file.c
>>>> @@ -366,7 +366,8 @@ SYSCALL_DEFINE5(kexec_file_load, int, kernel_fd, int, initrd_fd,
>>>> int image_type = (flags & KEXEC_FILE_ON_CRASH) ?
>>>> KEXEC_TYPE_CRASH : KEXEC_TYPE_DEFAULT;
>>>> struct kimage **dest_image, *image;
>>>> - int ret = 0, i;
>>>> + int ret = 0;
>>>> + unsigned long i;
>>>> /* We only trust the superuser with rebooting the system. */
>>>> if (!kexec_load_permitted(image_type))
>>>> @@ -432,7 +433,7 @@ SYSCALL_DEFINE5(kexec_file_load, int, kernel_fd, int, initrd_fd,
>>>> struct kexec_segment *ksegment;
>>>> ksegment = &image->segment[i];
>>>> - kexec_dprintk("segment[%d]: buf=0x%p bufsz=0x%zx mem=0x%lx memsz=0x%zx\n",
>>>> + kexec_dprintk("segment[%lu]: buf=0x%p bufsz=0x%zx mem=0x%lx memsz=0x%zx\n",
>>>> i, ksegment->buf, ksegment->bufsz, ksegment->mem,
>>>> ksegment->memsz);
>>>> --
>>>> 2.20.1
>>>>
>
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v2 3/4] kexec: print out debugging message if required for kexec_load
2025-11-05 3:41 ` Qiang Ma
@ 2025-11-05 7:53 ` Baoquan He
2025-11-05 8:35 ` Qiang Ma
2025-11-05 8:48 ` Qiang Ma
0 siblings, 2 replies; 21+ messages in thread
From: Baoquan He @ 2025-11-05 7:53 UTC (permalink / raw)
To: Qiang Ma; +Cc: akpm, kexec, linux-kernel, kernel test robot
On 11/05/25 at 11:41am, Qiang Ma wrote:
>
> 在 2025/11/5 11:01, Baoquan He 写道:
> > On 11/03/25 at 02:34pm, Qiang Ma wrote:
> > > The commit a85ee18c7900 ("kexec_file: print out debugging message
> > > if required") has added general code printing in kexec_file_load(),
> > > but not in kexec_load().
> > >
> > > Especially in the RISC-V architecture, kexec_image_info() has been
> > > removed(commit eb7622d908a0 ("kexec_file, riscv: print out debugging
> > > message if required")). As a result, when using '-d' for the kexec_load
> > > interface, print nothing in the kernel space. This might be helpful for
> > > verifying the accuracy of the data passed to the kernel. Therefore,
> > > refer to this commit a85ee18c7900 ("kexec_file: print out debugging
> > > message if required"), debug print information has been added.
> > >
> > > Signed-off-by: Qiang Ma <maqianga@uniontech.com>
> > > Reported-by: kernel test robot <lkp@intel.com>
> > > Closes: https://lore.kernel.org/oe-kbuild-all/202510310332.6XrLe70K-lkp@intel.com/
> > > ---
> > > kernel/kexec.c | 11 +++++++++++
> > > 1 file changed, 11 insertions(+)
> > >
> > > diff --git a/kernel/kexec.c b/kernel/kexec.c
> > > index c7a869d32f87..9b433b972cc1 100644
> > > --- a/kernel/kexec.c
> > > +++ b/kernel/kexec.c
> > > @@ -154,7 +154,15 @@ static int do_kexec_load(unsigned long entry, unsigned long nr_segments,
> > > if (ret)
> > > goto out;
> > > + kexec_dprintk("nr_segments = %lu\n", nr_segments);
> > > for (i = 0; i < nr_segments; i++) {
> > > + struct kexec_segment *ksegment;
> > > +
> > > + ksegment = &image->segment[i];
> > > + kexec_dprintk("segment[%lu]: buf=0x%p bufsz=0x%zx mem=0x%lx memsz=0x%zx\n",
> > > + i, ksegment->buf, ksegment->bufsz, ksegment->mem,
> > > + ksegment->memsz);
> > There has already been a print_segments() in kexec-tools/kexec/kexec.c,
> > you will get duplicated printing. That sounds not good. Have you tested
> > this?
> I have tested it, kexec-tools is the debug message printed
> in user space, while kexec_dprintk is printed
> in kernel space.
>
> This might be helpful for verifying the accuracy of
> the data passed to the kernel.
Hmm, that's not necessary with a debug printing to verify value passed
in kernel. We should only add debug pringing when we need but lack it.
I didn't check it carefully, if you add the debug printing only for
verifying accuracy, that doesn't justify the code change.
> > > +
> > > ret = kimage_load_segment(image, i);
> > > if (ret)
> > > goto out;
> > > @@ -166,6 +174,9 @@ static int do_kexec_load(unsigned long entry, unsigned long nr_segments,
> > > if (ret)
> > > goto out;
> > > + kexec_dprintk("kexec_load: type:%u, start:0x%lx head:0x%lx flags:0x%lx\n",
> > > + image->type, image->start, image->head, flags);
> > > +
> > > /* Install the new kernel and uninstall the old */
> > > image = xchg(dest_image, image);
> > > --
> > > 2.20.1
> > >
> >
>
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v2 3/4] kexec: print out debugging message if required for kexec_load
2025-11-05 7:53 ` Baoquan He
@ 2025-11-05 8:35 ` Qiang Ma
2025-11-05 8:55 ` Baoquan He
2025-11-05 8:48 ` Qiang Ma
1 sibling, 1 reply; 21+ messages in thread
From: Qiang Ma @ 2025-11-05 8:35 UTC (permalink / raw)
To: Baoquan He; +Cc: akpm, kexec, linux-kernel, kernel test robot
在 2025/11/5 15:53, Baoquan He 写道:
> On 11/05/25 at 11:41am, Qiang Ma wrote:
>> 在 2025/11/5 11:01, Baoquan He 写道:
>>> On 11/03/25 at 02:34pm, Qiang Ma wrote:
>>>> The commit a85ee18c7900 ("kexec_file: print out debugging message
>>>> if required") has added general code printing in kexec_file_load(),
>>>> but not in kexec_load().
>>>>
>>>> Especially in the RISC-V architecture, kexec_image_info() has been
>>>> removed(commit eb7622d908a0 ("kexec_file, riscv: print out debugging
>>>> message if required")). As a result, when using '-d' for the kexec_load
>>>> interface, print nothing in the kernel space. This might be helpful for
>>>> verifying the accuracy of the data passed to the kernel. Therefore,
>>>> refer to this commit a85ee18c7900 ("kexec_file: print out debugging
>>>> message if required"), debug print information has been added.
>>>>
>>>> Signed-off-by: Qiang Ma <maqianga@uniontech.com>
>>>> Reported-by: kernel test robot <lkp@intel.com>
>>>> Closes: https://lore.kernel.org/oe-kbuild-all/202510310332.6XrLe70K-lkp@intel.com/
>>>> ---
>>>> kernel/kexec.c | 11 +++++++++++
>>>> 1 file changed, 11 insertions(+)
>>>>
>>>> diff --git a/kernel/kexec.c b/kernel/kexec.c
>>>> index c7a869d32f87..9b433b972cc1 100644
>>>> --- a/kernel/kexec.c
>>>> +++ b/kernel/kexec.c
>>>> @@ -154,7 +154,15 @@ static int do_kexec_load(unsigned long entry, unsigned long nr_segments,
>>>> if (ret)
>>>> goto out;
>>>> + kexec_dprintk("nr_segments = %lu\n", nr_segments);
>>>> for (i = 0; i < nr_segments; i++) {
>>>> + struct kexec_segment *ksegment;
>>>> +
>>>> + ksegment = &image->segment[i];
>>>> + kexec_dprintk("segment[%lu]: buf=0x%p bufsz=0x%zx mem=0x%lx memsz=0x%zx\n",
>>>> + i, ksegment->buf, ksegment->bufsz, ksegment->mem,
>>>> + ksegment->memsz);
>>> There has already been a print_segments() in kexec-tools/kexec/kexec.c,
>>> you will get duplicated printing. That sounds not good. Have you tested
>>> this?
>> I have tested it, kexec-tools is the debug message printed
>> in user space, while kexec_dprintk is printed
>> in kernel space.
>>
>> This might be helpful for verifying the accuracy of
>> the data passed to the kernel.
> Hmm, that's not necessary with a debug printing to verify value passed
> in kernel. We should only add debug pringing when we need but lack it.
> I didn't check it carefully, if you add the debug printing only for
> verifying accuracy, that doesn't justify the code change.
It's not entirely because of it.
Another reason is that for RISC-V, for kexec_file_load interface,
kexec_image_info() was deleted at that time because the content
has been printed out in generic code.
However, these contents were not printed in kexec_load because
kexec_image_info was deleted. So now it has been added.
>>>> +
>>>> ret = kimage_load_segment(image, i);
>>>> if (ret)
>>>> goto out;
>>>> @@ -166,6 +174,9 @@ static int do_kexec_load(unsigned long entry, unsigned long nr_segments,
>>>> if (ret)
>>>> goto out;
>>>> + kexec_dprintk("kexec_load: type:%u, start:0x%lx head:0x%lx flags:0x%lx\n",
>>>> + image->type, image->start, image->head, flags);
>>>> +
>>>> /* Install the new kernel and uninstall the old */
>>>> image = xchg(dest_image, image);
>>>> --
>>>> 2.20.1
>>>>
>
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v2 3/4] kexec: print out debugging message if required for kexec_load
2025-11-05 7:53 ` Baoquan He
2025-11-05 8:35 ` Qiang Ma
@ 2025-11-05 8:48 ` Qiang Ma
1 sibling, 0 replies; 21+ messages in thread
From: Qiang Ma @ 2025-11-05 8:48 UTC (permalink / raw)
To: Baoquan He; +Cc: akpm, kexec, linux-kernel, kernel test robot
在 2025/11/5 15:53, Baoquan He 写道:
> On 11/05/25 at 11:41am, Qiang Ma wrote:
>> 在 2025/11/5 11:01, Baoquan He 写道:
>>> On 11/03/25 at 02:34pm, Qiang Ma wrote:
>>>> The commit a85ee18c7900 ("kexec_file: print out debugging message
>>>> if required") has added general code printing in kexec_file_load(),
>>>> but not in kexec_load().
>>>>
>>>> Especially in the RISC-V architecture, kexec_image_info() has been
>>>> removed(commit eb7622d908a0 ("kexec_file, riscv: print out debugging
>>>> message if required")). As a result, when using '-d' for the kexec_load
>>>> interface, print nothing in the kernel space. This might be helpful for
>>>> verifying the accuracy of the data passed to the kernel. Therefore,
>>>> refer to this commit a85ee18c7900 ("kexec_file: print out debugging
>>>> message if required"), debug print information has been added.
>>>>
>>>> Signed-off-by: Qiang Ma <maqianga@uniontech.com>
>>>> Reported-by: kernel test robot <lkp@intel.com>
>>>> Closes: https://lore.kernel.org/oe-kbuild-all/202510310332.6XrLe70K-lkp@intel.com/
>>>> ---
>>>> kernel/kexec.c | 11 +++++++++++
>>>> 1 file changed, 11 insertions(+)
>>>>
>>>> diff --git a/kernel/kexec.c b/kernel/kexec.c
>>>> index c7a869d32f87..9b433b972cc1 100644
>>>> --- a/kernel/kexec.c
>>>> +++ b/kernel/kexec.c
>>>> @@ -154,7 +154,15 @@ static int do_kexec_load(unsigned long entry, unsigned long nr_segments,
>>>> if (ret)
>>>> goto out;
>>>> + kexec_dprintk("nr_segments = %lu\n", nr_segments);
>>>> for (i = 0; i < nr_segments; i++) {
>>>> + struct kexec_segment *ksegment;
>>>> +
>>>> + ksegment = &image->segment[i];
>>>> + kexec_dprintk("segment[%lu]: buf=0x%p bufsz=0x%zx mem=0x%lx memsz=0x%zx\n",
>>>> + i, ksegment->buf, ksegment->bufsz, ksegment->mem,
>>>> + ksegment->memsz);
>>> There has already been a print_segments() in kexec-tools/kexec/kexec.c,
>>> you will get duplicated printing. That sounds not good. Have you tested
>>> this?
>> I have tested it, kexec-tools is the debug message printed
>> in user space, while kexec_dprintk is printed
>> in kernel space.
>>
>> This might be helpful for verifying the accuracy of
>> the data passed to the kernel.
> Hmm, that's not necessary with a debug printing to verify value passed
> in kernel. We should only add debug pringing when we need but lack it.
> I didn't check it carefully, if you add the debug printing only for
> verifying accuracy, that doesn't justify the code change.
>
Also, adding these prints here is helpful for debugging the
kimage_load_segment().
>>>> +
>>>> ret = kimage_load_segment(image, i);
>>>> if (ret)
>>>> goto out;
>>>> @@ -166,6 +174,9 @@ static int do_kexec_load(unsigned long entry, unsigned long nr_segments,
>>>> if (ret)
>>>> goto out;
>>>> + kexec_dprintk("kexec_load: type:%u, start:0x%lx head:0x%lx flags:0x%lx\n",
>>>> + image->type, image->start, image->head, flags);
>>>> +
>>>> /* Install the new kernel and uninstall the old */
>>>> image = xchg(dest_image, image);
>>>> --
>>>> 2.20.1
>>>>
>
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v2 3/4] kexec: print out debugging message if required for kexec_load
2025-11-05 8:35 ` Qiang Ma
@ 2025-11-05 8:55 ` Baoquan He
2025-11-05 11:28 ` Qiang Ma
0 siblings, 1 reply; 21+ messages in thread
From: Baoquan He @ 2025-11-05 8:55 UTC (permalink / raw)
To: Qiang Ma; +Cc: akpm, kexec, linux-kernel, kernel test robot
On 11/05/25 at 04:35pm, Qiang Ma wrote:
>
> 在 2025/11/5 15:53, Baoquan He 写道:
> > On 11/05/25 at 11:41am, Qiang Ma wrote:
> > > 在 2025/11/5 11:01, Baoquan He 写道:
> > > > On 11/03/25 at 02:34pm, Qiang Ma wrote:
> > > > > The commit a85ee18c7900 ("kexec_file: print out debugging message
> > > > > if required") has added general code printing in kexec_file_load(),
> > > > > but not in kexec_load().
> > > > >
> > > > > Especially in the RISC-V architecture, kexec_image_info() has been
> > > > > removed(commit eb7622d908a0 ("kexec_file, riscv: print out debugging
> > > > > message if required")). As a result, when using '-d' for the kexec_load
> > > > > interface, print nothing in the kernel space. This might be helpful for
> > > > > verifying the accuracy of the data passed to the kernel. Therefore,
> > > > > refer to this commit a85ee18c7900 ("kexec_file: print out debugging
> > > > > message if required"), debug print information has been added.
> > > > >
> > > > > Signed-off-by: Qiang Ma <maqianga@uniontech.com>
> > > > > Reported-by: kernel test robot <lkp@intel.com>
> > > > > Closes: https://lore.kernel.org/oe-kbuild-all/202510310332.6XrLe70K-lkp@intel.com/
> > > > > ---
> > > > > kernel/kexec.c | 11 +++++++++++
> > > > > 1 file changed, 11 insertions(+)
> > > > >
> > > > > diff --git a/kernel/kexec.c b/kernel/kexec.c
> > > > > index c7a869d32f87..9b433b972cc1 100644
> > > > > --- a/kernel/kexec.c
> > > > > +++ b/kernel/kexec.c
> > > > > @@ -154,7 +154,15 @@ static int do_kexec_load(unsigned long entry, unsigned long nr_segments,
> > > > > if (ret)
> > > > > goto out;
> > > > > + kexec_dprintk("nr_segments = %lu\n", nr_segments);
> > > > > for (i = 0; i < nr_segments; i++) {
> > > > > + struct kexec_segment *ksegment;
> > > > > +
> > > > > + ksegment = &image->segment[i];
> > > > > + kexec_dprintk("segment[%lu]: buf=0x%p bufsz=0x%zx mem=0x%lx memsz=0x%zx\n",
> > > > > + i, ksegment->buf, ksegment->bufsz, ksegment->mem,
> > > > > + ksegment->memsz);
> > > > There has already been a print_segments() in kexec-tools/kexec/kexec.c,
> > > > you will get duplicated printing. That sounds not good. Have you tested
> > > > this?
> > > I have tested it, kexec-tools is the debug message printed
> > > in user space, while kexec_dprintk is printed
> > > in kernel space.
> > >
> > > This might be helpful for verifying the accuracy of
> > > the data passed to the kernel.
> > Hmm, that's not necessary with a debug printing to verify value passed
> > in kernel. We should only add debug pringing when we need but lack it.
> > I didn't check it carefully, if you add the debug printing only for
> > verifying accuracy, that doesn't justify the code change.
> It's not entirely because of it.
>
> Another reason is that for RISC-V, for kexec_file_load interface,
> kexec_image_info() was deleted at that time because the content
> has been printed out in generic code.
>
> However, these contents were not printed in kexec_load because
> kexec_image_info was deleted. So now it has been added.
print_segments() in kexec-tools/kexec/kexec.c is a generic function,
shouldn't you make it called in kexec-tools for risc-v? I am confused by
the purpose of this patchset.
> > > > > +
> > > > > ret = kimage_load_segment(image, i);
> > > > > if (ret)
> > > > > goto out;
> > > > > @@ -166,6 +174,9 @@ static int do_kexec_load(unsigned long entry, unsigned long nr_segments,
> > > > > if (ret)
> > > > > goto out;
> > > > > + kexec_dprintk("kexec_load: type:%u, start:0x%lx head:0x%lx flags:0x%lx\n",
> > > > > + image->type, image->start, image->head, flags);
> > > > > +
> > > > > /* Install the new kernel and uninstall the old */
> > > > > image = xchg(dest_image, image);
> > > > > --
> > > > > 2.20.1
> > > > >
> >
>
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v2 3/4] kexec: print out debugging message if required for kexec_load
2025-11-05 8:55 ` Baoquan He
@ 2025-11-05 11:28 ` Qiang Ma
2025-11-05 13:01 ` Baoquan He
0 siblings, 1 reply; 21+ messages in thread
From: Qiang Ma @ 2025-11-05 11:28 UTC (permalink / raw)
To: Baoquan He; +Cc: akpm, kexec, linux-kernel, kernel test robot
在 2025/11/5 16:55, Baoquan He 写道:
> On 11/05/25 at 04:35pm, Qiang Ma wrote:
>> 在 2025/11/5 15:53, Baoquan He 写道:
>>> On 11/05/25 at 11:41am, Qiang Ma wrote:
>>>> 在 2025/11/5 11:01, Baoquan He 写道:
>>>>> On 11/03/25 at 02:34pm, Qiang Ma wrote:
>>>>>> The commit a85ee18c7900 ("kexec_file: print out debugging message
>>>>>> if required") has added general code printing in kexec_file_load(),
>>>>>> but not in kexec_load().
>>>>>>
>>>>>> Especially in the RISC-V architecture, kexec_image_info() has been
>>>>>> removed(commit eb7622d908a0 ("kexec_file, riscv: print out debugging
>>>>>> message if required")). As a result, when using '-d' for the kexec_load
>>>>>> interface, print nothing in the kernel space. This might be helpful for
>>>>>> verifying the accuracy of the data passed to the kernel. Therefore,
>>>>>> refer to this commit a85ee18c7900 ("kexec_file: print out debugging
>>>>>> message if required"), debug print information has been added.
>>>>>>
>>>>>> Signed-off-by: Qiang Ma <maqianga@uniontech.com>
>>>>>> Reported-by: kernel test robot <lkp@intel.com>
>>>>>> Closes: https://lore.kernel.org/oe-kbuild-all/202510310332.6XrLe70K-lkp@intel.com/
>>>>>> ---
>>>>>> kernel/kexec.c | 11 +++++++++++
>>>>>> 1 file changed, 11 insertions(+)
>>>>>>
>>>>>> diff --git a/kernel/kexec.c b/kernel/kexec.c
>>>>>> index c7a869d32f87..9b433b972cc1 100644
>>>>>> --- a/kernel/kexec.c
>>>>>> +++ b/kernel/kexec.c
>>>>>> @@ -154,7 +154,15 @@ static int do_kexec_load(unsigned long entry, unsigned long nr_segments,
>>>>>> if (ret)
>>>>>> goto out;
>>>>>> + kexec_dprintk("nr_segments = %lu\n", nr_segments);
>>>>>> for (i = 0; i < nr_segments; i++) {
>>>>>> + struct kexec_segment *ksegment;
>>>>>> +
>>>>>> + ksegment = &image->segment[i];
>>>>>> + kexec_dprintk("segment[%lu]: buf=0x%p bufsz=0x%zx mem=0x%lx memsz=0x%zx\n",
>>>>>> + i, ksegment->buf, ksegment->bufsz, ksegment->mem,
>>>>>> + ksegment->memsz);
>>>>> There has already been a print_segments() in kexec-tools/kexec/kexec.c,
>>>>> you will get duplicated printing. That sounds not good. Have you tested
>>>>> this?
>>>> I have tested it, kexec-tools is the debug message printed
>>>> in user space, while kexec_dprintk is printed
>>>> in kernel space.
>>>>
>>>> This might be helpful for verifying the accuracy of
>>>> the data passed to the kernel.
>>> Hmm, that's not necessary with a debug printing to verify value passed
>>> in kernel. We should only add debug pringing when we need but lack it.
>>> I didn't check it carefully, if you add the debug printing only for
>>> verifying accuracy, that doesn't justify the code change.
>> It's not entirely because of it.
>>
>> Another reason is that for RISC-V, for kexec_file_load interface,
>> kexec_image_info() was deleted at that time because the content
>> has been printed out in generic code.
>>
>> However, these contents were not printed in kexec_load because
>> kexec_image_info was deleted. So now it has been added.
> print_segments() in kexec-tools/kexec/kexec.c is a generic function,
> shouldn't you make it called in kexec-tools for risc-v? I am confused by
> the purpose of this patchset.
There is a problem with what I expressed.
I don't want to add print_segments to riscv.
I want to add some debugging message(ksegment,kimage,flag) for kexec_load.
Although ksegment debugging message has been printed in kexec-tools,
it is still helpful for debugging the kernel space function.
>
>>>>>> +
>>>>>> ret = kimage_load_segment(image, i);
>>>>>> if (ret)
>>>>>> goto out;
>>>>>> @@ -166,6 +174,9 @@ static int do_kexec_load(unsigned long entry, unsigned long nr_segments,
>>>>>> if (ret)
>>>>>> goto out;
>>>>>> + kexec_dprintk("kexec_load: type:%u, start:0x%lx head:0x%lx flags:0x%lx\n",
>>>>>> + image->type, image->start, image->head, flags);
>>>>>> +
>>>>>> /* Install the new kernel and uninstall the old */
>>>>>> image = xchg(dest_image, image);
>>>>>> --
>>>>>> 2.20.1
>>>>>>
>
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v2 3/4] kexec: print out debugging message if required for kexec_load
2025-11-05 11:28 ` Qiang Ma
@ 2025-11-05 13:01 ` Baoquan He
2025-11-05 15:05 ` Qiang Ma
0 siblings, 1 reply; 21+ messages in thread
From: Baoquan He @ 2025-11-05 13:01 UTC (permalink / raw)
To: Qiang Ma; +Cc: akpm, kexec, linux-kernel, kernel test robot
On 11/05/25 at 07:28pm, Qiang Ma wrote:
>
> 在 2025/11/5 16:55, Baoquan He 写道:
> > On 11/05/25 at 04:35pm, Qiang Ma wrote:
> > > 在 2025/11/5 15:53, Baoquan He 写道:
> > > > On 11/05/25 at 11:41am, Qiang Ma wrote:
> > > > > 在 2025/11/5 11:01, Baoquan He 写道:
> > > > > > On 11/03/25 at 02:34pm, Qiang Ma wrote:
> > > > > > > The commit a85ee18c7900 ("kexec_file: print out debugging message
> > > > > > > if required") has added general code printing in kexec_file_load(),
> > > > > > > but not in kexec_load().
> > > > > > >
> > > > > > > Especially in the RISC-V architecture, kexec_image_info() has been
> > > > > > > removed(commit eb7622d908a0 ("kexec_file, riscv: print out debugging
> > > > > > > message if required")). As a result, when using '-d' for the kexec_load
> > > > > > > interface, print nothing in the kernel space. This might be helpful for
> > > > > > > verifying the accuracy of the data passed to the kernel. Therefore,
> > > > > > > refer to this commit a85ee18c7900 ("kexec_file: print out debugging
> > > > > > > message if required"), debug print information has been added.
> > > > > > >
> > > > > > > Signed-off-by: Qiang Ma <maqianga@uniontech.com>
> > > > > > > Reported-by: kernel test robot <lkp@intel.com>
> > > > > > > Closes: https://lore.kernel.org/oe-kbuild-all/202510310332.6XrLe70K-lkp@intel.com/
> > > > > > > ---
> > > > > > > kernel/kexec.c | 11 +++++++++++
> > > > > > > 1 file changed, 11 insertions(+)
> > > > > > >
> > > > > > > diff --git a/kernel/kexec.c b/kernel/kexec.c
> > > > > > > index c7a869d32f87..9b433b972cc1 100644
> > > > > > > --- a/kernel/kexec.c
> > > > > > > +++ b/kernel/kexec.c
> > > > > > > @@ -154,7 +154,15 @@ static int do_kexec_load(unsigned long entry, unsigned long nr_segments,
> > > > > > > if (ret)
> > > > > > > goto out;
> > > > > > > + kexec_dprintk("nr_segments = %lu\n", nr_segments);
> > > > > > > for (i = 0; i < nr_segments; i++) {
> > > > > > > + struct kexec_segment *ksegment;
> > > > > > > +
> > > > > > > + ksegment = &image->segment[i];
> > > > > > > + kexec_dprintk("segment[%lu]: buf=0x%p bufsz=0x%zx mem=0x%lx memsz=0x%zx\n",
> > > > > > > + i, ksegment->buf, ksegment->bufsz, ksegment->mem,
> > > > > > > + ksegment->memsz);
> > > > > > There has already been a print_segments() in kexec-tools/kexec/kexec.c,
> > > > > > you will get duplicated printing. That sounds not good. Have you tested
> > > > > > this?
> > > > > I have tested it, kexec-tools is the debug message printed
> > > > > in user space, while kexec_dprintk is printed
> > > > > in kernel space.
> > > > >
> > > > > This might be helpful for verifying the accuracy of
> > > > > the data passed to the kernel.
> > > > Hmm, that's not necessary with a debug printing to verify value passed
> > > > in kernel. We should only add debug pringing when we need but lack it.
> > > > I didn't check it carefully, if you add the debug printing only for
> > > > verifying accuracy, that doesn't justify the code change.
> > > It's not entirely because of it.
> > >
> > > Another reason is that for RISC-V, for kexec_file_load interface,
> > > kexec_image_info() was deleted at that time because the content
> > > has been printed out in generic code.
> > >
> > > However, these contents were not printed in kexec_load because
> > > kexec_image_info was deleted. So now it has been added.
> > print_segments() in kexec-tools/kexec/kexec.c is a generic function,
> > shouldn't you make it called in kexec-tools for risc-v? I am confused by
> > the purpose of this patchset.
> There is a problem with what I expressed.
> I don't want to add print_segments to riscv.
> I want to add some debugging message(ksegment,kimage,flag) for kexec_load.
>
> Although ksegment debugging message has been printed in kexec-tools,
> it is still helpful for debugging the kernel space function.
Sorry, I can't support that. We all prepare the loading segments for the
future jumping in kexec_tools if it's kexec_load interface. And calling
print_segments() to print those loading information is natural. Why do we
need print them two times for verifying if the printing is accuracy?
Could you explain why risc-v is special?
> >
> > > > > > > +
> > > > > > > ret = kimage_load_segment(image, i);
> > > > > > > if (ret)
> > > > > > > goto out;
> > > > > > > @@ -166,6 +174,9 @@ static int do_kexec_load(unsigned long entry, unsigned long nr_segments,
> > > > > > > if (ret)
> > > > > > > goto out;
> > > > > > > + kexec_dprintk("kexec_load: type:%u, start:0x%lx head:0x%lx flags:0x%lx\n",
> > > > > > > + image->type, image->start, image->head, flags);
> > > > > > > +
> > > > > > > /* Install the new kernel and uninstall the old */
> > > > > > > image = xchg(dest_image, image);
> > > > > > > --
> > > > > > > 2.20.1
> > > > > > >
> >
>
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v2 3/4] kexec: print out debugging message if required for kexec_load
2025-11-05 13:01 ` Baoquan He
@ 2025-11-05 15:05 ` Qiang Ma
0 siblings, 0 replies; 21+ messages in thread
From: Qiang Ma @ 2025-11-05 15:05 UTC (permalink / raw)
To: Baoquan He; +Cc: akpm, kexec, linux-kernel, kernel test robot
On 2025/11/5 下午9:01, Baoquan He wrote:
> On 11/05/25 at 07:28pm, Qiang Ma wrote:
>> 在 2025/11/5 16:55, Baoquan He 写道:
>>> On 11/05/25 at 04:35pm, Qiang Ma wrote:
>>>> 在 2025/11/5 15:53, Baoquan He 写道:
>>>>> On 11/05/25 at 11:41am, Qiang Ma wrote:
>>>>>> 在 2025/11/5 11:01, Baoquan He 写道:
>>>>>>> On 11/03/25 at 02:34pm, Qiang Ma wrote:
>>>>>>>> The commit a85ee18c7900 ("kexec_file: print out debugging message
>>>>>>>> if required") has added general code printing in kexec_file_load(),
>>>>>>>> but not in kexec_load().
>>>>>>>>
>>>>>>>> Especially in the RISC-V architecture, kexec_image_info() has been
>>>>>>>> removed(commit eb7622d908a0 ("kexec_file, riscv: print out debugging
>>>>>>>> message if required")). As a result, when using '-d' for the kexec_load
>>>>>>>> interface, print nothing in the kernel space. This might be helpful for
>>>>>>>> verifying the accuracy of the data passed to the kernel. Therefore,
>>>>>>>> refer to this commit a85ee18c7900 ("kexec_file: print out debugging
>>>>>>>> message if required"), debug print information has been added.
>>>>>>>>
>>>>>>>> Signed-off-by: Qiang Ma <maqianga@uniontech.com>
>>>>>>>> Reported-by: kernel test robot <lkp@intel.com>
>>>>>>>> Closes: https://lore.kernel.org/oe-kbuild-all/202510310332.6XrLe70K-lkp@intel.com/
>>>>>>>> ---
>>>>>>>> kernel/kexec.c | 11 +++++++++++
>>>>>>>> 1 file changed, 11 insertions(+)
>>>>>>>>
>>>>>>>> diff --git a/kernel/kexec.c b/kernel/kexec.c
>>>>>>>> index c7a869d32f87..9b433b972cc1 100644
>>>>>>>> --- a/kernel/kexec.c
>>>>>>>> +++ b/kernel/kexec.c
>>>>>>>> @@ -154,7 +154,15 @@ static int do_kexec_load(unsigned long entry, unsigned long nr_segments,
>>>>>>>> if (ret)
>>>>>>>> goto out;
>>>>>>>> + kexec_dprintk("nr_segments = %lu\n", nr_segments);
>>>>>>>> for (i = 0; i < nr_segments; i++) {
>>>>>>>> + struct kexec_segment *ksegment;
>>>>>>>> +
>>>>>>>> + ksegment = &image->segment[i];
>>>>>>>> + kexec_dprintk("segment[%lu]: buf=0x%p bufsz=0x%zx mem=0x%lx memsz=0x%zx\n",
>>>>>>>> + i, ksegment->buf, ksegment->bufsz, ksegment->mem,
>>>>>>>> + ksegment->memsz);
>>>>>>> There has already been a print_segments() in kexec-tools/kexec/kexec.c,
>>>>>>> you will get duplicated printing. That sounds not good. Have you tested
>>>>>>> this?
>>>>>> I have tested it, kexec-tools is the debug message printed
>>>>>> in user space, while kexec_dprintk is printed
>>>>>> in kernel space.
>>>>>>
>>>>>> This might be helpful for verifying the accuracy of
>>>>>> the data passed to the kernel.
>>>>> Hmm, that's not necessary with a debug printing to verify value passed
>>>>> in kernel. We should only add debug pringing when we need but lack it.
>>>>> I didn't check it carefully, if you add the debug printing only for
>>>>> verifying accuracy, that doesn't justify the code change.
>>>> It's not entirely because of it.
>>>>
>>>> Another reason is that for RISC-V, for kexec_file_load interface,
>>>> kexec_image_info() was deleted at that time because the content
>>>> has been printed out in generic code.
>>>>
>>>> However, these contents were not printed in kexec_load because
>>>> kexec_image_info was deleted. So now it has been added.
>>> print_segments() in kexec-tools/kexec/kexec.c is a generic function,
>>> shouldn't you make it called in kexec-tools for risc-v? I am confused by
>>> the purpose of this patchset.
>> There is a problem with what I expressed.
>> I don't want to add print_segments to riscv.
>> I want to add some debugging message(ksegment,kimage,flag) for kexec_load.
>>
>> Although ksegment debugging message has been printed in kexec-tools,
>> it is still helpful for debugging the kernel space function.
> Sorry, I can't support that. We all prepare the loading segments for the
> future jumping in kexec_tools if it's kexec_load interface. And calling
> print_segments() to print those loading information is natural. Why do we
> need print them two times for verifying if the printing is accuracy?
Is it necessary to verify the user-space data after it is passed to the
kernel space?
> Could you explain why risc-v is special?
At first, when I saw that in the RISC-V architecture,
after kexec_image_info was removed from this commit eb7622d908a0
("kexec_file, riscv: print out debugging message if required"),
I thought only kexec_file_load was taken into consideration.
However, without considering that kexec_load would call
kexec_image_info to print segment and other debugging message,
I think that since it has been deleted.
Then, I referred to kexec_file_load and added these debugging message
to the general code of kexec_load. In this way, all architectures can
print these general debugging message.
Then I can add these debugging message to the general code,
so that all architectures can print these general debugging message.
>>>>>>>> +
>>>>>>>> ret = kimage_load_segment(image, i);
>>>>>>>> if (ret)
>>>>>>>> goto out;
>>>>>>>> @@ -166,6 +174,9 @@ static int do_kexec_load(unsigned long entry, unsigned long nr_segments,
>>>>>>>> if (ret)
>>>>>>>> goto out;
>>>>>>>> + kexec_dprintk("kexec_load: type:%u, start:0x%lx head:0x%lx flags:0x%lx\n",
>>>>>>>> + image->type, image->start, image->head, flags);
>>>>>>>> +
>>>>>>>> /* Install the new kernel and uninstall the old */
>>>>>>>> image = xchg(dest_image, image);
>>>>>>>> --
>>>>>>>> 2.20.1
>>>>>>>>
>
^ permalink raw reply [flat|nested] 21+ messages in thread
end of thread, other threads:[~2025-11-05 15:06 UTC | newest]
Thread overview: 21+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-11-03 6:34 [PATCH v2 0/4] kexec: print out debugging message if required for kexec_load Qiang Ma
2025-11-03 6:34 ` [PATCH v2 1/4] kexec: Fix uninitialized struct kimage *image pointer Qiang Ma
2025-11-03 6:34 ` [PATCH v2 2/4] kexec: add kexec_core flag to control debug printing Qiang Ma
2025-11-05 3:09 ` Baoquan He
2025-11-05 4:32 ` Qiang Ma
2025-11-03 6:34 ` [PATCH v2 3/4] kexec: print out debugging message if required for kexec_load Qiang Ma
2025-11-05 3:01 ` Baoquan He
2025-11-05 3:41 ` Qiang Ma
2025-11-05 7:53 ` Baoquan He
2025-11-05 8:35 ` Qiang Ma
2025-11-05 8:55 ` Baoquan He
2025-11-05 11:28 ` Qiang Ma
2025-11-05 13:01 ` Baoquan He
2025-11-05 15:05 ` Qiang Ma
2025-11-05 8:48 ` Qiang Ma
2025-11-03 6:34 ` [PATCH v2 4/4] kexec_file: Fix the issue of mismatch between loop variable types Qiang Ma
2025-11-05 3:05 ` Baoquan He
2025-11-05 3:47 ` Qiang Ma
2025-11-05 6:56 ` Baoquan He
2025-11-05 7:06 ` Qiang Ma
[not found] ` <c669d240-1ee8-4897-a30d-3efefe161085@uniontech.com>
2025-11-05 4:31 ` Qiang Ma
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox