aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/arch/s390/include/asm/irqflags.h
diff options
context:
space:
mode:
authorChristian Borntraeger <borntraeger@de.ibm.com>2016-01-11 09:17:18 +0100
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2016-01-19 12:14:01 +0100
commit204ee2c5643199a25181ec04ea645d00709c2a5a (patch)
tree805f6c767221ddf0813be23a9b05829429ec60bc /arch/s390/include/asm/irqflags.h
parents390/mm: use TASK_MAX_SIZE where applicable (diff)
downloadwireguard-linux-204ee2c5643199a25181ec04ea645d00709c2a5a.tar.xz
wireguard-linux-204ee2c5643199a25181ec04ea645d00709c2a5a.zip
s390/irqflags: optimize irq restore
The ssm instruction takes longer that stnsm/stosm as it is often used to modify DAT and PER. We know that irqsave/irqrestore only deals with external and I/O interrupts and we know that irqrestore can transition only from disabled->disabled or disabled->enabled, so we can use the faster stosm. Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Diffstat (limited to 'arch/s390/include/asm/irqflags.h')
-rw-r--r--arch/s390/include/asm/irqflags.h9
1 files changed, 7 insertions, 2 deletions
diff --git a/arch/s390/include/asm/irqflags.h b/arch/s390/include/asm/irqflags.h
index 16aa0c779e07..595a275c36f8 100644
--- a/arch/s390/include/asm/irqflags.h
+++ b/arch/s390/include/asm/irqflags.h
@@ -8,6 +8,8 @@
#include <linux/types.h>
+#define ARCH_IRQ_ENABLED (3UL << (BITS_PER_LONG - 8))
+
/* store then OR system mask. */
#define __arch_local_irq_stosm(__or) \
({ \
@@ -54,14 +56,17 @@ static inline notrace void arch_local_irq_enable(void)
__arch_local_irq_stosm(0x03);
}
+/* This only restores external and I/O interrupt state */
static inline notrace void arch_local_irq_restore(unsigned long flags)
{
- __arch_local_irq_ssm(flags);
+ /* only disabled->disabled and disabled->enabled is valid */
+ if (flags & ARCH_IRQ_ENABLED)
+ arch_local_irq_enable();
}
static inline notrace bool arch_irqs_disabled_flags(unsigned long flags)
{
- return !(flags & (3UL << (BITS_PER_LONG - 8)));
+ return !(flags & ARCH_IRQ_ENABLED);
}
static inline notrace bool arch_irqs_disabled(void)