From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail.linutronix.de (146.0.238.70:993) by crypto-ml.lab.linutronix.de with IMAP4-SSL for ; 24 Feb 2019 15:13:10 -0000 Received: from mga02.intel.com ([134.134.136.20]) by Galois.linutronix.de with esmtps (TLS1.2:DHE_RSA_AES_256_CBC_SHA256:256) (Exim 4.80) (envelope-from ) id 1gxvO0-0001SY-58 for speck@linutronix.de; Sun, 24 Feb 2019 16:08:12 +0100 From: Andi Kleen Subject: [MODERATED] [PATCH v6 18/43] MDSv6 Date: Sun, 24 Feb 2019 07:07:24 -0800 Message-Id: In-Reply-To: References: In-Reply-To: References: To: speck@linutronix.de Cc: Andi Kleen List-ID: From: Andi Kleen Subject: mds: Support cpu clear in interrupts According to an audit the majority of interrupt handlers do not touch user data. But some do. Add a IRQ_F_USER_DATA flag to enable clearing after an interrupt. Future patches will add this flag to interrupts that need it. Signed-off-by: Andi Kleen --- include/linux/interrupt.h | 2 ++ kernel/irq/handle.c | 4 ++++ kernel/irq/manage.c | 1 + 3 files changed, 7 insertions(+) diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h index 4a728dba02e2..0f8ddb7ba09b 100644 --- a/include/linux/interrupt.h +++ b/include/linux/interrupt.h @@ -61,6 +61,7 @@ * interrupt handler after suspending interrupts. For system * wakeup devices users need to implement wakeup detection in * their interrupt handlers. + * IRQF_USER_DATA - Interrupt does touch user data */ #define IRQF_SHARED 0x00000080 #define IRQF_PROBE_SHARED 0x00000100 @@ -74,6 +75,7 @@ #define IRQF_NO_THREAD 0x00010000 #define IRQF_EARLY_RESUME 0x00020000 #define IRQF_COND_SUSPEND 0x00040000 +#define IRQF_USER_DATA 0x00080000 #define IRQF_TIMER (__IRQF_TIMER | IRQF_NO_SUSPEND | IRQF_NO_THREAD) diff --git a/kernel/irq/handle.c b/kernel/irq/handle.c index 38554bc35375..46895311e849 100644 --- a/kernel/irq/handle.c +++ b/kernel/irq/handle.c @@ -13,6 +13,7 @@ #include #include #include +#include #include @@ -149,6 +150,9 @@ irqreturn_t __handle_irq_event_percpu(struct irq_desc *desc, unsigned int *flags res = action->handler(irq, action->dev_id); trace_irq_handler_exit(irq, action, res); + if (action->flags & IRQF_USER_DATA) + lazy_clear_cpu(); + if (WARN_ONCE(!irqs_disabled(),"irq %u handler %pF enabled interrupts\n", irq, action->handler)) local_irq_disable(); diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 84b54a17b95d..d1de8d797fc8 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c @@ -1796,6 +1796,7 @@ EXPORT_SYMBOL(free_irq); * * IRQF_SHARED Interrupt is shared * IRQF_TRIGGER_* Specify active edge(s) or level + * IRQF_USER_DATA Handler touches user data with CPU. * */ int request_threaded_irq(unsigned int irq, irq_handler_t handler, -- 2.17.2