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 <[email protected]>
Reported-by: kernel test robot <[email protected]>
Closes:
https://lore.kernel.org/oe-kbuild-all/[email protected]/
---
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