From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756021AbaICJiq (ORCPT ); Wed, 3 Sep 2014 05:38:46 -0400 Received: from forward-corp1e.mail.yandex.net ([77.88.60.199]:40659 "EHLO forward-corp1e.mail.yandex.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754707AbaICJio (ORCPT ); Wed, 3 Sep 2014 05:38:44 -0400 X-Greylist: delayed 572 seconds by postgrey-1.27 at vger.kernel.org; Wed, 03 Sep 2014 05:38:44 EDT X-Yandex-Uniq: 59a7be5e-26f4-437b-a92e-2a7d7a2cf44a Authentication-Results: smtpcorp4.mail.yandex.net; dkim=pass header.i=@yandex-team.ru Date: Wed, 03 Sep 2014 13:28:59 +0400 Message-ID: <87d2bdcask.wl%klamm@yandex-team.ru> From: Roman Gushchin To: dan.j.williams@intel.com, vinod.koul@intel.com, dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH] net_dma: fix memory leak in dma_pin_iocvec_pages User-Agent: Wanderlust/2.15.9 MIME-Version: 1.0 (generated by SEMI-EPG 1.14.7 - "Harue") Content-Type: text/plain; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org dma_pin_iovec_pages() calls get_user_pages() for each iovec. If get_user_pages() returns a number smaller than the requested number, dma_pin_iovec_pages() calls dma_unpin_iovec_pages(). It releases previously allocated iovecs, but pages pinned by last get_user_pages() call remain unreleased. Fix this by calling put_page() for each such page. Signed-off-by: Roman Gushchin --- drivers/dma/iovlock.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/dma/iovlock.c b/drivers/dma/iovlock.c index bb48a57..c393cf9 100644 --- a/drivers/dma/iovlock.c +++ b/drivers/dma/iovlock.c @@ -107,8 +107,11 @@ struct dma_pinned_list *dma_pin_iovec_pages(struct iovec *iov, size_t len) NULL); up_read(¤t->mm->mmap_sem); - if (ret != page_list->nr_pages) + if (ret != page_list->nr_pages) { + for (i = 0; i < ret; i++) + put_page(page_list->pages[i]); goto unpin; + } local_list->nr_iovecs = i + 1; } -- 1.9.3