From: Thomas Gleixner <tglx@linutronix.de>
To: LKML <linux-kernel@vger.kernel.org>
Cc: Linus Torvalds <torvalds@osdl.org>,
Andrew Morton <akpm@linux-foundation.org>,
Ingo Molnar <mingo@elte.hu>,
Arjan van de Veen <arjan@infradead.org>,
Benjamin Herrenschmidt <benh@kernel.crashing.org>,
Steven Rostedt <rostedt@goodmis.org>,
Jon Masters <jonathan@jonmasters.org>,
Sven Dietrich <sdietrich@suse.de>
Subject: [RFC patch 2/5] genirq: add a quick check handler
Date: Wed, 01 Oct 2008 23:02:18 -0000 [thread overview]
Message-ID: <20081001223301.900862899@linutronix.de> (raw)
In-Reply-To: 20081001223213.078984344@linutronix.de
[-- Attachment #1: genirq-add-quickcheckhandler.patch --]
[-- Type: text/plain, Size: 4953 bytes --]
Preparatory patch for threaded interrupt handlers.
Adds a quick check handler which is called before the real handler.
The quick check handler can decide whether the interrupt was originated
from the device or not. It can also declare the interrupt as handled
and subsequently avoid that the real handler is called.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Ingo Molnar <mingo@elte.hu>
---
include/linux/interrupt.h | 14 +++++++++++++-
include/linux/irqreturn.h | 2 ++
kernel/irq/handle.c | 18 +++++++++++++++---
kernel/irq/manage.c | 19 +++++++++++++------
4 files changed, 43 insertions(+), 10 deletions(-)
Index: linux-2.6-tip/include/linux/interrupt.h
===================================================================
--- linux-2.6-tip.orig/include/linux/interrupt.h
+++ linux-2.6-tip/include/linux/interrupt.h
@@ -58,6 +58,7 @@
typedef irqreturn_t (*irq_handler_t)(int, void *);
struct irqaction {
+ irq_handler_t quick_check_handler;
irq_handler_t handler;
unsigned long flags;
cpumask_t mask;
@@ -69,8 +70,19 @@ struct irqaction {
};
extern irqreturn_t no_action(int cpl, void *dev_id);
-extern int __must_check request_irq(unsigned int, irq_handler_t handler,
+
+extern int __must_check
+request_irq_quickcheck(unsigned int, irq_handler_t handler,
+ irq_handler_t quick_check_handler,
unsigned long, const char *, void *);
+
+static inline int __must_check
+request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,
+ const char *name, void *dev)
+{
+ return request_irq_quickcheck(irq, handler, NULL, flags, name, dev);
+}
+
extern void free_irq(unsigned int, void *);
struct device;
Index: linux-2.6-tip/include/linux/irqreturn.h
===================================================================
--- linux-2.6-tip.orig/include/linux/irqreturn.h
+++ linux-2.6-tip/include/linux/irqreturn.h
@@ -5,10 +5,12 @@
* enum irqreturn
* @IRQ_NONE interrupt was not from this device
* @IRQ_HANDLED interrupt was handled by this device
+ * @IRQ_NEEDS_HANDLING quick check handler requests to run real handler
*/
enum irqreturn {
IRQ_NONE,
IRQ_HANDLED,
+ IRQ_NEEDS_HANDLING,
};
#define irqreturn_t enum irqreturn
Index: linux-2.6-tip/kernel/irq/handle.c
===================================================================
--- linux-2.6-tip.orig/kernel/irq/handle.c
+++ linux-2.6-tip/kernel/irq/handle.c
@@ -137,9 +137,21 @@ irqreturn_t handle_IRQ_event(unsigned in
local_irq_enable_in_hardirq();
do {
- ret = action->handler(irq, action->dev_id);
- if (ret == IRQ_HANDLED)
- status |= action->flags;
+ if (action->quick_check_handler)
+ ret = action->quick_check_handler(irq, action->dev_id);
+ else
+ ret = IRQ_NEEDS_HANDLING;
+
+ switch (ret) {
+ default:
+ break;
+
+ case IRQ_NEEDS_HANDLING:
+ ret = action->handler(irq, action->dev_id);
+ if (ret == IRQ_HANDLED)
+ status |= action->flags;
+ break;
+ }
retval |= ret;
action = action->next;
} while (action);
Index: linux-2.6-tip/kernel/irq/manage.c
===================================================================
--- linux-2.6-tip.orig/kernel/irq/manage.c
+++ linux-2.6-tip/kernel/irq/manage.c
@@ -563,9 +563,14 @@ void free_irq(unsigned int irq, void *de
EXPORT_SYMBOL(free_irq);
/**
- * request_irq - allocate an interrupt line
+ * request_irq_quickcheck - allocate an interrupt line
* @irq: Interrupt line to allocate
- * @handler: Function to be called when the IRQ occurs
+ * @handler: Function to be called when the IRQ occurs.
+ * Primary handler for threaded interrupts
+ * @quick_check_handler: Function to be called when the interrupt
+ * before the real handler is called to check
+ * whether the interrupt originated from the device
+ * can be NULL
* @irqflags: Interrupt type flags
* @devname: An ascii name for the claiming device
* @dev_id: A cookie passed back to the handler function
@@ -589,10 +594,11 @@ EXPORT_SYMBOL(free_irq);
* IRQF_SHARED Interrupt is shared
* IRQF_DISABLED Disable local interrupts while processing
* IRQF_SAMPLE_RANDOM The interrupt can be used for entropy
- *
*/
-int request_irq(unsigned int irq, irq_handler_t handler,
- unsigned long irqflags, const char *devname, void *dev_id)
+int request_irq_quickcheck(unsigned int irq, irq_handler_t handler,
+ irq_handler_t quick_check_handler,
+ unsigned long irqflags, const char *devname,
+ void *dev_id)
{
struct irqaction *action;
int retval;
@@ -622,6 +628,7 @@ int request_irq(unsigned int irq, irq_ha
if (!action)
return -ENOMEM;
+ action->quick_check_handler = quick_check_handler;
action->handler = handler;
action->flags = irqflags;
cpus_clear(action->mask);
@@ -651,4 +658,4 @@ int request_irq(unsigned int irq, irq_ha
return retval;
}
-EXPORT_SYMBOL(request_irq);
+EXPORT_SYMBOL(request_irq_quickcheck);
next prev parent reply other threads:[~2008-10-01 23:03 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-10-01 23:02 [RFC patch 0/5] genirq: add infrastructure for threaded interrupt handlers Thomas Gleixner
2008-10-01 23:02 ` [RFC patch 1/5] genirq: make irqreturn_t an enum Thomas Gleixner
2008-10-01 23:02 ` Thomas Gleixner [this message]
2008-10-02 0:47 ` [RFC patch 2/5] genirq: add a quick check handler Jon Masters
2008-10-02 5:09 ` Steven Rostedt
2008-10-02 10:51 ` Jon Masters
2008-10-02 22:06 ` Greg KH
2008-10-02 4:52 ` Steven Rostedt
2008-10-03 8:29 ` Christoph Hellwig
2008-10-03 10:37 ` Thomas Gleixner
2008-10-01 23:02 ` [RFC patch 3/5] genirq: add threaded interrupt handler support Thomas Gleixner
2008-10-02 5:01 ` Steven Rostedt
2008-10-01 23:02 ` [RFC patch 4/5] genirq: add a helper to check whether the irq thread should run Thomas Gleixner
2008-10-01 23:02 ` [RFC patch 5/5] genirq: make irq threading robust Thomas Gleixner
2008-10-02 0:52 ` Jon Masters
2008-10-02 5:20 ` Steven Rostedt
2008-10-01 23:23 ` [RFC patch 0/5] genirq: add infrastructure for threaded interrupt handlers Andrew Morton
2008-10-01 23:29 ` Arjan van de Ven
2008-10-01 23:40 ` Andrew Morton
2008-10-01 23:58 ` Thomas Gleixner
2008-10-02 0:40 ` Jon Masters
2008-10-02 22:07 ` Greg KH
2008-10-08 22:18 ` Ingo Oeser
2008-10-02 1:53 ` Daniel Walker
2008-10-02 15:02 ` Steven Rostedt
2008-10-02 15:48 ` Daniel Walker
2008-10-02 18:42 ` Thomas Gleixner
2008-10-02 19:04 ` Daniel Walker
2008-10-02 19:23 ` Steven Rostedt
2008-10-02 19:28 ` Ingo Molnar
2008-10-02 20:09 ` Daniel Walker
2008-10-02 20:14 ` Steven Rostedt
2008-10-02 20:48 ` Daniel Walker
2008-10-02 21:05 ` Steven Rostedt
2008-10-02 21:30 ` Daniel Walker
2008-10-02 22:28 ` Steven Rostedt
2008-10-02 23:24 ` Daniel Walker
2008-10-03 0:26 ` Thomas Gleixner
2008-10-03 14:44 ` Daniel Walker
2008-10-02 14:46 ` Andi Kleen
2008-10-02 21:31 ` Greg KH
2008-10-02 22:33 ` Arjan van de Ven
2008-10-03 3:25 ` Andi Kleen
2008-10-03 3:48 ` Arjan van de Ven
2008-10-03 4:35 ` Andi Kleen
2008-10-03 3:23 ` Andi Kleen
2008-10-21 1:32 ` [RFC patch] genirq threading for ehci, ohci and uhci USB hosts Sven-Thorsten Dietrich
2008-10-21 2:07 ` Jonathan Woithe
2008-10-21 10:29 ` [RFC patch] genirq threading (v2) for ehci, ohci and uhci USB hosts and ohci1394 Sven-Thorsten Dietrich
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20081001223301.900862899@linutronix.de \
--to=tglx@linutronix.de \
--cc=akpm@linux-foundation.org \
--cc=arjan@infradead.org \
--cc=benh@kernel.crashing.org \
--cc=jonathan@jonmasters.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=rostedt@goodmis.org \
--cc=sdietrich@suse.de \
--cc=torvalds@osdl.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox