Hi all,
After merging the arm64 tree, today's linux-next build (arm64 defconfig)
produced this warning:
WARNING: modpost: vmlinux: section mismatch in reference: __pi_$x+0x38 (section: .text) -> __pi_map_range (section: .init.text)
I don't know what caused this.
--
Cheers,
Stephen Rothwell
+ Ard
On Tue, Oct 24, 2023 at 05:24:09PM +1100, Stephen Rothwell wrote:
> After merging the arm64 tree, today's linux-next build (arm64 defconfig)
> produced this warning:
>
> WARNING: modpost: vmlinux: section mismatch in reference: __pi_$x+0x38 (section: .text) -> __pi_map_range (section: .init.text)
>
> I don't know what caused this.
For some reason, building linux-next doesn't inline all the functions in
the map_range.c file and we end up with some of them in different
sections. I didn't get this when building the arm64 for-next/core
separately.
My fix (I'll push it to the arm64 branch):
diff --git a/arch/arm64/kernel/pi/map_kernel.c b/arch/arm64/kernel/pi/map_kernel.c
index be7caf07bfa7..e07f3ece5430 100644
--- a/arch/arm64/kernel/pi/map_kernel.c
+++ b/arch/arm64/kernel/pi/map_kernel.c
@@ -20,17 +20,17 @@ extern const u8 __eh_frame_start[], __eh_frame_end[];
extern void idmap_cpu_replace_ttbr1(void *pgdir);
-static void map_segment(pgd_t *pg_dir, u64 *pgd, u64 va_offset,
- void *start, void *end, pgprot_t prot,
- bool may_use_cont, int root_level)
+static void __init map_segment(pgd_t *pg_dir, u64 *pgd, u64 va_offset,
+ void *start, void *end, pgprot_t prot,
+ bool may_use_cont, int root_level)
{
map_range(pgd, ((u64)start + va_offset) & ~PAGE_OFFSET,
((u64)end + va_offset) & ~PAGE_OFFSET, (u64)start,
prot, root_level, (pte_t *)pg_dir, may_use_cont, 0);
}
-static void unmap_segment(pgd_t *pg_dir, u64 va_offset, void *start,
- void *end, int root_level)
+static void __init unmap_segment(pgd_t *pg_dir, u64 va_offset, void *start,
+ void *end, int root_level)
{
map_segment(pg_dir, NULL, va_offset, start, end, __pgprot(0),
false, root_level);
@@ -205,7 +205,7 @@ static void __init remap_idmap_for_lpa2(void)
memset(init_pg_dir, 0, (u64)init_pg_end - (u64)init_pg_dir);
}
-static void map_fdt(u64 fdt)
+static void __init map_fdt(u64 fdt)
{
static u8 ptes[INIT_IDMAP_FDT_SIZE] __initdata __aligned(PAGE_SIZE);
u64 efdt = fdt + MAX_FDT_SIZE;
--
Catalin
On Tue, 24 Oct 2023 at 11:55, Catalin Marinas <[email protected]> wrote:
>
> + Ard
>
> On Tue, Oct 24, 2023 at 05:24:09PM +1100, Stephen Rothwell wrote:
> > After merging the arm64 tree, today's linux-next build (arm64 defconfig)
> > produced this warning:
> >
> > WARNING: modpost: vmlinux: section mismatch in reference: __pi_$x+0x38 (section: .text) -> __pi_map_range (section: .init.text)
> >
> > I don't know what caused this.
>
> For some reason, building linux-next doesn't inline all the functions in
> the map_range.c file and we end up with some of them in different
> sections. I didn't get this when building the arm64 for-next/core
> separately.
>
Strange, I never ran into this before.
I guess commit 24cc769d70d8bda055a028aa6a is implicated in this, if we
run into more trouble like this i'll look whether we can bring that
logic back in some way.
The fix looks fine to me.
> My fix (I'll push it to the arm64 branch):
>
> diff --git a/arch/arm64/kernel/pi/map_kernel.c b/arch/arm64/kernel/pi/map_kernel.c
> index be7caf07bfa7..e07f3ece5430 100644
> --- a/arch/arm64/kernel/pi/map_kernel.c
> +++ b/arch/arm64/kernel/pi/map_kernel.c
> @@ -20,17 +20,17 @@ extern const u8 __eh_frame_start[], __eh_frame_end[];
>
> extern void idmap_cpu_replace_ttbr1(void *pgdir);
>
> -static void map_segment(pgd_t *pg_dir, u64 *pgd, u64 va_offset,
> - void *start, void *end, pgprot_t prot,
> - bool may_use_cont, int root_level)
> +static void __init map_segment(pgd_t *pg_dir, u64 *pgd, u64 va_offset,
> + void *start, void *end, pgprot_t prot,
> + bool may_use_cont, int root_level)
> {
> map_range(pgd, ((u64)start + va_offset) & ~PAGE_OFFSET,
> ((u64)end + va_offset) & ~PAGE_OFFSET, (u64)start,
> prot, root_level, (pte_t *)pg_dir, may_use_cont, 0);
> }
>
> -static void unmap_segment(pgd_t *pg_dir, u64 va_offset, void *start,
> - void *end, int root_level)
> +static void __init unmap_segment(pgd_t *pg_dir, u64 va_offset, void *start,
> + void *end, int root_level)
> {
> map_segment(pg_dir, NULL, va_offset, start, end, __pgprot(0),
> false, root_level);
> @@ -205,7 +205,7 @@ static void __init remap_idmap_for_lpa2(void)
> memset(init_pg_dir, 0, (u64)init_pg_end - (u64)init_pg_dir);
> }
>
> -static void map_fdt(u64 fdt)
> +static void __init map_fdt(u64 fdt)
> {
> static u8 ptes[INIT_IDMAP_FDT_SIZE] __initdata __aligned(PAGE_SIZE);
> u64 efdt = fdt + MAX_FDT_SIZE;
>
On Tue, Oct 24, 2023 at 03:42:20PM +0200, Ard Biesheuvel wrote:
> On Tue, 24 Oct 2023 at 11:55, Catalin Marinas <[email protected]> wrote:
> >
> > + Ard
> >
> > On Tue, Oct 24, 2023 at 05:24:09PM +1100, Stephen Rothwell wrote:
> > > After merging the arm64 tree, today's linux-next build (arm64 defconfig)
> > > produced this warning:
> > >
> > > WARNING: modpost: vmlinux: section mismatch in reference: __pi_$x+0x38 (section: .text) -> __pi_map_range (section: .init.text)
> > >
> > > I don't know what caused this.
> >
> > For some reason, building linux-next doesn't inline all the functions in
> > the map_range.c file and we end up with some of them in different
> > sections. I didn't get this when building the arm64 for-next/core
> > separately.
> >
>
> Strange, I never ran into this before.
>
> I guess commit 24cc769d70d8bda055a028aa6a is implicated in this, if we
> run into more trouble like this i'll look whether we can bring that
> logic back in some way.
>
> The fix looks fine to me.
Thanks. I applied this fix locally (will push it out in a bit). I added
a fixes tag for a latter commit introducing map_segment() etc.
--
Catalin