Re: ARM: add __always_inline to functions called from __get_user_check()
> Am 19.10.2019 um 03:59 schrieb Masahiro Yamada > : > > On Fri, Oct 18, 2019 at 7:06 PM H. Nikolaus Schaller > wrote: >> >> Hi, >> I wonder what happened to your patch. We were "hit" by it in v5.4-rc1 and >> after finding, it made our OMAP based device bootable again (using our >> own defconfig which optimizes for SIZE). >> >> But it does not seem to have arrived in linux-next > > It is in linux-next. Ah, now I found it. It has a "8908/1:" in its title so that search by (full) subject could not find it. Thanks! > > >> and should IMHO >> be fixed during the v5.4 release candidate cycle. > > I agree. > > > Masahiro BR and thanks, Nikolaus
Re: ARM: add __always_inline to functions called from __get_user_check()
On Fri, Oct 18, 2019 at 7:06 PM H. Nikolaus Schaller wrote: > > Hi, > I wonder what happened to your patch. We were "hit" by it in v5.4-rc1 and > after finding, it made our OMAP based device bootable again (using our > own defconfig which optimizes for SIZE). > > But it does not seem to have arrived in linux-next It is in linux-next. > and should IMHO > be fixed during the v5.4 release candidate cycle. I agree. Masahiro > > BR and thanks, > Nikolaus Schaller > -- Best Regards Masahiro Yamada
ARM: add __always_inline to functions called from __get_user_check()
Hi, I wonder what happened to your patch. We were "hit" by it in v5.4-rc1 and after finding, it made our OMAP based device bootable again (using our own defconfig which optimizes for SIZE). But it does not seem to have arrived in linux-next and should IMHO be fixed during the v5.4 release candidate cycle. BR and thanks, Nikolaus Schaller
Re: [PATCH v2] ARM: add __always_inline to functions called from __get_user_check()
Hi Nick, On Wed, Oct 2, 2019 at 2:04 AM Nick Desaulniers wrote: > > Since that commit, all architectures can enable CONFIG_OPTIMIZE_INLINING. > > So, __always_inline is now the only guaranteed way of forcible inlining. > > No, the C preprocessor is the only guaranteed way of inlining. I do not think this is fatal if I understood this correctly: https://lore.kernel.org/patchwork/patch/1122097/#1331784 For GCC, we at least get a warning if a function with __always_inline is not inlined. I am fine with adding -Werror=attributes to the top Makefile (unless we have unpleasant side-effects). You filed the bug for Clang, and hopefully it will be OK in the future releases? -- Best Regards Masahiro Yamada
Re: [PATCH v2] ARM: add __always_inline to functions called from __get_user_check()
On Wed, Oct 2, 2019 at 5:25 PM Russell King - ARM Linux admin wrote: > Masahiro Yamada, please send this to the patch system, thanks. Done. (8908/1) Thanks. -- Best Regards Masahiro Yamada
[PATCH] ARM: add __always_inline to functions called from __get_user_check()
KernelCI reports that bcm2835_defconfig is no longer booting since commit ac7c3e4ff401 ("compiler: enable CONFIG_OPTIMIZE_INLINING forcibly") (https://lkml.org/lkml/2019/9/26/825). I also received a regression report from Nicolas Saenz Julienne (https://lkml.org/lkml/2019/9/27/263). This problem has cropped up on bcm2835_defconfig because it enables CONFIG_CC_OPTIMIZE_FOR_SIZE. The compiler tends to prefer not inlining functions with -Os. I was able to reproduce it with other boards and defconfig files by manually enabling CONFIG_CC_OPTIMIZE_FOR_SIZE. The __get_user_check() specifically uses r0, r1, r2 registers. So, uaccess_save_and_enable() and uaccess_restore() must be inlined. Otherwise, those register assignments would be entirely dropped, according to my analysis of the disassembly. Prior to commit 9012d011660e ("compiler: allow all arches to enable CONFIG_OPTIMIZE_INLINING"), the 'inline' marker was always enough for inlining functions, except on x86. Since that commit, all architectures can enable CONFIG_OPTIMIZE_INLINING. So, __always_inline is now the only guaranteed way of forcible inlining. I added __always_inline to 4 functions in the call-graph from the __get_user_check() macro. Fixes: 9012d011660e ("compiler: allow all arches to enable CONFIG_OPTIMIZE_INLINING") Reported-by: "kernelci.org bot" Reported-by: Nicolas Saenz Julienne Signed-off-by: Masahiro Yamada Tested-by: Nicolas Saenz Julienne --- KernelVersion: v5.4-rc1 arch/arm/include/asm/domain.h | 8 arch/arm/include/asm/uaccess.h | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/arch/arm/include/asm/domain.h b/arch/arm/include/asm/domain.h index 567dbede4785..f1d0a7807cd0 100644 --- a/arch/arm/include/asm/domain.h +++ b/arch/arm/include/asm/domain.h @@ -82,7 +82,7 @@ #ifndef __ASSEMBLY__ #ifdef CONFIG_CPU_CP15_MMU -static inline unsigned int get_domain(void) +static __always_inline unsigned int get_domain(void) { unsigned int domain; @@ -94,7 +94,7 @@ static inline unsigned int get_domain(void) return domain; } -static inline void set_domain(unsigned val) +static __always_inline void set_domain(unsigned int val) { asm volatile( "mcrp15, 0, %0, c3, c0 @ set domain" @@ -102,12 +102,12 @@ static inline void set_domain(unsigned val) isb(); } #else -static inline unsigned int get_domain(void) +static __always_inline unsigned int get_domain(void) { return 0; } -static inline void set_domain(unsigned val) +static __always_inline void set_domain(unsigned int val) { } #endif diff --git a/arch/arm/include/asm/uaccess.h b/arch/arm/include/asm/uaccess.h index 303248e5b990..98c6b91be4a8 100644 --- a/arch/arm/include/asm/uaccess.h +++ b/arch/arm/include/asm/uaccess.h @@ -22,7 +22,7 @@ * perform such accesses (eg, via list poison values) which could then * be exploited for priviledge escalation. */ -static inline unsigned int uaccess_save_and_enable(void) +static __always_inline unsigned int uaccess_save_and_enable(void) { #ifdef CONFIG_CPU_SW_DOMAIN_PAN unsigned int old_domain = get_domain(); @@ -37,7 +37,7 @@ static inline unsigned int uaccess_save_and_enable(void) #endif } -static inline void uaccess_restore(unsigned int flags) +static __always_inline void uaccess_restore(unsigned int flags) { #ifdef CONFIG_CPU_SW_DOMAIN_PAN /* Restore the user access mask */ -- 2.17.1
Re: [PATCH v2] ARM: add __always_inline to functions called from __get_user_check()
On Tue, Oct 01, 2019 at 10:03:50AM -0700, Nick Desaulniers wrote: > On Tue, Oct 1, 2019 at 1:37 AM Masahiro Yamada > wrote: > > > > KernelCI reports that bcm2835_defconfig is no longer booting since > > commit ac7c3e4ff401 ("compiler: enable CONFIG_OPTIMIZE_INLINING > > forcibly") (https://lkml.org/lkml/2019/9/26/825). > > > > I also received a regression report from Nicolas Saenz Julienne > > (https://lkml.org/lkml/2019/9/27/263). > > > > This problem has cropped up on bcm2835_defconfig because it enables > > CONFIG_CC_OPTIMIZE_FOR_SIZE. The compiler tends to prefer not inlining > > functions with -Os. I was able to reproduce it with other boards and > > defconfig files by manually enabling CONFIG_CC_OPTIMIZE_FOR_SIZE. > > > > The __get_user_check() specifically uses r0, r1, r2 registers. > > So, uaccess_save_and_enable() and uaccess_restore() must be inlined. > > Otherwise, those register assignments would be entirely dropped, > > according to my analysis of the disassembly. > > > > Prior to commit 9012d011660e ("compiler: allow all arches to enable > > CONFIG_OPTIMIZE_INLINING"), the 'inline' marker was always enough for > > inlining functions, except on x86. > > > > Since that commit, all architectures can enable CONFIG_OPTIMIZE_INLINING. > > So, __always_inline is now the only guaranteed way of forcible inlining. > > No, the C preprocessor is the only guaranteed way of inlining. I > preferred v1; if you're going to play with > firewrite assembly, don't get burned. It seems we disagree on that. Masahiro Yamada, please send this to the patch system, thanks. > > > > > I also added __always_inline to 4 functions in the call-graph from the > > __get_user_check() macro. > > > > Fixes: 9012d011660e ("compiler: allow all arches to enable > > CONFIG_OPTIMIZE_INLINING") > > Reported-by: "kernelci.org bot" > > Reported-by: Nicolas Saenz Julienne > > Signed-off-by: Masahiro Yamada > > --- > > > > Changes in v2: > > - Use __always_inline instead of changing the function call places > > (per Russell King) > > - The previous submission is: > > https://lore.kernel.org/patchwork/patch/1132459/ > > > > arch/arm/include/asm/domain.h | 8 > > arch/arm/include/asm/uaccess.h | 4 ++-- > > 2 files changed, 6 insertions(+), 6 deletions(-) > > > > diff --git a/arch/arm/include/asm/domain.h b/arch/arm/include/asm/domain.h > > index 567dbede4785..f1d0a7807cd0 100644 > > --- a/arch/arm/include/asm/domain.h > > +++ b/arch/arm/include/asm/domain.h > > @@ -82,7 +82,7 @@ > > #ifndef __ASSEMBLY__ > > > > #ifdef CONFIG_CPU_CP15_MMU > > -static inline unsigned int get_domain(void) > > +static __always_inline unsigned int get_domain(void) > > { > > unsigned int domain; > > > > @@ -94,7 +94,7 @@ static inline unsigned int get_domain(void) > > return domain; > > } > > > > -static inline void set_domain(unsigned val) > > +static __always_inline void set_domain(unsigned int val) > > { > > asm volatile( > > "mcrp15, 0, %0, c3, c0 @ set domain" > > @@ -102,12 +102,12 @@ static inline void set_domain(unsigned val) > > isb(); > > } > > #else > > -static inline unsigned int get_domain(void) > > +static __always_inline unsigned int get_domain(void) > > { > > return 0; > > } > > > > -static inline void set_domain(unsigned val) > > +static __always_inline void set_domain(unsigned int val) > > { > > } > > #endif > > diff --git a/arch/arm/include/asm/uaccess.h b/arch/arm/include/asm/uaccess.h > > index 303248e5b990..98c6b91be4a8 100644 > > --- a/arch/arm/include/asm/uaccess.h > > +++ b/arch/arm/include/asm/uaccess.h > > @@ -22,7 +22,7 @@ > > * perform such accesses (eg, via list poison values) which could then > > * be exploited for priviledge escalation. > > */ > > -static inline unsigned int uaccess_save_and_enable(void) > > +static __always_inline unsigned int uaccess_save_and_enable(void) > > { > > #ifdef CONFIG_CPU_SW_DOMAIN_PAN > > unsigned int old_domain = get_domain(); > > @@ -37,7 +37,7 @@ static inline unsigned int uaccess_save_and_enable(void) > > #endif > > } > > > > -static inline void uaccess_restore(unsigned int flags) > > +static __always_inline void uaccess_restore(unsigned int flags) > > { > > #ifdef CONFIG_CPU_SW_DOMAIN_PAN > > /* Restore the user access mask */ > > -- > > 2.17.1 > > > > > -- > Thanks, > ~Nick Desaulniers > -- RMK's Patch system: https://www.armlinux.org.uk/developer/patches/ FTTC broadband for 0.8mile line in suburbia: sync at 12.1Mbps down 622kbps up According to speedtest.net: 11.9Mbps down 500kbps up
Re: [PATCH v2] ARM: add __always_inline to functions called from __get_user_check()
On Tue, Oct 1, 2019 at 1:37 AM Masahiro Yamada wrote: > > KernelCI reports that bcm2835_defconfig is no longer booting since > commit ac7c3e4ff401 ("compiler: enable CONFIG_OPTIMIZE_INLINING > forcibly") (https://lkml.org/lkml/2019/9/26/825). > > I also received a regression report from Nicolas Saenz Julienne > (https://lkml.org/lkml/2019/9/27/263). > > This problem has cropped up on bcm2835_defconfig because it enables > CONFIG_CC_OPTIMIZE_FOR_SIZE. The compiler tends to prefer not inlining > functions with -Os. I was able to reproduce it with other boards and > defconfig files by manually enabling CONFIG_CC_OPTIMIZE_FOR_SIZE. > > The __get_user_check() specifically uses r0, r1, r2 registers. > So, uaccess_save_and_enable() and uaccess_restore() must be inlined. > Otherwise, those register assignments would be entirely dropped, > according to my analysis of the disassembly. > > Prior to commit 9012d011660e ("compiler: allow all arches to enable > CONFIG_OPTIMIZE_INLINING"), the 'inline' marker was always enough for > inlining functions, except on x86. > > Since that commit, all architectures can enable CONFIG_OPTIMIZE_INLINING. > So, __always_inline is now the only guaranteed way of forcible inlining. No, the C preprocessor is the only guaranteed way of inlining. I preferred v1; if you're going to play with firewrite assembly, don't get burned. > > I also added __always_inline to 4 functions in the call-graph from the > __get_user_check() macro. > > Fixes: 9012d011660e ("compiler: allow all arches to enable > CONFIG_OPTIMIZE_INLINING") > Reported-by: "kernelci.org bot" > Reported-by: Nicolas Saenz Julienne > Signed-off-by: Masahiro Yamada > --- > > Changes in v2: > - Use __always_inline instead of changing the function call places > (per Russell King) > - The previous submission is: > https://lore.kernel.org/patchwork/patch/1132459/ > > arch/arm/include/asm/domain.h | 8 > arch/arm/include/asm/uaccess.h | 4 ++-- > 2 files changed, 6 insertions(+), 6 deletions(-) > > diff --git a/arch/arm/include/asm/domain.h b/arch/arm/include/asm/domain.h > index 567dbede4785..f1d0a7807cd0 100644 > --- a/arch/arm/include/asm/domain.h > +++ b/arch/arm/include/asm/domain.h > @@ -82,7 +82,7 @@ > #ifndef __ASSEMBLY__ > > #ifdef CONFIG_CPU_CP15_MMU > -static inline unsigned int get_domain(void) > +static __always_inline unsigned int get_domain(void) > { > unsigned int domain; > > @@ -94,7 +94,7 @@ static inline unsigned int get_domain(void) > return domain; > } > > -static inline void set_domain(unsigned val) > +static __always_inline void set_domain(unsigned int val) > { > asm volatile( > "mcrp15, 0, %0, c3, c0 @ set domain" > @@ -102,12 +102,12 @@ static inline void set_domain(unsigned val) > isb(); > } > #else > -static inline unsigned int get_domain(void) > +static __always_inline unsigned int get_domain(void) > { > return 0; > } > > -static inline void set_domain(unsigned val) > +static __always_inline void set_domain(unsigned int val) > { > } > #endif > diff --git a/arch/arm/include/asm/uaccess.h b/arch/arm/include/asm/uaccess.h > index 303248e5b990..98c6b91be4a8 100644 > --- a/arch/arm/include/asm/uaccess.h > +++ b/arch/arm/include/asm/uaccess.h > @@ -22,7 +22,7 @@ > * perform such accesses (eg, via list poison values) which could then > * be exploited for priviledge escalation. > */ > -static inline unsigned int uaccess_save_and_enable(void) > +static __always_inline unsigned int uaccess_save_and_enable(void) > { > #ifdef CONFIG_CPU_SW_DOMAIN_PAN > unsigned int old_domain = get_domain(); > @@ -37,7 +37,7 @@ static inline unsigned int uaccess_save_and_enable(void) > #endif > } > > -static inline void uaccess_restore(unsigned int flags) > +static __always_inline void uaccess_restore(unsigned int flags) > { > #ifdef CONFIG_CPU_SW_DOMAIN_PAN > /* Restore the user access mask */ > -- > 2.17.1 > -- Thanks, ~Nick Desaulniers
Re: [PATCH v2] ARM: add __always_inline to functions called from __get_user_check()
On Tue, 2019-10-01 at 17:37 +0900, Masahiro Yamada wrote: > KernelCI reports that bcm2835_defconfig is no longer booting since > commit ac7c3e4ff401 ("compiler: enable CONFIG_OPTIMIZE_INLINING > forcibly") (https://lkml.org/lkml/2019/9/26/825). > > I also received a regression report from Nicolas Saenz Julienne > (https://lkml.org/lkml/2019/9/27/263). > > This problem has cropped up on bcm2835_defconfig because it enables > CONFIG_CC_OPTIMIZE_FOR_SIZE. The compiler tends to prefer not inlining > functions with -Os. I was able to reproduce it with other boards and > defconfig files by manually enabling CONFIG_CC_OPTIMIZE_FOR_SIZE. > > The __get_user_check() specifically uses r0, r1, r2 registers. > So, uaccess_save_and_enable() and uaccess_restore() must be inlined. > Otherwise, those register assignments would be entirely dropped, > according to my analysis of the disassembly. > > Prior to commit 9012d011660e ("compiler: allow all arches to enable > CONFIG_OPTIMIZE_INLINING"), the 'inline' marker was always enough for > inlining functions, except on x86. > > Since that commit, all architectures can enable CONFIG_OPTIMIZE_INLINING. > So, __always_inline is now the only guaranteed way of forcible inlining. > > I also added __always_inline to 4 functions in the call-graph from the > __get_user_check() macro. > > Fixes: 9012d011660e ("compiler: allow all arches to enable > CONFIG_OPTIMIZE_INLINING") > Reported-by: "kernelci.org bot" > Reported-by: Nicolas Saenz Julienne > Signed-off-by: Masahiro Yamada Tested-by: Nicolas Saenz Julienne signature.asc Description: This is a digitally signed message part
[PATCH v2] ARM: add __always_inline to functions called from __get_user_check()
KernelCI reports that bcm2835_defconfig is no longer booting since commit ac7c3e4ff401 ("compiler: enable CONFIG_OPTIMIZE_INLINING forcibly") (https://lkml.org/lkml/2019/9/26/825). I also received a regression report from Nicolas Saenz Julienne (https://lkml.org/lkml/2019/9/27/263). This problem has cropped up on bcm2835_defconfig because it enables CONFIG_CC_OPTIMIZE_FOR_SIZE. The compiler tends to prefer not inlining functions with -Os. I was able to reproduce it with other boards and defconfig files by manually enabling CONFIG_CC_OPTIMIZE_FOR_SIZE. The __get_user_check() specifically uses r0, r1, r2 registers. So, uaccess_save_and_enable() and uaccess_restore() must be inlined. Otherwise, those register assignments would be entirely dropped, according to my analysis of the disassembly. Prior to commit 9012d011660e ("compiler: allow all arches to enable CONFIG_OPTIMIZE_INLINING"), the 'inline' marker was always enough for inlining functions, except on x86. Since that commit, all architectures can enable CONFIG_OPTIMIZE_INLINING. So, __always_inline is now the only guaranteed way of forcible inlining. I also added __always_inline to 4 functions in the call-graph from the __get_user_check() macro. Fixes: 9012d011660e ("compiler: allow all arches to enable CONFIG_OPTIMIZE_INLINING") Reported-by: "kernelci.org bot" Reported-by: Nicolas Saenz Julienne Signed-off-by: Masahiro Yamada --- Changes in v2: - Use __always_inline instead of changing the function call places (per Russell King) - The previous submission is: https://lore.kernel.org/patchwork/patch/1132459/ arch/arm/include/asm/domain.h | 8 arch/arm/include/asm/uaccess.h | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/arch/arm/include/asm/domain.h b/arch/arm/include/asm/domain.h index 567dbede4785..f1d0a7807cd0 100644 --- a/arch/arm/include/asm/domain.h +++ b/arch/arm/include/asm/domain.h @@ -82,7 +82,7 @@ #ifndef __ASSEMBLY__ #ifdef CONFIG_CPU_CP15_MMU -static inline unsigned int get_domain(void) +static __always_inline unsigned int get_domain(void) { unsigned int domain; @@ -94,7 +94,7 @@ static inline unsigned int get_domain(void) return domain; } -static inline void set_domain(unsigned val) +static __always_inline void set_domain(unsigned int val) { asm volatile( "mcrp15, 0, %0, c3, c0 @ set domain" @@ -102,12 +102,12 @@ static inline void set_domain(unsigned val) isb(); } #else -static inline unsigned int get_domain(void) +static __always_inline unsigned int get_domain(void) { return 0; } -static inline void set_domain(unsigned val) +static __always_inline void set_domain(unsigned int val) { } #endif diff --git a/arch/arm/include/asm/uaccess.h b/arch/arm/include/asm/uaccess.h index 303248e5b990..98c6b91be4a8 100644 --- a/arch/arm/include/asm/uaccess.h +++ b/arch/arm/include/asm/uaccess.h @@ -22,7 +22,7 @@ * perform such accesses (eg, via list poison values) which could then * be exploited for priviledge escalation. */ -static inline unsigned int uaccess_save_and_enable(void) +static __always_inline unsigned int uaccess_save_and_enable(void) { #ifdef CONFIG_CPU_SW_DOMAIN_PAN unsigned int old_domain = get_domain(); @@ -37,7 +37,7 @@ static inline unsigned int uaccess_save_and_enable(void) #endif } -static inline void uaccess_restore(unsigned int flags) +static __always_inline void uaccess_restore(unsigned int flags) { #ifdef CONFIG_CPU_SW_DOMAIN_PAN /* Restore the user access mask */ -- 2.17.1