diff mbox series

arch/arc: Explicitly set "max-page-size" for GNU LD

Message ID 20191224141032.34544-1-abrodkin@synopsys.com
State Accepted
Headers show
Series arch/arc: Explicitly set "max-page-size" for GNU LD | expand

Commit Message

Alexey Brodkin Dec. 24, 2019, 2:10 p.m. UTC
Back in the day we relied on a default value that used to be 8KiB
and it worked perfectly fine for ARC's default 8KiB page as well as
4 KiB ones, but not for 16 KiB, see [1] for more details.

So that we fixed by setting "max-page-size" if 16KiB pages are in use by
commit d024d369b82d2 ("arch/arc: Accommodate 16 KiB MMU pages").

But as Yann very rightfully mentioned here [2] we should be setting this
thing explicitly for all page sizes because:
 1. Defaults might change unexpectedly
 2. Explicitly set stuff is better understood
 3. We act similarly to all settings but not only addressing some corner cases

[1] https://git.buildroot.org/buildroot/commit/?id=d024d369b82d2d3d9d4d75489c19e9488202bca0
[2] https://patchwork.ozlabs.org/patch/1212544/#2330647

Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>
Cc: Yann E. MORIN <yann.morin.1998@free.fr>
---
 arch/arch.mk.arc | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

Comments

Thomas Petazzoni Dec. 25, 2019, 9:36 p.m. UTC | #1
On Tue, 24 Dec 2019 17:10:32 +0300
Alexey Brodkin <Alexey.Brodkin@synopsys.com> wrote:

> Back in the day we relied on a default value that used to be 8KiB
> and it worked perfectly fine for ARC's default 8KiB page as well as
> 4 KiB ones, but not for 16 KiB, see [1] for more details.
> 
> So that we fixed by setting "max-page-size" if 16KiB pages are in use by
> commit d024d369b82d2 ("arch/arc: Accommodate 16 KiB MMU pages").
> 
> But as Yann very rightfully mentioned here [2] we should be setting this
> thing explicitly for all page sizes because:
>  1. Defaults might change unexpectedly
>  2. Explicitly set stuff is better understood
>  3. We act similarly to all settings but not only addressing some corner cases
> 
> [1] https://git.buildroot.org/buildroot/commit/?id=d024d369b82d2d3d9d4d75489c19e9488202bca0
> [2] https://patchwork.ozlabs.org/patch/1212544/#2330647
> 
> Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>
> Cc: Yann E. MORIN <yann.morin.1998@free.fr>

I have applied to master, with one change (see below), and I have one
suggestion (see below as well).


> -# By default MAXPAGESIZE for ARC is 8192 so for larger MMU pages
> -# it needs to be overridden.
> +# Explicitly set LD's "max-page-size" instead of relying on some defaults
> +ifeq ($(BR2_ARC_PAGE_SIZE_4K),y)
> +ARCH_TOOLCHAIN_WRAPPER_OPTS += -Wl,-z,max-page-size=4096
> +endif
> +
> +ifeq ($(BR2_ARC_PAGE_SIZE_8K),y)
> +ARCH_TOOLCHAIN_WRAPPER_OPTS += -Wl,-z,max-page-size=8192
> +endif
> +
>  ifeq ($(BR2_ARC_PAGE_SIZE_16K),y)
>  ARCH_TOOLCHAIN_WRAPPER_OPTS += -Wl,-z,max-page-size=16384
>  endif

Since these options are mutually exclusive:

ifeq ($(BR2_ARC_PAGE_SIZE_4K),y)
ARCH_TOOLCHAIN_WRAPPER_OPTS += -Wl,-z,max-page-size=4096
else ifeq ($(BR2_ARC_PAGE_SIZE_8K),y)
ARCH_TOOLCHAIN_WRAPPER_OPTS += -Wl,-z,max-page-size=8192
else ifeq ($(BR2_ARC_PAGE_SIZE_16K),y)
ARCH_TOOLCHAIN_WRAPPER_OPTS += -Wl,-z,max-page-size=16384
endif

is a bit more compact, so I changed to use this before committing.

Also, we already have an option called BR2_ARC_PAGE_SIZE, which
contains 4K, 8K or 16K, so I thought if we could use it here as well. I
think we can, but I'd like to hear from Yann about this, because it
uses bash arithmetic, which I'm not sure we're allowed to use:

