diff options
author | Axel Haslam <axelx.haslam@intel.com> | 2013-02-19 08:52:06 +0100 |
---|---|---|
committer | Steve Sakoman <steve@sakoman.com> | 2015-06-02 14:57:19 -0700 |
commit | 761cec5a46c4b4d8fbe3da03c6be5f025d61e1fb (patch) | |
tree | 9c97c60281fad12a8e0b1e0ea880514b6938e6c8 /kernel | |
parent | 6af4c39555ca32a06b9496f4e19e4464e5fd8460 (diff) | |
download | edison-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.c | 1 | ||||
-rw-r--r-- | kernel/irq/settings.h | 7 |
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; +} |