From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailout1.w1.samsung.com (mailout1.w1.samsung.com [210.118.77.11]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 25971423E9D for ; Wed, 26 Aug 2026 13:14:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=210.118.77.11 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787750098; cv=none; b=YrYMT2wAEE8vmvejQmwLC2MRqLUbjUI5E5UOd/DUTKYXCZDo91xmeFi9CbAfigaRPGQ+4N6KRjy3momEVs9mUzI5LNoU5fiVmEph8mNc4+iTxMHB+D6z02adkO4hD88JUQi7igf0wmFGRL89cRzE/i4XDagc139+/i5grNbK95w= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787750098; c=relaxed/simple; bh=bxyU581URPvHXkKiRZNuPyrj4a/XD1h2PNvg6XhzMLo=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:From:In-Reply-To: Content-Type:References; b=AI49Xo6AhbmsrAwAuYweAxu0yUHlkvVZ1oCQgtyxXMcOOkixiyIXcFdrTc2DagwCjq7XUj+Op2QA6FblfxG7ehmWVnWYTGaUxgwGLC9PmF/gkGmYsCKuNk+RzMK0VEeOgP/0iQVa/xqnuWMp9Ijcx40LTmEI/Quw9YErylpZrso= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=samsung.com; spf=pass smtp.mailfrom=samsung.com; dkim=pass (1024-bit key) header.d=samsung.com header.i=@samsung.com header.b=Us1hEVv1; arc=none smtp.client-ip=210.118.77.11 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=samsung.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=samsung.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=samsung.com header.i=@samsung.com header.b="Us1hEVv1" Received: from eucas1p2.samsung.com (unknown [182.198.249.207]) by mailout1.w1.samsung.com (KnoxPortal) with ESMTP id 20260826131445euoutp0125fb27dbd4b3c8cf0e0644e8f0bab3d1~PXTsNCarP2920429204euoutp01c for ; Wed, 26 Aug 2026 13:14:45 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20260826131445euoutp0125fb27dbd4b3c8cf0e0644e8f0bab3d1~PXTsNCarP2920429204euoutp01c DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1787750085; bh=VY+6n/5elVC8hwBjWkQixPjDDn3ia+6z+6/gZrGy1ZY=; h=Date:Subject:To:Cc:From:In-Reply-To:References:From; b=Us1hEVv1IxQW93jEvGhJaHi0QWVIacTPIxxmLsnAcuIhl3lp2FwlVqDO6wWYqT6eB 2CdasTRwngIpbOvEDQZ5d9TlbCar5iqR9M0vq7qyK0FJp/z+Mv8yY/YYGn7/s9xTPa eoiWzJwrrvmg2QKtV4J9BXLKQj6+bHINGLao+Hcw= Received: from eusmtip1.samsung.com (unknown [203.254.199.221]) by eucas1p1.samsung.com (KnoxPortal) with ESMTPA id 20260826131445eucas1p1dfa5844c01c4705731fdd2f4772e4fc8~PXTr_zaZu2811628116eucas1p1K; Wed, 26 Aug 2026 13:14:45 +0000 (GMT) Received: from [106.210.134.192] (unknown [106.210.134.192]) by eusmtip1.samsung.com (KnoxPortal) with ESMTPA id 20260826131444eusmtip1c8b1026d97f4887a1c808cabbdcb3df7~PXTrbvWoQ1345413454eusmtip1i; Wed, 26 Aug 2026 13:14:44 +0000 (GMT) Message-ID: <72074a49-2963-4f96-b939-79bf95a829cb@samsung.com> Date: Wed, 26 Aug 2026 15:14:44 +0200 Precedence: bulk X-Mailing-List: devicetree@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Betterbird (Windows) Subject: Re: [PATCH v2 1/5] of: reserved_mem: skip init for regions whose early reservation failed To: Wandun Chen , robh@kernel.org, saravanak@kernel.org, rppt@kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org Cc: akpm@linux-foundation.org Content-Language: en-US From: Marek Szyprowski In-Reply-To: <20260818092420.2859026-2-chenwandun1@gmail.com> Content-Transfer-Encoding: 8bit X-CMS-MailID: 20260826131445eucas1p1dfa5844c01c4705731fdd2f4772e4fc8 X-Msg-Generator: CA Content-Type: text/plain; charset="utf-8" X-RootMTR: 20260818092438eucas1p20115e5d33908e32ef4433cb246da8098 X-EPHeader: CA X-CMS-RootMailID: 20260818092438eucas1p20115e5d33908e32ef4433cb246da8098 References: <20260818092420.2859026-1-chenwandun1@gmail.com> <20260818092420.2859026-2-chenwandun1@gmail.com> On 18.08.2026 11:24, Wandun Chen wrote: > From: Wandun Chen > > __reserved_mem_reserve_reg() discards the error from > early_init_dt_reserve_memory() and returns 0 unconditionally, so the > caller counts the node in total_reserved_mem_cnt and the late scan > initializes it without checking whether the early reservation actually > succeeded. A region whose reservation failed is then handed to a > device assuming the memory is protected. > > Propagate the error so failed reservations are no longer counted, and > record the failed nodes so fdt_scan_reserved_mem_late() can skip them. > > Recording the failed nodes explicitly is necessary because > fdt_scan_reserved_mem_late() rescans the DT independently. It cannot > tell from memblock whether early reservation succeeded. > > The failed-node array is bounded by MAX_RESERVED_REGIONS, the number > of static regions is not bounded by it, so on overflow the extra nodes > fall back to being initialized, which is the current behavior. I'm not very keen on such partial solution. Indeed we have no place to store the result of the early init call, but we canĀ check if theĀ given region has been earlier marked in memblock as reserved or no-map in fdt_scan_reserved_mem_late(). If those attributes don't match the region can be simply skipped then. > Fixes: 8a6e02d0c00e ("of: reserved_mem: Restructure how the reserved memory regions are processed") > Signed-off-by: Wandun Chen > --- > drivers/of/of_reserved_mem.c | 65 ++++++++++++++++++++++++++++++------ > 1 file changed, 54 insertions(+), 11 deletions(-) > > diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c > index 8c9d6395d6a3..c6e73d710ee1 100644 > --- a/drivers/of/of_reserved_mem.c > +++ b/drivers/of/of_reserved_mem.c > @@ -32,6 +32,30 @@ static struct reserved_mem *reserved_mem __refdata = reserved_mem_array; > static int total_reserved_mem_cnt = MAX_RESERVED_REGIONS; > static int reserved_mem_count; > > +static int reserve_failed_nodes[MAX_RESERVED_REGIONS] __initdata; > +static int reserve_failed_nodes_cnt __initdata; > + > +static bool __init reserved_mem_node_reserve_failed(int node) > +{ > + int i; > + > + for (i = 0; i < reserve_failed_nodes_cnt; i++) > + if (reserve_failed_nodes[i] == node) > + return true; > + return false; > +} > + > +static bool __init record_reserve_failed_node(int node, const char *uname) > +{ > + if (reserve_failed_nodes_cnt == MAX_RESERVED_REGIONS) { > + pr_err("too many failed regions, '%s' reservation failed\n", uname); > + return false; > + } > + > + reserve_failed_nodes[reserve_failed_nodes_cnt++] = node; > + return true; > +} > + > static int __init early_init_dt_alloc_reserved_memory_arch(phys_addr_t size, > phys_addr_t align, phys_addr_t start, phys_addr_t end, bool nomap, > phys_addr_t *res_base) > @@ -141,7 +165,8 @@ static int __init early_init_dt_reserve_memory(phys_addr_t base, > * first entry in 'reg' property > */ > static int __init __reserved_mem_reserve_reg(unsigned long node, > - const char *uname) > + const char *uname, > + bool *should_record_failed_node) > { > phys_addr_t base, size; > int len, err; > @@ -149,6 +174,8 @@ static int __init __reserved_mem_reserve_reg(unsigned long node, > bool nomap; > u64 b, s; > > + *should_record_failed_node = false; > + > prop = of_flat_dt_get_addr_size_prop(node, "reg", &len); > if (!prop || !len) > return -ENOENT; > @@ -167,14 +194,20 @@ static int __init __reserved_mem_reserve_reg(unsigned long node, > base = b; > size = s; > > - if (size && early_init_dt_reserve_memory(base, size, nomap) == 0) { > - fdt_fixup_reserved_mem_node(node, base, size); > - pr_debug("Reserved memory: reserved region for node '%s': base %pa, size %lu MiB\n", > - uname, &base, (unsigned long)(size / SZ_1M)); > - } else { > + if (!size) > + return -EINVAL; > + > + err = early_init_dt_reserve_memory(base, size, nomap); > + if (err) { > + *should_record_failed_node = true; > pr_err("Reserved memory: failed to reserve memory for node '%s': base %pa, size %lu MiB\n", > uname, &base, (unsigned long)(size / SZ_1M)); > + return err; > } > + > + fdt_fixup_reserved_mem_node(node, base, size); > + pr_debug("Reserved memory: reserved region for node '%s': base %pa, size %lu MiB\n", > + uname, &base, (unsigned long)(size / SZ_1M)); > return 0; > } > > @@ -306,10 +339,14 @@ void __init fdt_scan_reserved_mem_late(void) > base = b; > size = s; > > - if (size) { > - uname = fdt_get_name(fdt, child, NULL); > - fdt_init_reserved_mem_node(child, uname, base, size); > - } > + if (!size) > + continue; > + > + if (reserved_mem_node_reserve_failed(child)) > + continue; > + > + uname = fdt_get_name(fdt, child, NULL); > + fdt_init_reserved_mem_node(child, uname, base, size); > } > > /* check for overlapping reserved regions */ > @@ -349,6 +386,7 @@ int __init fdt_scan_reserved_mem(void) > > fdt_for_each_subnode(child, fdt, node) { > const char *uname; > + bool should_record_failed_node; > int err; > > if (!of_fdt_device_is_available(fdt, child)) > @@ -356,9 +394,14 @@ int __init fdt_scan_reserved_mem(void) > > uname = fdt_get_name(fdt, child, NULL); > > - err = __reserved_mem_reserve_reg(child, uname); > + err = __reserved_mem_reserve_reg(child, uname, > + &should_record_failed_node); > if (!err) > count++; > + else if (should_record_failed_node && > + !record_reserve_failed_node(child, uname)) > + /* Keep a slot for the untracked node's late initialization. */ > + count++; > > /* > * Save the nodes for the dynamically-placed regions Best regards -- Marek Szyprowski, PhD Samsung R&D Institute Poland