From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752616AbbH2NCK (ORCPT ); Sat, 29 Aug 2015 09:02:10 -0400 Received: from szxga03-in.huawei.com ([119.145.14.66]:57460 "EHLO szxga03-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751965AbbH2NCI (ORCPT ); Sat, 29 Aug 2015 09:02:08 -0400 To: CC: Jiang Liu , Thomas Gleixner , Marc Zyngier , Mark Rutland , Will Deacon , From: Yang Yingliang Subject: [PATCH] arm64: fix a migrating irq bug when hotplug cpu Message-ID: <55E1AD09.7020701@huawei.com> Date: Sat, 29 Aug 2015 21:00:57 +0800 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Thunderbird/38.1.0 MIME-Version: 1.0 Content-Type: text/plain; charset="gbk"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [10.177.19.219] X-CFilter-Loop: Reflected X-Mirapoint-Virus-RAPID-Raw: score=unknown(0), refid=str=0001.0A090201.55E1AD12.000F,ss=1,re=0.000,recu=0.000,reip=0.000,cl=1,cld=1,fgs=0, ip=0.0.0.0, so=2013-05-26 15:14:31, dmn=2013-03-21 17:37:32 X-Mirapoint-Loop-Id: 109a7ed33799a8d9bf7329bab3ac0f02 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Yang Yingliang When cpu is disabled, all irqs will be migratged to another cpu. In some cases, a new affinity is different, it needed to be coppied to irq's affinity. But if the type of irq is LPI, it's affinity will not be coppied because of irq_set_affinity's return value. So copy the affinity, when the return value is IRQ_SET_MASK_OK_DONE. Cc: Jiang Liu Cc: Thomas Gleixner Cc: Marc Zyngier Cc: Mark Rutland Cc: Will Deacon --- arch/arm64/kernel/irq.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/arch/arm64/kernel/irq.c b/arch/arm64/kernel/irq.c index 463fa2e..2acc8ec 100644 --- a/arch/arm64/kernel/irq.c +++ b/arch/arm64/kernel/irq.c @@ -78,10 +78,13 @@ static bool migrate_one_irq(struct irq_desc *desc) } c = irq_data_get_irq_chip(d); - if (!c->irq_set_affinity) + if (!c->irq_set_affinity) { pr_debug("IRQ%u: unable to set affinity\n", d->irq); - else if (c->irq_set_affinity(d, affinity, false) == IRQ_SET_MASK_OK && ret) - cpumask_copy(irq_data_get_affinity_mask(d), affinity); + } else if (c->irq_set_affinity(d, affinity, false) == IRQ_SET_MASK_OK && ret) { + int r = c->irq_set_affinity(d, affinity, false); + if ((r == IRQ_SET_MASK_OK || r == IRQ_SET_MASK_OK_DONE) && ret) + cpumask_copy(irq_data_get_affinity_mask(d), affinity); + } return ret; } -- 2.5.0