summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kernel/irq/manage.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c
index df69993d6030..e4a6ba9786bf 100644
--- a/kernel/irq/manage.c
+++ b/kernel/irq/manage.c
@@ -537,6 +537,14 @@ static void preempt_hardirq_setup(struct irqaction *new)
new->thread_fn = new->handler;
new->handler = preempt_hardirq_handler;
}
+
+static inline void
+preempt_hardirq_cleanup(struct irq_desc *desc, struct irqaction *action)
+{
+ clear_bit(IRQTF_RUNTHREAD, &action->thread_flags);
+ preempt_hardirq_thread_done(desc, action);
+}
+
#else
static inline void preempt_hardirq_setup(struct irqaction *new) { }
static inline int
@@ -544,6 +552,8 @@ preempt_hardirq_thread_done(struct irq_desc *d, struct irqaction *a)
{
return 0;
}
+static inline void
+preempt_hardirq_cleanup(struct irq_desc *d, struct irqaction *a) { }
#endif
static int
@@ -639,6 +649,8 @@ static int irq_thread(void *data)
wake_up(&desc->wait_for_threads);
}
+ preempt_hardirq_cleanup(desc, action);
+
/*
* Clear irqaction. Otherwise exit_irq_thread() would make
* fuzz about an active irq thread going into nirvana.