diff mbox

[1/2] dmaengine: at_hdmac: use tasklet_kill in teardown

Message ID 1394089610-3314-2-git-send-email-vinod.koul@intel.com (mailing list archive)
State Accepted
Commit ccc7aad04c95
Headers show

Commit Message

Vinod Koul March 6, 2014, 7:06 a.m. UTC
As discussed in [1] the tasklet_disable is not a proper function for teardown.
The driver also uses correct method of tasklet_kill. So remove tasklet_disable

[1]: http://lwn.net/Articles/588457/

Reported-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
---
 drivers/dma/at_hdmac.c |    1 -
 1 files changed, 0 insertions(+), 1 deletions(-)

Comments

Thomas Gleixner March 6, 2014, 11:26 a.m. UTC | #1
On Thu, 6 Mar 2014, Vinod Koul wrote:

> As discussed in [1] the tasklet_disable is not a proper function for teardown.
> The driver also uses correct method of tasklet_kill. So remove tasklet_disable
> 
> [1]: http://lwn.net/Articles/588457/
> 
> Reported-by: Thomas Gleixner <tglx@linutronix.de>
> Signed-off-by: Vinod Koul <vinod.koul@intel.com>
> ---
>  drivers/dma/at_hdmac.c |    1 -
>  1 files changed, 0 insertions(+), 1 deletions(-)
> 
> diff --git a/drivers/dma/at_hdmac.c b/drivers/dma/at_hdmac.c
> index e2c04dc..c13a3bb 100644
> --- a/drivers/dma/at_hdmac.c
> +++ b/drivers/dma/at_hdmac.c
> @@ -1569,7 +1569,6 @@ static int at_dma_remove(struct platform_device *pdev)
>  
>  		/* Disable interrupts */
>  		atc_disable_chan_irq(atdma, chan->chan_id);
> -		tasklet_disable(&atchan->tasklet);
>  
>  		tasklet_kill(&atchan->tasklet);
>  		list_del(&chan->device_node);

So you disable the irq at the device level, but what makes sure that
the last interrupt on that line has completed and no further
scheduling of the tasklet can happen? See [1] :)

Thanks,

	tglx


--
To unsubscribe from this list: send the line "unsubscribe dmaengine" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Vinod Koul March 7, 2014, 6:13 a.m. UTC | #2
On Thu, Mar 06, 2014 at 12:26:38PM +0100, Thomas Gleixner wrote:
> 
> 
> On Thu, 6 Mar 2014, Vinod Koul wrote:
> 
> > As discussed in [1] the tasklet_disable is not a proper function for teardown.
> > The driver also uses correct method of tasklet_kill. So remove tasklet_disable
> > 
> > [1]: http://lwn.net/Articles/588457/
> > 
> > Reported-by: Thomas Gleixner <tglx@linutronix.de>
> > Signed-off-by: Vinod Koul <vinod.koul@intel.com>
> > ---
> >  drivers/dma/at_hdmac.c |    1 -
> >  1 files changed, 0 insertions(+), 1 deletions(-)
> > 
> > diff --git a/drivers/dma/at_hdmac.c b/drivers/dma/at_hdmac.c
> > index e2c04dc..c13a3bb 100644
> > --- a/drivers/dma/at_hdmac.c
> > +++ b/drivers/dma/at_hdmac.c
> > @@ -1569,7 +1569,6 @@ static int at_dma_remove(struct platform_device *pdev)
> >  
> >  		/* Disable interrupts */
> >  		atc_disable_chan_irq(atdma, chan->chan_id);
> > -		tasklet_disable(&atchan->tasklet);
> >  
> >  		tasklet_kill(&atchan->tasklet);
> >  		list_del(&chan->device_node);
> 
> So you disable the irq at the device level, but what makes sure that
> the last interrupt on that line has completed and no further
> scheduling of the tasklet can happen? See [1] :)
Yes I missed that will fix in v2
Vinod Koul March 7, 2014, 6:32 a.m. UTC | #3
On Thu, Mar 06, 2014 at 12:26:38PM +0100, Thomas Gleixner wrote:
> 
> 
> On Thu, 6 Mar 2014, Vinod Koul wrote:
> 
> > As discussed in [1] the tasklet_disable is not a proper function for teardown.
> > The driver also uses correct method of tasklet_kill. So remove tasklet_disable
> > 
> > [1]: http://lwn.net/Articles/588457/
> > 
> > Reported-by: Thomas Gleixner <tglx@linutronix.de>
> > Signed-off-by: Vinod Koul <vinod.koul@intel.com>
> > ---
> >  drivers/dma/at_hdmac.c |    1 -
> >  1 files changed, 0 insertions(+), 1 deletions(-)
> > 
> > diff --git a/drivers/dma/at_hdmac.c b/drivers/dma/at_hdmac.c
> > index e2c04dc..c13a3bb 100644
> > --- a/drivers/dma/at_hdmac.c
> > +++ b/drivers/dma/at_hdmac.c
> > @@ -1569,7 +1569,6 @@ static int at_dma_remove(struct platform_device *pdev)
> >  
> >  		/* Disable interrupts */
> >  		atc_disable_chan_irq(atdma, chan->chan_id);
> > -		tasklet_disable(&atchan->tasklet);
> >  
> >  		tasklet_kill(&atchan->tasklet);
> >  		list_del(&chan->device_node);
> 
> So you disable the irq at the device level, but what makes sure that
> the last interrupt on that line has completed and no further
> scheduling of the tasklet can happen? See [1] :)
Okay the irq is freed here. The free_irq() will ensure that the last interrupt has
completed. At least that's what documentation says "The function does not return
until any executing interrupts for this IRQ have completed" and if i read the
code correctly it does so as well.