ARCH_TOOLCHAIN_WRAPPER_OPTS += -Wl,-z,max-page-size=$(shell echo $$(($(patsubst %K,%,$(BR2_ARC_PAGE_SIZE)) * 1024)))

Best regards,

Thomas
Yann E. MORIN Dec. 26, 2019, 5:05 p.m. UTC | #2
Thomas, Alexey, All,

On 2019-12-25 22:36 +0100, Thomas Petazzoni spake thusly:
> On Tue, 24 Dec 2019 17:10:32 +0300
> Alexey Brodkin <Alexey.Brodkin@synopsys.com> wrote:
> > Back in the day we relied on a default value that used to be 8KiB
> > and it worked perfectly fine for ARC's default 8KiB page as well as
> > 4 KiB ones, but not for 16 KiB, see [1] for more details.
> > 
> > So that we fixed by setting "max-page-size" if 16KiB pages are in use by
> > commit d024d369b82d2 ("arch/arc: Accommodate 16 KiB MMU pages").
> > 
> > But as Yann very rightfully mentioned here [2] we should be setting this
> > thing explicitly for all page sizes because:
> >  1. Defaults might change unexpectedly
> >  2. Explicitly set stuff is better understood
> >  3. We act similarly to all settings but not only addressing some corner cases
> > 
> > [1] https://git.buildroot.org/buildroot/commit/?id=d024d369b82d2d3d9d4d75489c19e9488202bca0
> > [2] https://patchwork.ozlabs.org/patch/1212544/#2330647
> > 
> > Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>
> > Cc: Yann E. MORIN <yann.morin.1998@free.fr>
> 
> > -# By default MAXPAGESIZE for ARC is 8192 so for larger MMU pages
> > -# it needs to be overridden.
> > +# Explicitly set LD's "max-page-size" instead of relying on some defaults
> > +ifeq ($(BR2_ARC_PAGE_SIZE_4K),y)
> > +ARCH_TOOLCHAIN_WRAPPER_OPTS += -Wl,-z,max-page-size=4096
> > +endif
> > +
> > +ifeq ($(BR2_ARC_PAGE_SIZE_8K),y)
> > +ARCH_TOOLCHAIN_WRAPPER_OPTS += -Wl,-z,max-page-size=8192
> > +endif
> > +
> >  ifeq ($(BR2_ARC_PAGE_SIZE_16K),y)
> >  ARCH_TOOLCHAIN_WRAPPER_OPTS += -Wl,-z,max-page-size=16384
> >  endif
> 
> Since these options are mutually exclusive:
> 
> ifeq ($(BR2_ARC_PAGE_SIZE_4K),y)
> ARCH_TOOLCHAIN_WRAPPER_OPTS += -Wl,-z,max-page-size=4096
> else ifeq ($(BR2_ARC_PAGE_SIZE_8K),y)
> ARCH_TOOLCHAIN_WRAPPER_OPTS += -Wl,-z,max-page-size=8192
> else ifeq ($(BR2_ARC_PAGE_SIZE_16K),y)
> ARCH_TOOLCHAIN_WRAPPER_OPTS += -Wl,-z,max-page-size=16384
> endif
> 
> is a bit more compact, so I changed to use this before committing.

Agreed.

> Also, we already have an option called BR2_ARC_PAGE_SIZE, which
> contains 4K, 8K or 16K, so I thought if we could use it here as well. I
> think we can, but I'd like to hear from Yann about this, because it
> uses bash arithmetic, which I'm not sure we're allowed to use:
> 
> ARCH_TOOLCHAIN_WRAPPER_OPTS += -Wl,-z,max-page-size=$(shell echo $$(($(patsubst %K,%,$(BR2_ARC_PAGE_SIZE)) * 1024)))

We can do bash arithmetics, because we are guaranteed we use bash as our
shell, see: https://git.buildroot.org/buildroot/tree/Makefile#n30

But BR2_ARC_PAGE_SIZE is a string, so it is double-quoted, which would
break the above.

