Received: by 2002:ac0:946b:0:0:0:0:0 with SMTP id j40csp3259378imj; Mon, 18 Feb 2019 23:48:11 -0800 (PST) X-Google-Smtp-Source: AHgI3IYBWd42IC7gVNZ9cT5xoQqwbtFH4MmFDqIrQ9P1uyokMQj6P3XvXPj8/RFkK6mowRKb7dbd X-Received: by 2002:a63:f648:: with SMTP id u8mr22212488pgj.91.1550562491854; Mon, 18 Feb 2019 23:48:11 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1550562491; cv=none; d=google.com; s=arc-20160816; b=L2MBc6+FlgBoJG8So/jcg4PNFeMvxClpVLYHZrgc6ChtEPlTyX6hOKW1M1IP2wN+py mVzvDOlTxl/qzraAtjyJyPSbYSDQmbl/m0ZgeP8uXs45a9dfgx9+10mXB6YWi3qMG9H0 /m2uLakd90UZXRH5mECRYk29rrVeI90WMrmS07KToZ8XwLCAyakuWYP4TUPIm/bGgd7G DGVA+PVVFDrHrft9HEXdFyg//UWGhs2b2en6WHv1hgIcuIqxtKdeLs114ufupdM1jnyq 1aW5VqJ6eO98w4ob4jVv39/GL2/qlMKWeIXnJnCOWl5jaEsi2OP85gU5rMRvlT98n1Wp XhhQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :dkim-signature; bh=ewn3qcr792Cyc0izeDpCIoh/T4ye1x21hf99ENaCdxA=; b=s1Jh8M9vdErhjg8pPLjMSGIQ0dS0OLZWwFcgPj7OZjMjL7E8rudyEVW7fnyp7sckIo gV2YNNSBUYcvYzTWY7tdljLcXM8ufxhwFZw/UhbCPLKfYhfTs0AvC0HJ69U+bB0h3y7T bKKoKI+/mLdB8Gb3gORyW/w3Yw8W8AgnDm5t57Mkf8YN2ICaxp/lIkqCuTGpjh20r7tE +sdgGNhs36GqB0rHw6HaFiyKtKZYyLX2A8NAQKOA4f+IEdKy4J/Zk9sToCa3dMRjlXWC RsWDlMCvLMdd0R9FdwQ9pRqwPWRwepdsQPfTW5cItEvXCag+gwtx+r4h2xMV/CFZe9Vn gfZg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b="u/U6+ctg"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id j61si13654947plb.232.2019.02.18.23.47.56; Mon, 18 Feb 2019 23:48:11 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b="u/U6+ctg"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726763AbfBSHrV (ORCPT + 99 others); Tue, 19 Feb 2019 02:47:21 -0500 Received: from mail-pf1-f194.google.com ([209.85.210.194]:46353 "EHLO mail-pf1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725767AbfBSHrU (ORCPT ); Tue, 19 Feb 2019 02:47:20 -0500 Received: by mail-pf1-f194.google.com with SMTP id g6so9820011pfh.13; Mon, 18 Feb 2019 23:47:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=ewn3qcr792Cyc0izeDpCIoh/T4ye1x21hf99ENaCdxA=; b=u/U6+ctgxecaX5OERcO3SrJKFvAWj8YgmGSAf1D2NevSdayXe+9hC4RbQ1cORt4cn9 moC+KNKDUlREYxnZidrwz+tj1w9PSJpEv1BngPZthna1p4GZ/1wQOQkiKb3nJwzAnKyb hF7oIAldXzC2oVXs7tXVdcupMudd+AySdQjiYELlHQsXcBjixbMhPI0upyBVg4d7wZDu kXU7drSQddqFKdND5ztrrrGBFKMFYzefbR/b4t7Z8i2jJAJgPY8ZmDxxgAUNBq+rbopI 3MQC7BIuHWuSS2kXQ1Dv1eN646vIIhsClvMydAxgxyQN0zH22Tj2cpRHu6x6s1QyAnLd BNbw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=ewn3qcr792Cyc0izeDpCIoh/T4ye1x21hf99ENaCdxA=; b=jeVCpMb8CoQqPto6HavSBYIBieammmldgiEvRy/XCxp5OwC36RtIRtaJIjexi0FZKw T/X+on04odekB+xgHAKNRpej4zXZAXdjk5SjC7Lao45JuSDVIyVCoVftlX1SBwuiUxfl ip2Lbp3FKQp4zrllbgaMsn3kP3KHcJKRdTB9QBWqKbCVPS5xORlHaNidCc/ZnoySFmkV CbbKiCi4PgrY4r1Gqt3s8Xt75ofWqzKiebkc2sUKkqWXvVNwfpjiiCBDhRjVel5jqxin cs5abGL+bQQ6TyxWq5wag8BnzTWECUAeAJUtL9Kx43A1I5w6Iyid/RdZCBSKqPwjn42o WU4Q== X-Gm-Message-State: AHQUAuY3iat0o6SVxYXp2/1VHNAEO+6s/ynu93t4RbIT8Lg/xSRMya9y jhfJhMOpAihA1YMAgu1DxjEnif5EjdY= X-Received: by 2002:a63:5d5f:: with SMTP id o31mr22792746pgm.414.1550562439969; Mon, 18 Feb 2019 23:47:19 -0800 (PST) Received: from ubuntu14_04.bitmain.com (61-220-100-83.HINET-IP.hinet.net. [61.220.100.83]) by smtp.gmail.com with ESMTPSA id o2sm19049671pgq.29.2019.02.18.23.47.18 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 18 Feb 2019 23:47:19 -0800 (PST) From: pierre Kuo To: Rob Herring , Frank Rowand Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, pierre Kuo Subject: [PATCH 1/1] of: reserved_mem: fix reserve memory leak Date: Tue, 19 Feb 2019 15:45:00 +0800 Message-Id: <20190219074500.16454-1-vichy.kuo@gmail.com> X-Mailer: git-send-email 2.17.1 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The __reserved_mem_init_node will call region specific reserved memory init codes, but once all compatibled init codes failed, the memory region will left in memory.reserved and cause leakage. Take cma reserve memory DTS for example, if user declare 1MB size, which is not align to (PAGE_SIZE << max(MAX_ORDER - 1, pageblock_order)), rmem_cma_setup will return -EINVAL. Meanwhile, rmem_dma_setup will also return -EINVAL since "reusable" property is not set. If finally there is no reserved memory init pick up this memory, kernel will left the 1MB leak in memory.reserved. This patch will remove this kind of memory from memory.reserved, only when __reserved_mem_init_node return neither 0 nor -ENOENT. Signed-off-by: pierre Kuo --- drivers/of/of_reserved_mem.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c index 1977ee0adcb1..d3bde057ec46 100644 --- a/drivers/of/of_reserved_mem.c +++ b/drivers/of/of_reserved_mem.c @@ -181,6 +181,7 @@ static int __init __reserved_mem_init_node(struct reserved_mem *rmem) { extern const struct of_device_id __reservedmem_of_table[]; const struct of_device_id *i; + int ret = -ENOENT; for (i = __reservedmem_of_table; i < &__rmem_of_table_sentinel; i++) { reservedmem_of_init_fn initfn = i->data; @@ -189,13 +190,14 @@ static int __init __reserved_mem_init_node(struct reserved_mem *rmem) if (!of_flat_dt_is_compatible(rmem->fdt_node, compat)) continue; - if (initfn(rmem) == 0) { + ret = initfn(rmem); + if (ret == 0) { pr_info("initialized node %s, compatible id %s\n", rmem->name, compat); - return 0; + break; } } - return -ENOENT; + return ret; } static int __init __rmem_cmp(const void *a, const void *b) @@ -255,7 +257,9 @@ void __init fdt_init_reserved_mem(void) int len; const __be32 *prop; int err = 0; + int nomap; + nomap = of_get_flat_dt_prop(node, "no-map", NULL) != NULL; prop = of_get_flat_dt_prop(node, "phandle", &len); if (!prop) prop = of_get_flat_dt_prop(node, "linux,phandle", &len); @@ -265,8 +269,16 @@ void __init fdt_init_reserved_mem(void) if (rmem->size == 0) err = __reserved_mem_alloc_size(node, rmem->name, &rmem->base, &rmem->size); - if (err == 0) - __reserved_mem_init_node(rmem); + if (err == 0) { + err = __reserved_mem_init_node(rmem); + if (err != 0 && err != -ENOENT) { + pr_info("node %s compatible matching fail\n", + rmem->name); + memblock_free(rmem->base, rmem->size); + if (nomap) + memblock_add(rmem->base, rmem->size); + } + } } } -- 2.17.1