Commit 9097fc79 authored by Alexander Gordeev's avatar Alexander Gordeev Committed by Vasily Gorbik
Browse files

s390/smp: cleanup control register update routines



Get rid of duplicate code and redundant data.

Reviewed-by: default avatarHeiko Carstens <hca@linux.ibm.com>
Signed-off-by: default avatarAlexander Gordeev <agordeev@linux.ibm.com>
Signed-off-by: default avatarVasily Gorbik <gor@linux.ibm.com>
parent dc2ab23b
Loading
Loading
Loading
Loading
+11 −5
Original line number Diff line number Diff line
@@ -74,8 +74,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;
@@ -130,8 +139,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 */
+12 −24
Original line number Diff line number Diff line
@@ -577,39 +577,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 };
	struct ec_creg_mask_parms parms = { .cr = cr, };
	u64 ctlreg;

	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);
	if (set) {
		parms.orval = 1UL << bit;
		parms.andval = -1UL;
	} else {
		parms.orval = 0;
		parms.andval = ~(1UL << bit);
	}
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 };

	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