I was also contemplating a similar solution, but I was not too happy
with this trick to drop the suffix. I would have prefered something
like:

    config BR2_ARC_PAGE_SIZE_KB
        int
        default 4 if BR2_ARC_PAGE_SIZE_4K
        default 8 if BR2_ARC_PAGE_SIZE_8K
        default 16 if BR2_ARC_PAGE_SIZE_16K

and then:

    ARCH_TOOLCHAIN_WRAPPER_OPTS += -Wl,-z,max-page-size=$(shell echo $$(($(BR2_ARC_PAGE_SIZE)*1024)))

and in package/uclibc/uclibc.mk:

    UCLIBC_ARC_PAGE_SIZE = CONFIG_ARC_PAGE_SIZE_$(BR2_ARC_PAGE_SIZE)K

... and even that intermediate variable could have been dropped
altogether, to directly write:

        $(call KCONFIG_ENABLE_OPT,CONFIG_ARC_PAGE_SIZE_$(BR2_ARC_PAGE_SIZE)K,$(@D)/.config)

And that would have been a bit nicer, I believe.

Regards,
Yann E. MORIN.

> Best regards,
> 
> Thomas
> -- 
> Thomas Petazzoni, CTO, Bootlin
> Embedded Linux and Kernel engineering
> https://bootlin.com
Alexey Brodkin Dec. 27, 2019, 9 a.m. UTC | #3
Hi Yann, Thomas,

[snip]

> > > -# By default MAXPAGESIZE for ARC is 8192 so for larger MMU pages
> > > -# it needs to be overridden.
> > > +# Explicitly set LD's "max-page-size" instead of relying on some defaults
> > > +ifeq ($(BR2_ARC_PAGE_SIZE_4K),y)
> > > +ARCH_TOOLCHAIN_WRAPPER_OPTS += -Wl,-z,max-page-size=4096
> > > +endif
> > > +
> > > +ifeq ($(BR2_ARC_PAGE_SIZE_8K),y)
> > > +ARCH_TOOLCHAIN_WRAPPER_OPTS += -Wl,-z,max-page-size=8192
> > > +endif
> > > +
> > >  ifeq ($(BR2_ARC_PAGE_SIZE_16K),y)
> > >  ARCH_TOOLCHAIN_WRAPPER_OPTS += -Wl,-z,max-page-size=16384
> > >  endif
> >
> > Since these options are mutually exclusive:
> >
> > ifeq ($(BR2_ARC_PAGE_SIZE_4K),y)
> > ARCH_TOOLCHAIN_WRAPPER_OPTS += -Wl,-z,max-page-size=4096
> > else ifeq ($(BR2_ARC_PAGE_SIZE_8K),y)
> > ARCH_TOOLCHAIN_WRAPPER_OPTS += -Wl,-z,max-page-size=8192
> > else ifeq ($(BR2_ARC_PAGE_SIZE_16K),y)
> > ARCH_TOOLCHAIN_WRAPPER_OPTS += -Wl,-z,max-page-size=16384
> > endif
> >
> > is a bit more compact, so I changed to use this before committing.
> 
> Agreed.
> 
> > Also, we already have an option called BR2_ARC_PAGE_SIZE, which
> > contains 4K, 8K or 16K, so I thought if we could use it here as well. I
> > think we can, but I'd like to hear from Yann about this, because it
> > uses bash arithmetic, which I'm not sure we're allowed to use:
> >
> > ARCH_TOOLCHAIN_WRAPPER_OPTS += -Wl,-z,max-page-size=$(shell echo $$(($(patsubst
> %K,%,$(BR2_ARC_PAGE_SIZE)) * 1024)))
> 
> We can do bash arithmetics, because we are guaranteed we use bash as our
> shell, see: https://urldefense.proofpoint.com/v2/url?u=https-
> 3A__git.buildroot.org_buildroot_tree_Makefile-
> 23n30&d=DwIBaQ&c=DPL6_X_6JkXFx7AXWqB0tg&r=Z74rKOsEpOUneCxYxwKcXHwrAmW8mJhNZjcWnDDJI2U&m=G0xH-
> XYcb2iYOg2bibx_AguTrgrtfR3aD7pVbOW09Q0&s=_K73mNAFEXxJcdkCnKJRzs-VXkSvcFKryO2ZYmXj1LI&e=
> 
> But BR2_ARC_PAGE_SIZE is a string, so it is double-quoted, which would
> break the above.
> 
> I was also contemplating a similar solution, but I was not too happy
> with this trick to drop the suffix. I would have prefered something
> like:
> 
>     config BR2_ARC_PAGE_SIZE_KB
>         int
>         default 4 if BR2_ARC_PAGE_SIZE_4K
>         default 8 if BR2_ARC_PAGE_SIZE_8K
>         default 16 if BR2_ARC_PAGE_SIZE_16K
> 
> and then:
> 
>     ARCH_TOOLCHAIN_WRAPPER_OPTS += -Wl,-z,max-page-size=$(shell echo $$(($(BR2_ARC_PAGE_SIZE)*1024)))
> 
> and in package/uclibc/uclibc.mk:
> 
>     UCLIBC_ARC_PAGE_SIZE = CONFIG_ARC_PAGE_SIZE_$(BR2_ARC_PAGE_SIZE)K
> 
> ... and even that intermediate variable could have been dropped
> altogether, to directly write:
> 
>         $(call KCONFIG_ENABLE_OPT,CONFIG_ARC_PAGE_SIZE_$(BR2_ARC_PAGE_SIZE)K,$(@D)/.config)
> 
> And that would have been a bit nicer, I believe.

