[PATCH v5][makedumpfile 6/9] Add makedumpfile extensions support
Tao Liu
ltao at redhat.com
Tue Jun 16 03:31:46 PDT 2026
Hi Kazu,
On Tue, Jun 16, 2026 at 07:51:47AM +0000, HAGIO KAZUHITO(萩尾 一仁) wrote:
> On 2026/06/16 11:17, Tao Liu wrote:
> > On Tue, Jun 16, 2026 at 1:39 PM HAGIO KAZUHITO(萩尾 一仁)
> > <k-hagio-ab at nec.com> wrote:
> >>
> >> On 2026/06/16 8:03, Tao Liu wrote:
> >>> Hi Stephen & Kazu,
> >>>
> >>> On Tue, Jun 16, 2026 at 5:12 AM Stephen Brennan
> >>> <stephen.s.brennan at oracle.com> wrote:
> >>>>
> >>>> HAGIO KAZUHITO(萩尾 一仁) <k-hagio-ab at nec.com> writes:
> >>>>> On 2026/04/14 19:26, Tao Liu wrote:
> >>>>>
> >>>>>> +static bool init_kallsyms_btf(void)
> >>>>>> +{
> >>>>>> + int count;
> >>>>>> + bool ret = false;
> >>>>>> + /* We will load module's btf/kallsyms on demand */
> >>>>>> + bool init_ksyms_module = false;
> >>>>>> + bool init_ktypes_module = false;
> >>>>>> +
> >>>>>> + if (check_ksyms_require_modname("vmlinux", &count)) {
> >>>>>
> >>>>> Thank you for the explanation [1].
> >>>>>
> >>>>> so which code path adds "vmlinux" to the mods array before this line?
> >>>>> I could not find it.
> >>>>
> >>>> Hello Kazu,
> >>>>
> >>>> In kallsyms.c from patch 2, there is the line:
> >>>> INIT_MOD_SYM(vmlinux, _stext);
> >>>> This adds a struct ksym_info to the main makedumpfile executable's
> >>>> array, which requests symbol "_stext" from vmlinux.
> >>>>
> >>>> In kallsyms.c "init_kernel_kallsyms()", again from patch 2, the first
> >>>> step is to call:
> >>>> register_ksym_section((char *)__start_init_ksyms,
> >>>> (char *)__stop_init_ksyms))
> >>>> Which is a function generated by the macro REGISTER_SECTION(). The
> >>>> implementation will use add_ksym_modname() whens it encounters this
> >>>> symbol, ensuring that "vmlinux" is part of the modname array.
> >>>
> >>> Thanks for the detailed info, yes, it is exactly how "vmlinux" is
> >>> added to the array.
> >>
> >> hmm, maybe I still misread it though..
> >>
> >> The init_kernel_kallsyms() is called _after_ check_ksyms_require_modname().
> >> so I've meant that if no extension adds "vmlinux" to the modname array,
> >> no one calls it. is it ok?
> >>
> >> if (check_ksyms_require_modname("vmlinux", &count)) {
> >> if (!init_kernel_kallsyms())
> >
> > No, even if you create a extension which doesn't require symbols from
> > "vmlinux", once you load it, the check_ksyms_require_modname() will
> > still be true and init_kernel_kallsyms() is called.
> >
> > The reason is, with the introduction of makedumpfile.ld, and the line
> > "INIT_MOD_SYM(vmlinux, _stext);" in kallsyms.c, makedumpfile and
> > extensions have a similar section structure, you can regard
> > makedumpfile itself as an extension:
> >
> > $ readelf -S makedumpfile | grep -E 'ksyms|ktypes'
> > [25] .init_ksyms PROGBITS 000000000046ee90 0006de90
> > [26] .init_ktypes PROGBITS 000000000046eeb8 0006deb8
> > $ readelf -S extensions/sample.so | grep -E 'ksyms|ktypes'
> > [24] .init_ksyms PROGBITS 0000000000003108 00002108
> > [25] .init_ktypes PROGBITS 0000000000003110 00002110
> >
> > If makedumpfile doesn't load any extensions, then makedumpfile doesn't
> > need to initialize its .init_ksyms/ktypes section, the behaviour stays
> > the same as before;
> > If makedumpfile load at least one extensions, then the extension
> > subsystem will register all .init_ksyms/ktypes sections, both
> > extenison's and makedumpfile's.
> >
> > This is like, extension say "I need sym1 & sym2 to be ready before I
> > can run", then makedumpfile say "OK, I got it, but before I can
> > resolve your sym1 & sym2, I need to resolve some symbol(e.g. vmlinux's
> > _stext) formyself first". So check_ksyms_require_modname("vmlinux",
> > &count) will be true.
>
> hmm, but as far as I've tested with "extensions/sample.c" on RHEL10.2:
>
> 1) add INIT_MOD_SYM(xfs, xfsstats) and GET_MOD_SYM(xfs, xfsstats)
>
> ok
>
> Loaded extension: /share/tmp/makedumpfile/extensions/sample.so
> sample.so: The address of xfsstats is: ffffffffc0c0b540 <<--- ok
> sample.so: The address of init_task is: ffffffffb4412940
> sample.so: The size of task_struct is: 10240 bytes
> sample.so: The offset of member mm within task_struct is: 2704 bytes
> sample.so: The size of member mm within task_struct is: 8 bytes
> sample.so: Your kernel is using maple tree in mm_struct
>
> 2) remove all "vmlinux" entries (only INIT_MOD_SYM(xfs, xfsstats))
>
> skipped
>
> Loaded extension: /share/tmp/makedumpfile/extensions/sample.so
> check_required_ksyms_all_resolved: Symbol xfsstats in xfs not found
> init_extensions: Skip 1th extension
>
This is a bug which shouldn't happen, thanks for pointing it out.
> 3) restore INIT_MOD_SYM(vmlinux, init_task) and GET_MOD_SYM(vmlinux, init_task)
>
> still skipped
>
> Loaded extension: /share/tmp/makedumpfile/extensions/sample.so
> check_required_ksyms_all_resolved: Symbol xfsstats in xfs not found
> init_extensions: Skip 1th extension
>
Also a bug. I made a code modification based on the v5 to fix, could you please
give a try? If no problem I will integrate it with v6.
diff --git a/btf_info.c b/btf_info.c
index 1506152..fbb487b 100644
--- a/btf_info.c
+++ b/btf_info.c
@@ -202,10 +202,6 @@ bool init_kernel_btf(void)
goto out;
}
- if (!register_ktype_section((char *)__start_init_ktypes,
- (char *)__stop_init_ktypes))
- return ret;
-
size = stop_btf - start_btf;
buf = (char *)malloc(size);
if (!buf) {
diff --git a/extension.c b/extension.c
index 190dd9e..276ffb1 100644
--- a/extension.c
+++ b/extension.c
@@ -153,7 +153,7 @@ static void load_extensions(void)
}
}
-static bool register_extension_sections(void)
+static bool register_ksyms_ktypes_sections(void)
{
char *start, *stop;
int i;
@@ -170,6 +170,18 @@ static bool register_extension_sections(void)
if (!register_ktype_section(start, stop))
goto out;
}
+ /* If no extensions, don't register makedumpfile's section */
+ if (handle_cbs_len > 0) {
+ start = dlsym(NULL, "__start_init_ksyms");
+ stop = dlsym(NULL, "__stop_init_ksyms");
+ if (!register_ksym_section(start, stop))
+ goto out;
+
+ start = dlsym(NULL, "__start_init_ktypes");
+ stop = dlsym(NULL, "__stop_init_ktypes");
+ if (!register_ktype_section(start, stop))
+ goto out;
+ }
ret = true;
out:
return ret;
@@ -260,7 +272,7 @@ void init_extensions(void)
void (*init)(void);
load_extensions();
- if (!register_extension_sections())
+ if (!register_ksyms_ktypes_sections())
goto fail;
if (!init_kallsyms_btf())
goto fail;
diff --git a/kallsyms.c b/kallsyms.c
index f231a06..0037600 100644
--- a/kallsyms.c
+++ b/kallsyms.c
@@ -276,10 +276,6 @@ bool init_kernel_kallsyms(void)
return ret;
}
- if (!register_ksym_section((char *)__start_init_ksyms,
- (char *)__stop_init_ksyms))
- return ret;
-
if (!readmem(VADDR, SYMBOL(kallsyms_num_syms), &kallsyms_num_syms,
sizeof(kallsyms_num_syms))) {
ERRMSG("Can't get kallsyms_num_syms!\n");
> 4) also restore INIT_MOD_STRUCT_MEMBER(vmlinux, task_struct, mm) and
> GET_MOD_STRUCT_MEMBER_SSIZE(vmlinux, task_struct, mm)
>
> ok
>
> Loaded extension: /share/tmp/makedumpfile/extensions/sample.so
> sample.so: The address of xfsstats is: ffffffffc0c0b540
> sample.so: The address of init_task is: ffffffffb4412940
> sample.so: The size of task_struct is: 10240 bytes
>
>
> So, it looks like, with the current condition check in init_kallsyms_btf()
> (check_ksyms_require_modname and check_ktypes_require_modname),
> a module needs to use INIT_* for vmlinux's kallsyms and BTF.
>
> I'm still missing something..?
>
> Thanks,
> Kazu
More information about the kexec
mailing list