lkml.org 
[lkml]   [2022]   [Aug]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 642/779] s390/smp: cleanup control register update routines
    Date
    From: Alexander Gordeev <agordeev@linux.ibm.com>

    [ Upstream commit 9097fc793f74ef9c677f8c4aed0c24f6f07f0133 ]

    Get rid of duplicate code and redundant data.

    Reviewed-by: Heiko Carstens <hca@linux.ibm.com>
    Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
    Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    arch/s390/include/asm/ctl_reg.h | 16 ++++++++++-----
    arch/s390/kernel/smp.c | 36 +++++++++++----------------------
    2 files changed, 23 insertions(+), 29 deletions(-)

    diff --git a/arch/s390/include/asm/ctl_reg.h b/arch/s390/include/asm/ctl_reg.h
    index 04dc65f8901d..80b93c06a2bb 100644
    --- a/arch/s390/include/asm/ctl_reg.h
    +++ b/arch/s390/include/asm/ctl_reg.h
    @@ -72,8 +72,17 @@ static __always_inline void __ctl_clear_bit(unsigned int cr, unsigned int bit)
    __ctl_load(reg, cr, cr);
    }

    -void smp_ctl_set_bit(int cr, int bit);
    -void smp_ctl_clear_bit(int cr, int bit);
    +void smp_ctl_set_clear_bit(int cr, int bit, bool set);
    +
    +static inline void ctl_set_bit(int cr, int bit)
    +{
    + smp_ctl_set_clear_bit(cr, bit, true);
    +}
    +
    +static inline void ctl_clear_bit(int cr, int bit)
    +{
    + smp_ctl_set_clear_bit(cr, bit, false);
    +}

    union ctlreg0 {
    unsigned long val;
    @@ -128,8 +137,5 @@ union ctlreg15 {
    };
    };

    -#define ctl_set_bit(cr, bit) smp_ctl_set_bit(cr, bit)
    -#define ctl_clear_bit(cr, bit) smp_ctl_clear_bit(cr, bit)
    -
    #endif /* __ASSEMBLY__ */
    #endif /* __ASM_CTL_REG_H */
    diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c
    index 982b72ca677c..7bbcb5b8d3f6 100644
    --- a/arch/s390/kernel/smp.c
    +++ b/arch/s390/kernel/smp.c
    @@ -579,39 +579,27 @@ static void smp_ctl_bit_callback(void *info)
    }

    static DEFINE_SPINLOCK(ctl_lock);
    -static unsigned long ctlreg;

    -/*
    - * Set a bit in a control register of all cpus
    - */
    -void smp_ctl_set_bit(int cr, int bit)
    +void smp_ctl_set_clear_bit(int cr, int bit, bool set)
    {
    - struct ec_creg_mask_parms parms = { 1UL << bit, -1UL, cr };
    -
    - spin_lock(&ctl_lock);
    - memcpy_absolute(&ctlreg, &S390_lowcore.cregs_save_area[cr], sizeof(ctlreg));
    - __set_bit(bit, &ctlreg);
    - memcpy_absolute(&S390_lowcore.cregs_save_area[cr], &ctlreg, sizeof(ctlreg));
    - spin_unlock(&ctl_lock);
    - on_each_cpu(smp_ctl_bit_callback, &parms, 1);
    -}
    -EXPORT_SYMBOL(smp_ctl_set_bit);
    -
    -/*
    - * Clear a bit in a control register of all cpus
    - */
    -void smp_ctl_clear_bit(int cr, int bit)
    -{
    - struct ec_creg_mask_parms parms = { 0, ~(1UL << bit), cr };
    + struct ec_creg_mask_parms parms = { .cr = cr, };
    + u64 ctlreg;

    + if (set) {
    + parms.orval = 1UL << bit;
    + parms.andval = -1UL;
    + } else {
    + parms.orval = 0;
    + parms.andval = ~(1UL << bit);
    + }
    spin_lock(&ctl_lock);
    memcpy_absolute(&ctlreg, &S390_lowcore.cregs_save_area[cr], sizeof(ctlreg));
    - __clear_bit(bit, &ctlreg);
    + ctlreg = (ctlreg & parms.andval) | parms.orval;
    memcpy_absolute(&S390_lowcore.cregs_save_area[cr], &ctlreg, sizeof(ctlreg));
    spin_unlock(&ctl_lock);
    on_each_cpu(smp_ctl_bit_callback, &parms, 1);
    }
    -EXPORT_SYMBOL(smp_ctl_clear_bit);
    +EXPORT_SYMBOL(smp_ctl_set_clear_bit);

    #ifdef CONFIG_CRASH_DUMP

    --
    2.35.1


    \
     
     \ /
      Last update: 2022-08-15 21:43    [W:4.022 / U:0.176 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site