From patchwork Thu Jan 28 10:19:17 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Will Deacon X-Patchwork-Id: 60704 Delivered-To: patch@linaro.org Received: by 10.55.15.231 with SMTP id 100csp303952qkp; Thu, 28 Jan 2016 02:19:26 -0800 (PST) X-Received: by 10.66.152.204 with SMTP id va12mr3355747pab.0.1453976366461; Thu, 28 Jan 2016 02:19:26 -0800 (PST) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id ta9si16008678pab.92.2016.01.28.02.19.26; Thu, 28 Jan 2016 02:19:26 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of stable-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of stable-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=stable-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932716AbcA1KTZ (ORCPT + 2 others); Thu, 28 Jan 2016 05:19:25 -0500 Received: from cam-admin0.cambridge.arm.com ([217.140.96.50]:48060 "EHLO cam-admin0.cambridge.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932368AbcA1KTY (ORCPT ); Thu, 28 Jan 2016 05:19:24 -0500 Received: from edgewater-inn.cambridge.arm.com (edgewater-inn.cambridge.arm.com [10.1.203.121]) by cam-admin0.cambridge.arm.com (8.12.6/8.12.6) with ESMTP id u0SAJIWr003095; Thu, 28 Jan 2016 10:19:18 GMT Received: by edgewater-inn.cambridge.arm.com (Postfix, from userid 1000) id 177EE1AE3227; Thu, 28 Jan 2016 10:19:20 +0000 (GMT) From: Will Deacon To: stable@vger.kernel.org Cc: gregkh@linuxfoundation.org, Will Deacon Subject: [PATCH] iommu/io-pgtable-arm: Ensure we free the final level on teardown Date: Thu, 28 Jan 2016 10:19:17 +0000 Message-Id: <1453976357-31930-1-git-send-email-will.deacon@arm.com> X-Mailer: git-send-email 2.1.4 Sender: stable-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: stable@vger.kernel.org Upstream commit 12c2ab09571e8aae3a87da2a4a452632a5fac1e5. When tearing down page tables, we return early for the final level since we know that we won't have any table pointers to follow. Unfortunately, this also means that we forget to free the final level, so we end up leaking memory. Fix the issue by always freeing the current level, but just don't bother to iterate over the ptes if we're at the final level. Cc: Reported-by: Zhang Bo Signed-off-by: Will Deacon --- drivers/iommu/io-pgtable-arm.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) -- 2.1.4 -- To unsubscribe from this list: send the line "unsubscribe stable" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/drivers/iommu/io-pgtable-arm.c b/drivers/iommu/io-pgtable-arm.c index 7df97777662d..dad768caa9c5 100644 --- a/drivers/iommu/io-pgtable-arm.c +++ b/drivers/iommu/io-pgtable-arm.c @@ -405,17 +405,18 @@ static void __arm_lpae_free_pgtable(struct arm_lpae_io_pgtable *data, int lvl, arm_lpae_iopte *start, *end; unsigned long table_size; - /* Only leaf entries at the last level */ - if (lvl == ARM_LPAE_MAX_LEVELS - 1) - return; - if (lvl == ARM_LPAE_START_LVL(data)) table_size = data->pgd_size; else table_size = 1UL << data->pg_shift; start = ptep; - end = (void *)ptep + table_size; + + /* Only leaf entries at the last level */ + if (lvl == ARM_LPAE_MAX_LEVELS - 1) + end = ptep; + else + end = (void *)ptep + table_size; while (ptep != end) { arm_lpae_iopte pte = *ptep++;