Received: by 2002:ac0:aed5:0:0:0:0:0 with SMTP id t21csp2644903imb; Mon, 4 Mar 2019 10:15:02 -0800 (PST) X-Google-Smtp-Source: APXvYqwsr7/QrjvHMXgOJQnV7LElWJUPsqtCHmdPPMJfGvgVmlYy8ElKwlXgMyMgAnrp7o+QzNZt X-Received: by 2002:a17:902:2de4:: with SMTP id p91mr21895832plb.215.1551723301933; Mon, 04 Mar 2019 10:15:01 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1551723301; cv=none; d=google.com; s=arc-20160816; b=UJxrS1MgAo3WyUkKaJ1UZXNA1MERtCkeVn3xh03K6PG2ggWKBv2/ziLGYf1zmzW+pe mZ9wItFXaDX3cMkYy6b29yzJSDmZZQ3vMsfVXNMkvYhuwjsbxw7zS/geGS6r5VgsjLuC 0XPGpOY5AAK7udbcxv9LngRKRcqc8mgPkYBfxoVF/BfT0jP+LIW3C68V2bocbDDEAni8 CYbQqDOG/cD1/MClSJzaHIrx3SkIT9OVQXh0kuRPw37XI2eXH8cgU+LUjSDANfVnTqPu xfMnfese3AX03e1tdOQ5eTaYqgNV+kD9rMYeFOtzmzurRwL8IJH4Me+gcc0KdpXG6eoX EpiA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature; bh=E85zTf88Jrv5haou7YdyqCjXO2CmR6mer2ysNIJEYcs=; b=Bn57FicdTdaxYO0pW4s9J0kkvfRK7vQdFjS62/PfL+dNtUUe6riiLFep1SQU2MM+aB U9Byg5038pOnVlS4RnlP/TgVCxPDQSjQR3vlj8necHgnIVtGUrjOsYJKsMGVdAh2IAGb ENO75nACdQuHPfQyJX/kufekx0zkslWCkt3c66fhu+gRkUXqNYbyG2XKFMIZVEUqIRnS hMDVOjWglG3zCro+O/QgwVi701Y4DGyyhYerLDy55GWVUzxx4oAq0RbTmitsQ5vrLiN1 xC+CVwzsds5WiMipjcMGnfQ8eknpwu/MgOBj6EuDD9C1j7pwa/yTKUk0rGvsnWfi2WUH TpmQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=PadjDR29; 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=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 193si1142424pga.251.2019.03.04.10.14.47; Mon, 04 Mar 2019 10:15:01 -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=@kernel.org header.s=default header.b=PadjDR29; 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=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726963AbfCDQhx (ORCPT + 99 others); Mon, 4 Mar 2019 11:37:53 -0500 Received: from mail.kernel.org ([198.145.29.99]:53806 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726082AbfCDQhw (ORCPT ); Mon, 4 Mar 2019 11:37:52 -0500 Received: from mail-qk1-f179.google.com (mail-qk1-f179.google.com [209.85.222.179]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 3C7DA20830; Mon, 4 Mar 2019 16:37:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1551717471; bh=8yGVLS1LxVVUdXYLfXvFFljHTIlg3YAGJFdQ7WJ8YBA=; h=References:In-Reply-To:From:Date:Subject:To:Cc:From; b=PadjDR29WYdFe5qKzePeT2by0abbfwOU4+xjvf7fS2x/qWG8ajsVh/9E/B+qjyKSX 9lIFqw+2oVrlCHW/Q9HuDQbrY9f964i9mUL5W9E5Oq5/tPTAt0+KTuQvv54sORKZuF oekdjNXqGxmpllSToqlDL9BmAM5o4NbijpdAEy0A= Received: by mail-qk1-f179.google.com with SMTP id y15so3129223qki.8; Mon, 04 Mar 2019 08:37:51 -0800 (PST) X-Gm-Message-State: APjAAAWIrPCwVrjbsuLe0tB5rb7iiCgQOUTT9fweAZZl6l6ZmoxxM2KK es4ISQDZgCSkLdEE5ynjpJQ/X++hxf7fa7J0yQ== X-Received: by 2002:a37:674c:: with SMTP id b73mr13753505qkc.184.1551717470393; Mon, 04 Mar 2019 08:37:50 -0800 (PST) MIME-Version: 1.0 References: <20190219074500.16454-1-vichy.kuo@gmail.com> In-Reply-To: <20190219074500.16454-1-vichy.kuo@gmail.com> From: Rob Herring Date: Mon, 4 Mar 2019 10:37:39 -0600 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH 1/1] of: reserved_mem: fix reserve memory leak To: pierre Kuo , Marek Szyprowski Cc: Frank Rowand , devicetree@vger.kernel.org, "linux-kernel@vger.kernel.org" Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org You should Cc the author(s) of this code. I've added Marek. On Tue, Feb 19, 2019 at 1:47 AM pierre Kuo wrote: > > 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. I'm not sure that un-reserving memory on error is the correct behavior. It may be fine for something like CMA, but if it is some shared memory used by another processor in the system not reserving it would probably never be correct. > > 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 >