lkml.org 
[lkml]   [2022]   [Jun]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 031/287] s390/preempt: disable __preempt_count_add() optimization for PROFILE_ALL_BRANCHES
    Date
    From: Heiko Carstens <hca@linux.ibm.com>

    [ Upstream commit 63678eecec57fc51b778be3da35a397931287170 ]

    gcc 12 does not (always) optimize away code that should only be generated
    if parameters are constant and within in a certain range. This depends on
    various obscure kernel config options, however in particular
    PROFILE_ALL_BRANCHES can trigger this compile error:

    In function ‘__atomic_add_const’,
    inlined from ‘__preempt_count_add.part.0’ at ./arch/s390/include/asm/preempt.h:50:3:
    ./arch/s390/include/asm/atomic_ops.h:80:9: error: impossible constraint in ‘asm’
    80 | asm volatile( \
    | ^~~

    Workaround this by simply disabling the optimization for
    PROFILE_ALL_BRANCHES, since the kernel will be so slow, that this
    optimization won't matter at all.

    Reported-by: Thomas Richter <tmricht@linux.ibm.com>
    Reviewed-by: Sven Schnelle <svens@linux.ibm.com>
    Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    arch/s390/include/asm/preempt.h | 15 +++++++++++----
    1 file changed, 11 insertions(+), 4 deletions(-)

    diff --git a/arch/s390/include/asm/preempt.h b/arch/s390/include/asm/preempt.h
    index 23a14d187fb1..1aebf09fbcd8 100644
    --- a/arch/s390/include/asm/preempt.h
    +++ b/arch/s390/include/asm/preempt.h
    @@ -50,10 +50,17 @@ static inline bool test_preempt_need_resched(void)

    static inline void __preempt_count_add(int val)
    {
    - if (__builtin_constant_p(val) && (val >= -128) && (val <= 127))
    - __atomic_add_const(val, &S390_lowcore.preempt_count);
    - else
    - __atomic_add(val, &S390_lowcore.preempt_count);
    + /*
    + * With some obscure config options and CONFIG_PROFILE_ALL_BRANCHES
    + * enabled, gcc 12 fails to handle __builtin_constant_p().
    + */
    + if (!IS_ENABLED(CONFIG_PROFILE_ALL_BRANCHES)) {
    + if (__builtin_constant_p(val) && (val >= -128) && (val <= 127)) {
    + __atomic_add_const(val, &S390_lowcore.preempt_count);
    + return;
    + }
    + }
    + __atomic_add(val, &S390_lowcore.preempt_count);
    }

    static inline void __preempt_count_sub(int val)
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-06-13 13:47    [W:3.287 / U:0.676 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site