Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752270AbcCRIUG (ORCPT ); Fri, 18 Mar 2016 04:20:06 -0400 Received: from eusmtp01.atmel.com ([212.144.249.243]:42045 "EHLO eusmtp01.atmel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751255AbcCRIT7 (ORCPT ); Fri, 18 Mar 2016 04:19:59 -0400 Subject: Re: [PATCH] clockevents/drivers/timer-atmel-pit: fix double free_irq To: Alexandre Belloni , , Thomas Gleixner References: <1458245383-9859-1-git-send-email-alexandre.belloni@free-electrons.com> CC: Boris Brezillon , , , From: Nicolas Ferre Organization: atmel Message-ID: <56EBBA33.9080809@atmel.com> Date: Fri, 18 Mar 2016 09:20:03 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 MIME-Version: 1.0 In-Reply-To: <1458245383-9859-1-git-send-email-alexandre.belloni@free-electrons.com> Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: 8bit X-Originating-IP: [10.161.30.18] Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1853 Lines: 63 Le 17/03/2016 21:09, Alexandre Belloni a ?crit : > clockevents_exchange_device() changes the state from detached to shutdown > and so at that point the IRQ has not yet been requested. > > Signed-off-by: Alexandre Belloni Acked-by: Nicolas Ferre > --- > > Hi Sebastian, > > This patch fixes the last warning for preempt-rt on at91. It applies on > v4.4.4-rt11. Note that the whome PIT/TCB mess will be fixed in another way in > the mainline as we are reworking the tcb driver to avoid using the pit when > booting. Yes, it's the plan! Thanks Alexandre. Bye. > > drivers/clocksource/timer-atmel-pit.c | 8 +++++++- > 1 file changed, 7 insertions(+), 1 deletion(-) > > diff --git a/drivers/clocksource/timer-atmel-pit.c b/drivers/clocksource/timer-atmel-pit.c > index a7abdb6638cd..7a40f7e88468 100644 > --- a/drivers/clocksource/timer-atmel-pit.c > +++ b/drivers/clocksource/timer-atmel-pit.c > @@ -46,6 +46,7 @@ struct pit_data { > u32 cycle; > u32 cnt; > unsigned int irq; > + bool irq_requested; > struct clk *mck; > }; > > @@ -96,7 +97,10 @@ static int pit_clkevt_shutdown(struct clock_event_device *dev) > > /* disable irq, leaving the clocksource active */ > pit_write(data->base, AT91_PIT_MR, (data->cycle - 1) | AT91_PIT_PITEN); > - free_irq(data->irq, data); > + if (data->irq_requested) { > + free_irq(data->irq, data); > + data->irq_requested = false; > + } > return 0; > } > > @@ -115,6 +119,8 @@ static int pit_clkevt_set_periodic(struct clock_event_device *dev) > if (ret) > panic(pr_fmt("Unable to setup IRQ\n")); > > + data->irq_requested = true; > + > /* update clocksource counter */ > data->cnt += data->cycle * PIT_PICNT(pit_read(data->base, AT91_PIT_PIVR)); > pit_write(data->base, AT91_PIT_MR, > -- Nicolas Ferre