aboutsummaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorAxel Haslam <axelx.haslam@intel.com>2013-02-19 08:52:06 +0100
committerSteve Sakoman <steve@sakoman.com>2015-06-02 14:57:19 -0700
commit761cec5a46c4b4d8fbe3da03c6be5f025d61e1fb (patch)
tree9c97c60281fad12a8e0b1e0ea880514b6938e6c8 /kernel
parent6af4c39555ca32a06b9496f4e19e4464e5fd8460 (diff)
downloadedison-v3.10-761cec5a46c4b4d8fbe3da03c6be5f025d61e1fb.tar.gz
x86/irq: handle chained interrupts during IRQ migration
[Port to k3.10] Chained interrupt handlers dont have an irqaction and hence are not handled during migrating interrupts when some cores go offline. Handle this by introducing a irq_is_chained() check which is based on the the CHAINED flag being set for such interrupts. fixup_irq() can then handle such interrupts and not skip them over. Signed-off-by: Sundar Iyer <sundar.iyer@intel.com> Signed-off-by: Axel Haslam <axelx.haslam@intel.com> Signed-off-by: Bin Yang <bin.yang@intel.com>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/irq/chip.c1
-rw-r--r--kernel/irq/settings.h7
2 files changed, 8 insertions, 0 deletions
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
index cbd97ce0b00..63af23a879c 100644
--- a/kernel/irq/chip.c
+++ b/kernel/irq/chip.c
@@ -672,6 +672,7 @@ __irq_set_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained,
irq_settings_set_noprobe(desc);
irq_settings_set_norequest(desc);
irq_settings_set_nothread(desc);
+ irq_settings_set_chained(desc);
irq_startup(desc, true);
}
out:
diff --git a/kernel/irq/settings.h b/kernel/irq/settings.h
index 1162f1030f1..4ea2f965ceb 100644
--- a/kernel/irq/settings.h
+++ b/kernel/irq/settings.h
@@ -15,6 +15,7 @@ enum {
_IRQ_NESTED_THREAD = IRQ_NESTED_THREAD,
_IRQ_PER_CPU_DEVID = IRQ_PER_CPU_DEVID,
_IRQF_MODIFY_MASK = IRQF_MODIFY_MASK,
+ _IRQ_CHAINED = IRQ_CHAINED,
};
#define IRQ_PER_CPU GOT_YOU_MORON
@@ -28,6 +29,7 @@ enum {
#define IRQ_PER_CPU_DEVID GOT_YOU_MORON
#undef IRQF_MODIFY_MASK
#define IRQF_MODIFY_MASK GOT_YOU_MORON
+#define IRQ_CHAINED GOT_YOU_MORON
static inline void
irq_settings_clr_and_set(struct irq_desc *desc, u32 clr, u32 set)
@@ -147,3 +149,8 @@ static inline bool irq_settings_is_nested_thread(struct irq_desc *desc)
{
return desc->status_use_accessors & _IRQ_NESTED_THREAD;
}
+
+static inline bool irq_settings_set_chained(struct irq_desc *desc)
+{
+ return desc->status_use_accessors |= _IRQ_CHAINED;
+}