From: Jaewon Kim <jaewon31.kim@samsung.com>
To: rppt@kernel.org, vbabka@suse.cz, akpm@linux-foundation.org
Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org,
jaewon31.kim@gmail.com, Jaewon Kim <jaewon31.kim@samsung.com>
Subject: [RESEND PATCH 02/10] memblock: detect hidden memory hole size
Date: Tue, 21 May 2024 11:39:49 +0900 [thread overview]
Message-ID: <20240521023957.2587005-3-jaewon31.kim@samsung.com> (raw)
In-Reply-To: <20240521023957.2587005-1-jaewon31.kim@samsung.com>
Bootloader knows the actual memory size, but bootloader may reserve some
memory for a specific purpose and pass the only remaining memory region
to kernel.
Even though kernel does not know what it is, we need to detect those
regions to sum up all reserved memory. Let me call it memory hole. To
expect the hole size, this patch assume two things. One is that each
physical memory has 1GB aligned size and address. And the hole is less
than 1GB. For the hole, let it be shown as unknown in memsize logic.
This is an example.
0x0bf000000-0x0c0000000 0x01000000 ( 16384 KB ) nomap unusable unknown
Signed-off-by: Jaewon Kim <jaewon31.kim@samsung.com>
---
drivers/of/fdt.c | 2 ++
include/linux/memblock.h | 2 ++
mm/memblock.c | 45 ++++++++++++++++++++++++++++++++++++++++
3 files changed, 49 insertions(+)
diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
index 605c7f471908..da82e5afed01 100644
--- a/drivers/of/fdt.c
+++ b/drivers/of/fdt.c
@@ -1194,6 +1194,8 @@ void __init early_init_dt_scan_nodes(void)
/* Handle linux,usable-memory-range property */
early_init_dt_check_for_usable_mem_range();
+
+ memblock_memsize_detect_hole();
}
bool __init early_init_dt_scan(void *params)
diff --git a/include/linux/memblock.h b/include/linux/memblock.h
index 9ccba9bb20cb..049313871059 100644
--- a/include/linux/memblock.h
+++ b/include/linux/memblock.h
@@ -617,10 +617,12 @@ static inline void memtest_report_meminfo(struct seq_file *m) { }
extern void memblock_memsize_record(const char *name, phys_addr_t base,
phys_addr_t size, bool nomap,
bool reusable);
+extern void memblock_memsize_detect_hole(void);
#else
static inline void memblock_memsize_record(const char *name, phys_addr_t base,
phys_addr_t size, bool nomap,
bool reusable) { }
+static inline void memblock_memsize_detect_hole(void) { }
#endif
#endif /* _LINUX_MEMBLOCK_H */
diff --git a/mm/memblock.c b/mm/memblock.c
index f05e7df2f8e1..5204ee71ae29 100644
--- a/mm/memblock.c
+++ b/mm/memblock.c
@@ -2084,6 +2084,51 @@ void __init_memblock memblock_memsize_record(const char *name, phys_addr_t base,
memblock_dbg("%s %pa..%pa nomap:%d reusable:%d\n",
__func__, &base, &end, nomap, reusable);
}
+
+/* This function will be called to by early_init_dt_scan_nodes */
+void __init memblock_memsize_detect_hole(void)
+{
+ phys_addr_t base, end;
+ phys_addr_t prev_end, hole_sz;
+ int idx;
+ struct memblock_region *rgn;
+ int memblock_cnt = (int)memblock.memory.cnt;
+
+ /* assume that the hole size is less than 1 GB */
+ for_each_memblock_type(idx, (&memblock.memory), rgn) {
+ prev_end = (idx == 0) ? round_down(rgn->base, SZ_1G) : end;
+ base = rgn->base;
+ end = rgn->base + rgn->size;
+
+ /* only for the last region, check a hole after the region */
+ if (idx + 1 == memblock_cnt) {
+ hole_sz = round_up(end, SZ_1G) - end;
+ if (hole_sz)
+ memblock_memsize_record(NULL, end, hole_sz,
+ true, false);
+ }
+
+ /* for each region, check a hole prior to the region */
+ hole_sz = base - prev_end;
+ if (!hole_sz)
+ continue;
+ if (hole_sz < SZ_1G) {
+ memblock_memsize_record(NULL, prev_end, hole_sz, true,
+ false);
+ } else {
+ phys_addr_t hole_sz1, hole_sz2;
+
+ hole_sz1 = round_up(prev_end, SZ_1G) - prev_end;
+ if (hole_sz1)
+ memblock_memsize_record(NULL, prev_end,
+ hole_sz1, true, false);
+ hole_sz2 = base % SZ_1G;
+ if (hole_sz2)
+ memblock_memsize_record(NULL, base - hole_sz2,
+ hole_sz2, true, false);
+ }
+ }
+}
#endif /* MEMBLOCK_MEMSIZE */
static void __init free_memmap(unsigned long start_pfn, unsigned long end_pfn)
--
2.25.1
next prev parent reply other threads:[~2024-05-21 2:40 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <CGME20240521024009epcas1p10ed9f9b929203183a29f79508e79bb76@epcas1p1.samsung.com>
2024-05-21 2:39 ` [RESEND PATCH 00/10] memblock: introduce memsize showing reserved memory Jaewon Kim
[not found] ` <CGME20240521024009epcas1p4451928c8f5b32bf84082a24c59ca7dd0@epcas1p4.samsung.com>
2024-05-21 2:39 ` [RESEND PATCH 01/10] " Jaewon Kim
[not found] ` <CGME20240521024009epcas1p3e80e90863a453053d5aac901ef644070@epcas1p3.samsung.com>
2024-05-21 2:39 ` Jaewon Kim [this message]
[not found] ` <CGME20240521024009epcas1p152671a613e86fa83d840962ee3db50fb@epcas1p1.samsung.com>
2024-05-21 2:39 ` [RESEND PATCH 03/10] memblock: handle overlapped reserved memory region Jaewon Kim
[not found] ` <CGME20240521024009epcas1p3440f857e3b31b319c270e2d658379383@epcas1p3.samsung.com>
2024-05-21 2:39 ` [RESEND PATCH 04/10] memblock: take a region intersecting an unknown region Jaewon Kim
[not found] ` <CGME20240521024009epcas1p20ddcabed3d037904a9c651d27f82c077@epcas1p2.samsung.com>
2024-05-21 2:39 ` [RESEND PATCH 05/10] memblock: track memblock changed at early param Jaewon Kim
[not found] ` <CGME20240521024009epcas1p40d0ea59e8ae93f6cc89846626fea4207@epcas1p4.samsung.com>
2024-05-21 2:39 ` [RESEND PATCH 06/10] memblock: recognize late freed size by checking PageReserved Jaewon Kim
[not found] ` <CGME20240521024009epcas1p3ccda7b2d9e6518b4575427c957e19377@epcas1p3.samsung.com>
2024-05-21 2:39 ` [RESEND PATCH 07/10] memblock: track kernel size on memsize Jaewon Kim
2024-05-22 19:03 ` kernel test robot
[not found] ` <CGME20240521024009epcas1p291bbc11c4e5cdaa922ca302d95330e6b@epcas1p2.samsung.com>
2024-05-21 2:39 ` [RESEND PATCH 08/10] memblock: print memsize summary information Jaewon Kim
[not found] ` <CGME20240521024009epcas1p441a4c458d251eec7bb6e63e671c25b4e@epcas1p4.samsung.com>
2024-05-21 2:39 ` [RESEND PATCH 09/10] memblock: print kernel internal size Jaewon Kim
2024-05-22 18:52 ` kernel test robot
[not found] ` <CGME20240521024009epcas1p15a3290b675ee66339033c185a5a8c00b@epcas1p1.samsung.com>
2024-05-21 2:39 ` [RESEND PATCH 10/10] memblock: support memsize reusable to consider as reusable Jaewon Kim
2024-05-22 22:40 ` kernel test robot
[not found] ` <CGME20240522224129epcas1p10433785cc14bef5de93e9f26aa599ff0@epcms1p8>
2024-05-23 10:55 ` Jaewon Kim
[not found] ` <CGME20240521024009epcas1p10ed9f9b929203183a29f79508e79bb76@epcms1p6>
2024-05-21 2:53 ` [RESEND PATCH 00/10] memblock: introduce memsize showing reserved memory Jaewon Kim
2024-05-21 7:31 ` Mike Rapoport
[not found] ` <CGME20240521024009epcas1p10ed9f9b929203183a29f79508e79bb76@epcms1p5>
2024-05-21 10:17 ` Jaewon Kim
2024-05-22 8:16 ` (2) " Wei Yang
[not found] ` <CGME20240521024009epcas1p10ed9f9b929203183a29f79508e79bb76@epcms1p8>
2024-05-22 8:47 ` Jaewon Kim
2024-05-23 8:55 ` Wei Yang
[not found] ` <CGME20240521024009epcas1p10ed9f9b929203183a29f79508e79bb76@epcms1p2>
2024-05-23 9:23 ` 김재원
2024-05-24 9:07 ` (2) " Jaewon Kim
2024-05-26 13:55 ` Mike Rapoport
[not found] ` <CGME20240521024009epcas1p10ed9f9b929203183a29f79508e79bb76@epcms1p7>
2024-05-27 1:30 ` Jaewon Kim
[not found] ` <20240529095119epcms1p73f0e9ff756bcb2ee6a14db459128a644@epcms1p7>
2024-05-29 11:35 ` Wei Yang
2024-05-29 13:10 ` Jaewon Kim
2024-05-30 0:03 ` Wei Yang
2024-05-27 1:35 ` Jaewon Kim
2024-05-27 16:22 ` Mike Rapoport
2024-05-30 10:49 ` Jaewon Kim
2024-05-31 1:05 ` (2) " Wei Yang
[not found] ` <CGME20240521024009epcas1p10ed9f9b929203183a29f79508e79bb76@epcms1p4>
2024-05-31 8:21 ` Jaewon Kim
2024-06-01 1:40 ` Wei Yang
2024-06-03 9:33 ` Jaewon Kim
2024-05-23 14:34 ` Mike Rapoport
2024-05-24 17:33 ` Pintu Agarwal
2024-05-22 8:20 ` Wei Yang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240521023957.2587005-3-jaewon31.kim@samsung.com \
--to=jaewon31.kim@samsung.com \
--cc=akpm@linux-foundation.org \
--cc=jaewon31.kim@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=rppt@kernel.org \
--cc=vbabka@suse.cz \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox