Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753616AbbGPGwt (ORCPT ); Thu, 16 Jul 2015 02:52:49 -0400 Received: from mail-bn1bn0108.outbound.protection.outlook.com ([157.56.110.108]:43468 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751502AbbGPGwr convert rfc822-to-8bit (ORCPT ); Thu, 16 Jul 2015 02:52:47 -0400 From: Duan Andy To: Kamal Mostafa , "linux-kernel@vger.kernel.org" , "stable@vger.kernel.org" , "kernel-team@lists.ubuntu.com" CC: "daniel.lezcano@linaro.org" , "kyungmin.park@samsung.com" , Damian Eppel , "kgene@kernel.org" , Thomas Gleixner , "linux-arm-kernel@lists.infradead.org" , "m.szyprowski@samsung.com" Subject: RE: [PATCH 3.19.y-ckt 173/251] clocksource: exynos_mct: Avoid blocking calls in the cpu hotplug notifier Thread-Topic: [PATCH 3.19.y-ckt 173/251] clocksource: exynos_mct: Avoid blocking calls in the cpu hotplug notifier Thread-Index: AQHQv2ULRJkCJ+tWi0is9V1wrJLW1p3dpClQ Date: Thu, 16 Jul 2015 06:37:32 +0000 Message-ID: References: <1437008972-9140-1-git-send-email-kamal@canonical.com> <1437008972-9140-174-git-send-email-kamal@canonical.com> In-Reply-To: <1437008972-9140-174-git-send-email-kamal@canonical.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: canonical.com; dkim=none (message not signed) header.d=none; x-originating-ip: [192.158.241.86] x-microsoft-exchange-diagnostics: 1;BLUPR03MB374;5:1FinAO0GBkzlT9eOfjV5qzPHnYgr6EXBjVrUpiTEamgaOpLHzVGXULdrhBEkzKUUr326bvDQAVnu/pSjAev5daOtS+jGWp0+f6225zFZ9tI6TJtOT9UpTSVFZ5uFZE7Rw0hBDDD5gp8fHNSw7dDiUQ==;24:MHCaA8+doibBf3AVXrimZTfho7PU2mGOEMoL7radBGxmR4uEAZcRGw2RieczcKcxUiGykpeoppKJ260xZwuzmP1UgpomsWpq+Arz36t1n6U=;20:63cbjNp/FoNZyWJgBYGaEg4fXmTlqdu9f+8cP7VV3fyq1BVnDV8LFabyxJDdZi1HRRpIki+Nn/3tqAS3lPELDg== x-microsoft-antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BLUPR03MB374; blupr03mb374: X-MS-Exchange-Organization-RulesExecuted x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:; x-exchange-antispam-report-cfa-test: BCL:0;PCL:0;RULEID:(601004)(5005006)(3002001);SRVR:BLUPR03MB374;BCL:0;PCL:0;RULEID:;SRVR:BLUPR03MB374; x-forefront-prvs: 0639027A9E x-forefront-antispam-report: SFV:NSPM;SFS:(10019020)(6009001)(54534003)(377454003)(2501003)(122556002)(46102003)(74316001)(5003600100002)(2656002)(54356999)(76576001)(189998001)(99286002)(76176999)(87936001)(5002640100001)(5001770100001)(62966003)(40100003)(92566002)(19580395003)(19580405001)(575784001)(77156002)(106116001)(50986999)(33656002)(1720100001)(86362001)(2900100001)(15975445007)(102836002)(5001960100002)(2201001)(77096005)(2950100001)(66066001);DIR:OUT;SFP:1102;SCL:1;SRVR:BLUPR03MB374;H:BLUPR03MB373.namprd03.prod.outlook.com;FPR:;SPF:None;MLV:sfv;LANG:en; Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 8BIT MIME-Version: 1.0 X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-originalarrivaltime: 16 Jul 2015 06:37:32.6267 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 710a03f5-10f6-4d38-9ff4-a80b81da590d X-MS-Exchange-Transport-CrossTenantHeadersStamped: BLUPR03MB374 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 7006 Lines: 187 From: Kamal Mostafa Sent: Thursday, July 16, 2015 9:08 AM > To: linux-kernel@vger.kernel.org; stable@vger.kernel.org; kernel- > team@lists.ubuntu.com > Cc: Kamal Mostafa; daniel.lezcano@linaro.org; kyungmin.park@samsung.com; > Damian Eppel; kgene@kernel.org; Thomas Gleixner; linux-arm- > kernel@lists.infradead.org; m.szyprowski@samsung.com > Subject: [PATCH 3.19.y-ckt 173/251] clocksource: exynos_mct: Avoid > blocking calls in the cpu hotplug notifier > > 3.19.8-ckt4 -stable review patch. If anyone has any objections, please > let me know. > > ------------------ > > From: Damian Eppel > > commit 56a94f13919c0db5958611b388e1581b4852f3c9 upstream. > > Whilst testing cpu hotplug events on kernel configured with DEBUG_PREEMPT > and DEBUG_ATOMIC_SLEEP we get following BUG message, caused by calling > request_irq() and free_irq() in the context of hotplug notification > (which is in this case atomic context). > > [ 40.785859] CPU1: Software reset > [ 40.786660] BUG: sleeping function called from invalid context at > mm/slub.c:1241 > [ 40.786668] in_atomic(): 1, irqs_disabled(): 128, pid: 0, name: > swapper/1 > [ 40.786678] Preemption disabled at:[< (null)>] (null) > [ 40.786681] > [ 40.786692] CPU: 1 PID: 0 Comm: swapper/1 Not tainted 3.19.0-rc4- > 00024-g7dca860 #36 > [ 40.786698] Hardware name: SAMSUNG EXYNOS (Flattened Device Tree) > [ 40.786728] [] (unwind_backtrace) from [] > (show_stack+0x10/0x14) > [ 40.786747] [] (show_stack) from [] > (dump_stack+0x70/0xbc) > [ 40.786767] [] (dump_stack) from [] > (kmem_cache_alloc+0xd8/0x170) > [ 40.786785] [] (kmem_cache_alloc) from [] > (request_threaded_irq+0x64/0x128) > [ 40.786804] [] (request_threaded_irq) from [] > (exynos4_local_timer_setup+0xc0/0x13c) > [ 40.786820] [] (exynos4_local_timer_setup) from [] > (exynos4_mct_cpu_notify+0x30/0xa8) > [ 40.786838] [] (exynos4_mct_cpu_notify) from [] > (notifier_call_chain+0x44/0x84) > [ 40.786857] [] (notifier_call_chain) from [] > (__cpu_notify+0x28/0x44) > [ 40.786873] [] (__cpu_notify) from [] > (secondary_start_kernel+0xec/0x150) > [ 40.786886] [] (secondary_start_kernel) from [<40008764>] > (0x40008764) > > Interrupts cannot be requested/freed in the CPU_STARTING/CPU_DYING > notifications which run on the hotplugged cpu with interrupts and > preemption disabled. > > To avoid the issue, request the interrupts for all possible cpus in the > boot code. The interrupts are marked NO_AUTOENABLE to avoid a racy > request_irq/disable_irq() sequence. The flag prevents the > request_irq() code from enabling the interrupt immediately. > > The interrupt is then enabled in the CPU_STARTING notifier of the > hotplugged cpu and again disabled with disable_irq_nosync() in the > CPU_DYING notifier. > > [ tglx: Massaged changelog to match the patch ] > > Fixes: 7114cd749a12 ("clocksource: exynos_mct: use (request/free)_irq > calls for local timer registration") > Reported-by: Krzysztof Kozlowski > Reviewed-by: Krzysztof Kozlowski > Tested-by: Krzysztof Kozlowski > Tested-by: Marcin Jabrzyk > Signed-off-by: Damian Eppel > Cc: m.szyprowski@samsung.com > Cc: kyungmin.park@samsung.com > Cc: daniel.lezcano@linaro.org > Cc: kgene@kernel.org > Cc: linux-arm-kernel@lists.infradead.org > Link: http://lkml.kernel.org/r/1435324984-7328-1-git-send-email- > d.eppel@samsung.com > Signed-off-by: Thomas Gleixner > Signed-off-by: Kamal Mostafa > --- > drivers/clocksource/exynos_mct.c | 43 ++++++++++++++++++++++++++++------ > ------ > 1 file changed, 30 insertions(+), 13 deletions(-) > > diff --git a/drivers/clocksource/exynos_mct.c > b/drivers/clocksource/exynos_mct.c > index 83564c9..c844616 100644 > --- a/drivers/clocksource/exynos_mct.c > +++ b/drivers/clocksource/exynos_mct.c > @@ -466,15 +466,12 @@ static int exynos4_local_timer_setup(struct > clock_event_device *evt) > exynos4_mct_write(TICK_BASE_CNT, mevt->base + MCT_L_TCNTB_OFFSET); > > if (mct_int_type == MCT_INT_SPI) { > - evt->irq = mct_irqs[MCT_L0_IRQ + cpu]; > - if (request_irq(evt->irq, exynos4_mct_tick_isr, > - IRQF_TIMER | IRQF_NOBALANCING, > - evt->name, mevt)) { > - pr_err("exynos-mct: cannot register IRQ %d\n", > - evt->irq); > + > + if (evt->irq == -1) > return -EIO; > - } > - irq_force_affinity(mct_irqs[MCT_L0_IRQ + cpu], > cpumask_of(cpu)); > + > + irq_force_affinity(evt->irq, cpumask_of(cpu)); > + enable_irq(evt->irq); > } else { > enable_percpu_irq(mct_irqs[MCT_L0_IRQ], 0); In here, why not use enable_percpu_irq(evt->irq) ? > } > @@ -487,10 +484,12 @@ static int exynos4_local_timer_setup(struct > clock_event_device *evt) static void exynos4_local_timer_stop(struct > clock_event_device *evt) { > evt->set_mode(CLOCK_EVT_MODE_UNUSED, evt); > - if (mct_int_type == MCT_INT_SPI) > - free_irq(evt->irq, this_cpu_ptr(&percpu_mct_tick)); > - else > + if (mct_int_type == MCT_INT_SPI) { > + if (evt->irq != -1) > + disable_irq_nosync(evt->irq); > + } else { > disable_percpu_irq(mct_irqs[MCT_L0_IRQ]); In here, why not use disable_percpu_irq(evt->irq) ? > + } > } > > static int exynos4_mct_cpu_notify(struct notifier_block *self, @@ -522,7 > +521,7 @@ static struct notifier_block exynos4_mct_cpu_nb = { > > static void __init exynos4_timer_resources(struct device_node *np, void > __iomem *base) { > - int err; > + int err, cpu; > struct mct_clock_event_device *mevt = > this_cpu_ptr(&percpu_mct_tick); > struct clk *mct_clk, *tick_clk; > > @@ -549,7 +548,25 @@ static void __init exynos4_timer_resources(struct > device_node *np, void __iomem > WARN(err, "MCT: can't request IRQ %d (%d)\n", > mct_irqs[MCT_L0_IRQ], err); > } else { > - irq_set_affinity(mct_irqs[MCT_L0_IRQ], cpumask_of(0)); > + for_each_possible_cpu(cpu) { > + int mct_irq = mct_irqs[MCT_L0_IRQ + cpu]; > + struct mct_clock_event_device *pcpu_mevt = > + per_cpu_ptr(&percpu_mct_tick, cpu); > + > + pcpu_mevt->evt.irq = -1; > + > + irq_set_status_flags(mct_irq, IRQ_NOAUTOEN); > + if (request_irq(mct_irq, > + exynos4_mct_tick_isr, > + IRQF_TIMER | IRQF_NOBALANCING, > + pcpu_mevt->name, pcpu_mevt)) { > + pr_err("exynos-mct: cannot register IRQ > (cpu%d)\n", > + cpu); > + > + continue; > + } > + pcpu_mevt->evt.irq = mct_irq; > + } > } > > err = register_cpu_notifier(&exynos4_mct_cpu_nb); > -- > 1.9.1 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/