Agree. So, Yann [as usually] are you OK if I implement that improvement?

-Alexey
Yann E. MORIN Dec. 27, 2019, 3:43 p.m. UTC | #4
Alexey, All,

On 2019-12-27 09:00 +0000, Alexey Brodkin spake thusly:
[--SNIP--]
> > I was also contemplating a similar solution, but I was not too happy
> > with this trick to drop the suffix. I would have prefered something
> > like:
> > 
> >     config BR2_ARC_PAGE_SIZE_KB
> >         int
> >         default 4 if BR2_ARC_PAGE_SIZE_4K
> >         default 8 if BR2_ARC_PAGE_SIZE_8K
> >         default 16 if BR2_ARC_PAGE_SIZE_16K
> > 
> > and then:
> > 
> >     ARCH_TOOLCHAIN_WRAPPER_OPTS += -Wl,-z,max-page-size=$(shell echo $$(($(BR2_ARC_PAGE_SIZE)*1024)))
> > 
> > and in package/uclibc/uclibc.mk:
> > 
> >     UCLIBC_ARC_PAGE_SIZE = CONFIG_ARC_PAGE_SIZE_$(BR2_ARC_PAGE_SIZE)K
> > 
> > ... and even that intermediate variable could have been dropped
> > altogether, to directly write:
> > 
> >         $(call KCONFIG_ENABLE_OPT,CONFIG_ARC_PAGE_SIZE_$(BR2_ARC_PAGE_SIZE)K,$(@D)/.config)
> > 
> > And that would have been a bit nicer, I believe.
> 
> Agree. So, Yann [as usually] are you OK if I implement that improvement?

As you wish! ;-)

Regards,
Yann E. MORIN.
diff mbox series

Patch

diff --git a/arch/arch.mk.arc b/arch/arch.mk.arc
index 9c04a85a8d..7eb1b95aa7 100644
--- a/arch/arch.mk.arc
+++ b/arch/arch.mk.arc
@@ -5,8 +5,15 @@  ifeq ($(BR2_ARC_ATOMIC_EXT),y)
 ARCH_TOOLCHAIN_WRAPPER_OPTS = -matomic
 endif
 
-# By default MAXPAGESIZE for ARC is 8192 so for larger MMU pages
-# it needs to be overridden.
+# Explicitly set LD's "max-page-size" instead of relying on some defaults
+ifeq ($(BR2_ARC_PAGE_SIZE_4K),y)
+ARCH_TOOLCHAIN_WRAPPER_OPTS += -Wl,-z,max-page-size=4096
+endif
+
+ifeq ($(BR2_ARC_PAGE_SIZE_8K),y)
+ARCH_TOOLCHAIN_WRAPPER_OPTS += -Wl,-z,max-page-size=8192
+endif
+
 ifeq ($(BR2_ARC_PAGE_SIZE_16K),y)
 ARCH_TOOLCHAIN_WRAPPER_OPTS += -Wl,-z,max-page-size=16384
 endif