From b88a507a978b65ecc26e590a312bb928ec766f24 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Thu, 10 Feb 2011 22:25:31 +0100 Subject: [PATCH] --- yaml --- r: 234753 b: refs/heads/master c: e1ef824146131709d7466e37f889f2dab24ca98e h: refs/heads/master i: 234751: 5f788bbcd8f6dca841e323c0b34ed9a8663678c3 v: v3 --- [refs] | 2 +- trunk/include/linux/irq.h | 8 ++++++++ trunk/kernel/irq/chip.c | 4 +++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index b6725de7c01c..e9e7146dae39 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 7f94226f03299f1ca32f118f02f2a0295e0e5e93 +refs/heads/master: e1ef824146131709d7466e37f889f2dab24ca98e diff --git a/trunk/include/linux/irq.h b/trunk/include/linux/irq.h index 94c8f5bb548f..c101ad4b821f 100644 --- a/trunk/include/linux/irq.h +++ b/trunk/include/linux/irq.h @@ -170,6 +170,8 @@ struct irq_data { * IRQD_LEVEL - Interrupt is level triggered * IRQD_WAKEUP_STATE - Interrupt is configured for wakeup * from suspend + * IRDQ_MOVE_PCNTXT - Interrupt can be moved in process + * context */ enum { IRQD_TRIGGER_MASK = 0xf, @@ -179,6 +181,7 @@ enum { IRQD_AFFINITY_SET = (1 << 12), IRQD_LEVEL = (1 << 13), IRQD_WAKEUP_STATE = (1 << 14), + IRQD_MOVE_PCNTXT = (1 << 15), }; static inline bool irqd_is_setaffinity_pending(struct irq_data *d) @@ -225,6 +228,11 @@ static inline bool irqd_is_wakeup_set(struct irq_data *d) return d->state_use_accessors & IRQD_WAKEUP_STATE; } +static inline bool irqd_can_move_in_process_context(struct irq_data *d) +{ + return d->state_use_accessors & IRQD_MOVE_PCNTXT; +} + /** * struct irq_chip - hardware interrupt chip descriptor * diff --git a/trunk/kernel/irq/chip.c b/trunk/kernel/irq/chip.c index 4687457fe7f0..2b0f9192a830 100644 --- a/trunk/kernel/irq/chip.c +++ b/trunk/kernel/irq/chip.c @@ -712,11 +712,13 @@ void irq_modify_status(unsigned int irq, unsigned long clr, unsigned long set) irq_settings_clr_and_set(desc, clr, set); irqd_clear(&desc->irq_data, IRQD_NO_BALANCING | IRQD_PER_CPU | - IRQD_TRIGGER_MASK | IRQD_LEVEL); + IRQD_TRIGGER_MASK | IRQD_LEVEL | IRQD_MOVE_PCNTXT); if (irq_settings_has_no_balance_set(desc)) irqd_set(&desc->irq_data, IRQD_NO_BALANCING); if (irq_settings_is_per_cpu(desc)) irqd_set(&desc->irq_data, IRQD_PER_CPU); + if (irq_settings_can_move_pcntxt(desc)) + irqd_set(&desc->irq_data, IRQD_MOVE_PCNTXT); irqd_set(&desc->irq_data, irq_settings_get_trigger_mask(desc));