diff mbox

[4/5] dmaengine: hsu: Fix memory leak when stopping a running transfer

Message ID 1427456155-28990-5-git-send-email-peter.ujfalusi@ti.com (mailing list archive)
State New, archived
Headers show

Commit Message

Peter Ujfalusi March 27, 2015, 11:35 a.m. UTC
The vd->node is removed from the lists when the transfer started so the
vchan_get_all_descriptors() will not find it. This results memory leak.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
CC: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 drivers/dma/hsu/hsu.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

Comments

Andy Shevchenko March 27, 2015, 12:01 p.m. UTC | #1
On Fri, 2015-03-27 at 13:35 +0200, Peter Ujfalusi wrote:
> The vd->node is removed from the lists when the transfer started so the
> vchan_get_all_descriptors() will not find it. This results memory leak.
> 

Acked-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>

Though this one would go via Greg's tty tree (Cc'ed) I think.
It becomes to regular work flow after 4.1-rc1.


> Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
> CC: Andy Shevchenko <andriy.shevchenko@linux.intel.com>

> ---
>  drivers/dma/hsu/hsu.c | 5 ++++-
>  1 file changed, 4 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/dma/hsu/hsu.c b/drivers/dma/hsu/hsu.c
> index 683ba9b62795..d1864bda008f 100644
> --- a/drivers/dma/hsu/hsu.c
> +++ b/drivers/dma/hsu/hsu.c
> @@ -387,7 +387,10 @@ static int hsu_dma_terminate_all(struct dma_chan *chan)
>  	spin_lock_irqsave(&hsuc->vchan.lock, flags);
>  
>  	hsu_dma_stop_channel(hsuc);
> -	hsuc->desc = NULL;
> +	if (hsuc->desc) {
> +		hsu_dma_desc_free(&hsuc->desc->vchan);
> +		hsuc->desc = NULL;
> +	}
>  
>  	vchan_get_all_descriptors(&hsuc->vchan, &head);
>  	spin_unlock_irqrestore(&hsuc->vchan.lock, flags);
Vinod Koul March 30, 2015, 5:37 p.m. UTC | #2
On Fri, Mar 27, 2015 at 02:01:58PM +0200, Andy Shevchenko wrote:
> On Fri, 2015-03-27 at 13:35 +0200, Peter Ujfalusi wrote:
> > The vd->node is removed from the lists when the transfer started so the
> > vchan_get_all_descriptors() will not find it. This results memory leak.
> > 
> 
> Acked-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Acked-by: Vinod Koul <vinod.koul@intel.com>

Greg,

Please apply this in your queue for next
Greg KH April 28, 2015, 11:17 a.m. UTC | #3
On Mon, Mar 30, 2015 at 11:07:32PM +0530, Vinod Koul wrote:
> On Fri, Mar 27, 2015 at 02:01:58PM +0200, Andy Shevchenko wrote:
> > On Fri, 2015-03-27 at 13:35 +0200, Peter Ujfalusi wrote:
> > > The vd->node is removed from the lists when the transfer started so the
> > > vchan_get_all_descriptors() will not find it. This results memory leak.
> > > 
> > 
> > Acked-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> Acked-by: Vinod Koul <vinod.koul@intel.com>
> 
> Greg,
> 
> Please apply this in your queue for next

Apply what?  Can someone resend this in a format I can apply it in?

thanks,

gregk -h
Vinod Koul May 4, 2015, 11:04 a.m. UTC | #4
On Tue, Apr 28, 2015 at 01:17:08PM +0200, 'Greg Kroah-Hartman' wrote:
> On Mon, Mar 30, 2015 at 11:07:32PM +0530, Vinod Koul wrote:
> > On Fri, Mar 27, 2015 at 02:01:58PM +0200, Andy Shevchenko wrote:
> > > On Fri, 2015-03-27 at 13:35 +0200, Peter Ujfalusi wrote:
> > > > The vd->node is removed from the lists when the transfer started so the
> > > > vchan_get_all_descriptors() will not find it. This results memory leak.
> > > > 
> > > 
> > > Acked-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> > Acked-by: Vinod Koul <vinod.koul@intel.com>
> > 
> > Greg,
> > 
> > Please apply this in your queue for next
> 
> Apply what?  Can someone resend this in a format I can apply it in?

Ah sorry Greg, I thought you were cced in the orignal patch as well, so..

Peter, can you resend, now that this is in my next I will apply it
Andy Shevchenko May 7, 2015, 4:26 p.m. UTC | #5
On Fri, 2015-03-27 at 13:35 +0200, Peter Ujfalusi wrote:
> The vd->node is removed from the lists when the transfer started so the
> vchan_get_all_descriptors() will not find it. This results memory leak.
> 
> Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
> CC: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> ---
>  drivers/dma/hsu/hsu.c | 5 ++++-
>  1 file changed, 4 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/dma/hsu/hsu.c b/drivers/dma/hsu/hsu.c
> index 683ba9b62795..d1864bda008f 100644
> --- a/drivers/dma/hsu/hsu.c
> +++ b/drivers/dma/hsu/hsu.c
> @@ -387,7 +387,10 @@ static int hsu_dma_terminate_all(struct dma_chan *chan)
>  	spin_lock_irqsave(&hsuc->vchan.lock, flags);
>  
>  	hsu_dma_stop_channel(hsuc);
> -	hsuc->desc = NULL;
> +	if (hsuc->desc) {
> +		hsu_dma_desc_free(&hsuc->desc->vchan);

By the way, it should be 'vdesc);' at the end.

> +		hsuc->desc = NULL;
> +	}
>  
>  	vchan_get_all_descriptors(&hsuc->vchan, &head);
>  	spin_unlock_irqrestore(&hsuc->vchan.lock, flags);
diff mbox

Patch

diff --git a/drivers/dma/hsu/hsu.c b/drivers/dma/hsu/hsu.c
index 683ba9b62795..d1864bda008f 100644
--- a/drivers/dma/hsu/hsu.c
+++ b/drivers/dma/hsu/hsu.c
@@ -387,7 +387,10 @@  static int hsu_dma_terminate_all(struct dma_chan *chan)
 	spin_lock_irqsave(&hsuc->vchan.lock, flags);
 
 	hsu_dma_stop_channel(hsuc);
-	hsuc->desc = NULL;
+	if (hsuc->desc) {
+		hsu_dma_desc_free(&hsuc->desc->vchan);
+		hsuc->desc = NULL;
+	}
 
 	vchan_get_all_descriptors(&hsuc->vchan, &head);
 	spin_unlock_irqrestore(&hsuc->vchan.lock, flags);