So wouldn't that take care of no further scheduling of tasklet here or I missed
something?

Then, the tasklet_kill will ensure the scheduled ones are completed as well
Thomas Gleixner March 7, 2014, 6:15 p.m. UTC | #4
On Fri, 7 Mar 2014, Vinod Koul wrote:

> On Thu, Mar 06, 2014 at 12:26:38PM +0100, Thomas Gleixner wrote:
> > 
> > 
> > On Thu, 6 Mar 2014, Vinod Koul wrote:
> > 
> > > As discussed in [1] the tasklet_disable is not a proper function for teardown.
> > > The driver also uses correct method of tasklet_kill. So remove tasklet_disable
> > > 
> > > [1]: http://lwn.net/Articles/588457/
> > > 
> > > Reported-by: Thomas Gleixner <tglx@linutronix.de>
> > > Signed-off-by: Vinod Koul <vinod.koul@intel.com>
> > > ---
> > >  drivers/dma/at_hdmac.c |    1 -
> > >  1 files changed, 0 insertions(+), 1 deletions(-)
> > > 
> > > diff --git a/drivers/dma/at_hdmac.c b/drivers/dma/at_hdmac.c
> > > index e2c04dc..c13a3bb 100644
> > > --- a/drivers/dma/at_hdmac.c
> > > +++ b/drivers/dma/at_hdmac.c
> > > @@ -1569,7 +1569,6 @@ static int at_dma_remove(struct platform_device *pdev)
> > >  
> > >  		/* Disable interrupts */
> > >  		atc_disable_chan_irq(atdma, chan->chan_id);
> > > -		tasklet_disable(&atchan->tasklet);
> > >  
> > >  		tasklet_kill(&atchan->tasklet);
> > >  		list_del(&chan->device_node);
> > 
> > So you disable the irq at the device level, but what makes sure that
> > the last interrupt on that line has completed and no further
> > scheduling of the tasklet can happen? See [1] :)
> Okay the irq is freed here. The free_irq() will ensure that the last interrupt has
> completed. At least that's what documentation says "The function does not return
> until any executing interrupts for this IRQ have completed" and if i read the
> code correctly it does so as well.
> 
> So wouldn't that take care of no further scheduling of tasklet here or I missed
> something?
> 
> Then, the tasklet_kill will ensure the scheduled ones are completed as well

I was just asking. The free_irq() does the trick, yes.

Thanks,

	tglx


--
To unsubscribe from this list: send the line "unsubscribe dmaengine" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Vinod Koul March 10, 2014, 10:34 a.m. UTC | #5
On Fri, Mar 07, 2014 at 07:15:12PM +0100, Thomas Gleixner wrote:
> On Fri, 7 Mar 2014, Vinod Koul wrote:
> 
> > On Thu, Mar 06, 2014 at 12:26:38PM +0100, Thomas Gleixner wrote:
> > > 
> > > 
> > > On Thu, 6 Mar 2014, Vinod Koul wrote:
> > > 
> > > > As discussed in [1] the tasklet_disable is not a proper function for teardown.
> > > > The driver also uses correct method of tasklet_kill. So remove tasklet_disable
> > > > 
> > > > [1]: http://lwn.net/Articles/588457/
> > > > 
> > > > Reported-by: Thomas Gleixner <tglx@linutronix.de>
> > > > Signed-off-by: Vinod Koul <vinod.koul@intel.com>
> > > > ---
> > > >  drivers/dma/at_hdmac.c |    1 -
> > > >  1 files changed, 0 insertions(+), 1 deletions(-)
> > > > 
> > > > diff --git a/drivers/dma/at_hdmac.c b/drivers/dma/at_hdmac.c
> > > > index e2c04dc..c13a3bb 100644
> > > > --- a/drivers/dma/at_hdmac.c
> > > > +++ b/drivers/dma/at_hdmac.c
> > > > @@ -1569,7 +1569,6 @@ static int at_dma_remove(struct platform_device *pdev)
> > > >  
> > > >  		/* Disable interrupts */
> > > >  		atc_disable_chan_irq(atdma, chan->chan_id);
> > > > -		tasklet_disable(&atchan->tasklet);
> > > >  
> > > >  		tasklet_kill(&atchan->tasklet);
> > > >  		list_del(&chan->device_node);
> > > 
> > > So you disable the irq at the device level, but what makes sure that
> > > the last interrupt on that line has completed and no further
> > > scheduling of the tasklet can happen? See [1] :)
> > Okay the irq is freed here. The free_irq() will ensure that the last interrupt has
> > completed. At least that's what documentation says "The function does not return
> > until any executing interrupts for this IRQ have completed" and if i read the
> > code correctly it does so as well.
> > 
> > So wouldn't that take care of no further scheduling of tasklet here or I missed
> > something?
> > 
> > Then, the tasklet_kill will ensure the scheduled ones are completed as well
> 
> I was just asking. The free_irq() does the trick, yes.

Okay thanks. So juts need to fix the second driver, will that right away!
diff mbox

Patch

diff --git a/drivers/dma/at_hdmac.c b/drivers/dma/at_hdmac.c
index e2c04dc..c13a3bb 100644
--- a/drivers/dma/at_hdmac.c
+++ b/drivers/dma/at_hdmac.c
@@ -1569,7 +1569,6 @@  static int at_dma_remove(struct platform_device *pdev)
 
 		/* Disable interrupts */
 		atc_disable_chan_irq(atdma, chan->chan_id);
-		tasklet_disable(&atchan->tasklet);
 
 		tasklet_kill(&atchan->tasklet);
 		list_del(&chan->device_node);