Messages in this thread Patch in this message | | | Date | Fri, 30 Mar 2012 14:31:34 -0700 | From | tip-bot for Jiang Liu <> | Subject | [tip:irq/core] genirq: Adjust irq thread affinity on IRQ_SET_MASK_OK_NOCOPY return value |
| |
Commit-ID: f5cb92ac82d06cb583c1f66666314c5c0a4d7913 Gitweb: http://git.kernel.org/tip/f5cb92ac82d06cb583c1f66666314c5c0a4d7913 Author: Jiang Liu <liuj97@gmail.com> AuthorDate: Fri, 30 Mar 2012 23:11:33 +0800 Committer: Thomas Gleixner <tglx@linutronix.de> CommitDate: Fri, 30 Mar 2012 23:13:46 +0200
genirq: Adjust irq thread affinity on IRQ_SET_MASK_OK_NOCOPY return value
irq_move_masked_irq() checks the return code of chip->irq_set_affinity() only for 0, but IRQ_SET_MASK_OK_NOCOPY is also a valid return code, which is there to avoid a redundant copy of the cpumask. But in case of IRQ_SET_MASK_OK_NOCOPY we not only avoid the redundant copy, we also fail to adjust the thread affinity of an eventually threaded interrupt handler.
Handle IRQ_SET_MASK_OK (==0) and IRQ_SET_MASK_OK_NOCOPY(==1) return values correctly by checking the valid return values seperately.
Signed-off-by: Jiang Liu <jiang.liu@huawei.com> Cc: Jiang Liu <liuj97@gmail.com> Cc: Keping Chen <chenkeping@huawei.com> Cc: stable@vger.kernel.org Link: http://lkml.kernel.org/r/1333120296-13563-2-git-send-email-jiang.liu@huawei.com Signed-off-by: Thomas Gleixner <tglx@linutronix.de> --- kernel/irq/migration.c | 10 +++++++--- 1 files changed, 7 insertions(+), 3 deletions(-)
diff --git a/kernel/irq/migration.c b/kernel/irq/migration.c index 4742090..c3c8975 100644 --- a/kernel/irq/migration.c +++ b/kernel/irq/migration.c @@ -43,12 +43,16 @@ void irq_move_masked_irq(struct irq_data *idata) * masking the irqs. */ if (likely(cpumask_any_and(desc->pending_mask, cpu_online_mask) - < nr_cpu_ids)) - if (!chip->irq_set_affinity(&desc->irq_data, - desc->pending_mask, false)) { + < nr_cpu_ids)) { + int ret = chip->irq_set_affinity(&desc->irq_data, + desc->pending_mask, false); + switch (ret) { + case IRQ_SET_MASK_OK: cpumask_copy(desc->irq_data.affinity, desc->pending_mask); + case IRQ_SET_MASK_OK_NOCOPY: irq_set_thread_affinity(desc); } + } cpumask_clear(desc->pending_mask); }
| |