From: Mike Rapoport <rppt@kernel.org>
To: linux-kernel@vger.kernel.org
Cc: Andrew Morton <akpm@linux-foundation.org>,
Catalin Marinas <catalin.marinas@arm.com>,
Christian Borntraeger <borntraeger@de.ibm.com>,
David Hildenbrand <david@redhat.com>,
Heiko Carstens <hca@linux.ibm.com>,
Mike Rapoport <rppt@kernel.org>,
Mike Rapoport <rppt@linux.ibm.com>,
Russell King <linux@armlinux.org.uk>,
Thomas Bogendoerfer <tsbogend@alpha.franken.de>,
Vasily Gorbik <gor@linux.ibm.com>, Will Deacon <will@kernel.org>,
linux-arm-kernel@lists.infradead.org, linux-mips@vger.kernel.org,
linux-mm@kvack.org, linux-s390@vger.kernel.org
Subject: [RFC/RFT PATCH 2/5] memblock: introduce generic memblock_setup_resources()
Date: Mon, 31 May 2021 15:29:56 +0300 [thread overview]
Message-ID: <20210531122959.23499-3-rppt@kernel.org> (raw)
In-Reply-To: <20210531122959.23499-1-rppt@kernel.org>
From: Mike Rapoport <rppt@linux.ibm.com>
Several architecture have very similar implementation of the setup of the
resource tree. The implementations loop over memory ranges registered in
memblock, request a "System RAM" resource for each range and then reserve
resource rages corresponding to various sections of the kernel image. If
kexec/crash dump are enable the crashk_res region is also reserved.
Move the implementation of resource tree setup from s390 to memblock. It
will be then used by several other architectures as well.
Signed-off-by: Mike Rapoport <rppt@linux.ibm.com>
---
arch/s390/kernel/setup.c | 73 +--------------------------------
include/linux/memblock.h | 2 +
mm/memblock.c | 87 ++++++++++++++++++++++++++++++++++++++++
3 files changed, 90 insertions(+), 72 deletions(-)
diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c
index 30430e7c1b03..6f3c82cc0b0d 100644
--- a/arch/s390/kernel/setup.c
+++ b/arch/s390/kernel/setup.c
@@ -481,80 +481,9 @@ static void __init setup_lowcore_dat_on(void)
__ctl_set_bit(0, 28);
}
-static struct resource code_resource = {
- .name = "Kernel code",
- .flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM,
-};
-
-static struct resource data_resource = {
- .name = "Kernel data",
- .flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM,
-};
-
-static struct resource bss_resource = {
- .name = "Kernel bss",
- .flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM,
-};
-
-static struct resource __initdata *standard_resources[] = {
- &code_resource,
- &data_resource,
- &bss_resource,
-#ifdef CONFIG_CRASH_DUMP
- &crashk_res,
-#endif
-};
-
static void __init setup_resources(void)
{
- struct resource *res, *std_res, *sub_res;
- phys_addr_t start, end;
- int j;
- u64 i;
-
- code_resource.start = (unsigned long) _text;
- code_resource.end = (unsigned long) _etext - 1;
- data_resource.start = (unsigned long) _etext;
- data_resource.end = (unsigned long) _edata - 1;
- bss_resource.start = (unsigned long) __bss_start;
- bss_resource.end = (unsigned long) __bss_stop - 1;
-
- for_each_mem_range(i, &start, &end) {
- res = memblock_alloc(sizeof(*res), 8);
- if (!res)
- panic("%s: Failed to allocate %zu bytes align=0x%x\n",
- __func__, sizeof(*res), 8);
- res->flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM;
-
- res->name = "System RAM";
- res->start = start;
- /*
- * In memblock, end points to the first byte after the
- * range while in resourses, end points to the last byte in
- * the range.
- */
- res->end = end - 1;
- request_resource(&iomem_resource, res);
-
- for (j = 0; j < ARRAY_SIZE(standard_resources); j++) {
- std_res = standard_resources[j];
- if (!std_res->end || std_res->start < res->start ||
- std_res->start > res->end)
- continue;
- if (std_res->end > res->end) {
- sub_res = memblock_alloc(sizeof(*sub_res), 8);
- if (!sub_res)
- panic("%s: Failed to allocate %zu bytes align=0x%x\n",
- __func__, sizeof(*sub_res), 8);
- *sub_res = *std_res;
- sub_res->end = res->end;
- std_res->start = res->end + 1;
- request_resource(res, sub_res);
- } else {
- request_resource(res, std_res);
- }
- }
- }
+ memblock_setup_resources();
}
static void __init setup_ident_map_size(void)
diff --git a/include/linux/memblock.h b/include/linux/memblock.h
index 5984fff3f175..44c29ebae842 100644
--- a/include/linux/memblock.h
+++ b/include/linux/memblock.h
@@ -121,6 +121,8 @@ void memblock_free_all(void);
void reset_node_managed_pages(pg_data_t *pgdat);
void reset_all_zones_managed_pages(void);
+void memblock_setup_resources(void);
+
/* Low level functions */
void __next_mem_range(u64 *idx, int nid, enum memblock_flags flags,
struct memblock_type *type_a,
diff --git a/mm/memblock.c b/mm/memblock.c
index afaefa8fc6ab..504435753259 100644
--- a/mm/memblock.c
+++ b/mm/memblock.c
@@ -16,6 +16,8 @@
#include <linux/kmemleak.h>
#include <linux/seq_file.h>
#include <linux/memblock.h>
+#include <linux/ioport.h>
+#include <linux/kexec.h>
#include <asm/sections.h>
#include <linux/io.h>
@@ -2062,6 +2064,91 @@ void __init memblock_free_all(void)
totalram_pages_add(pages);
}
+static struct resource code_resource = {
+ .name = "Kernel code",
+ .flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM,
+};
+
+static struct resource rodata_resource = {
+ .name = "Kernel rodata",
+ .flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM,
+};
+
+static struct resource data_resource = {
+ .name = "Kernel data",
+ .flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM,
+};
+
+static struct resource bss_resource = {
+ .name = "Kernel bss",
+ .flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM,
+};
+
+static struct resource __initdata *standard_resources[] = {
+ &code_resource,
+ &rodata_resource,
+ &data_resource,
+ &bss_resource,
+#ifdef CONFIG_KEXEC_CORE
+ &crashk_res,
+#endif
+};
+
+void __init memblock_setup_resources(void)
+{
+ struct resource *res, *kres, *sub_res;
+ phys_addr_t start, end;
+ int j;
+ u64 i;
+
+ code_resource.start = __pa_symbol(_text);
+ code_resource.end = __pa_symbol(_etext)-1;
+ rodata_resource.start = __pa_symbol(__start_rodata);
+ rodata_resource.end = __pa_symbol(__end_rodata)-1;
+ data_resource.start = __pa_symbol(_sdata);
+ data_resource.end = __pa_symbol(_edata)-1;
+ bss_resource.start = __pa_symbol(__bss_start);
+ bss_resource.end = __pa_symbol(__bss_stop)-1;
+
+ for_each_mem_range(i, &start, &end) {
+ res = memblock_alloc(sizeof(*res), 8);
+ if (!res)
+ panic("%s: Failed to allocate %zu bytes align=0x%x\n",
+ __func__, sizeof(*res), 8);
+ res->flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM;
+
+ res->name = "System RAM";
+ res->start = start;
+
+ /*
+ * In memblock, end points to the first byte after the
+ * range while in resourses, end points to the last byte in
+ * the range.
+ */
+ res->end = end - 1;
+ request_resource(&iomem_resource, res);
+
+ for (j = 0; j < ARRAY_SIZE(standard_resources); j++) {
+ kres = standard_resources[j];
+ if (!kres->end || kres->start < res->start ||
+ kres->start > res->end)
+ continue;
+ if (kres->end > res->end) {
+ sub_res = memblock_alloc(sizeof(*sub_res), 8);
+ if (!sub_res)
+ panic("%s: Failed to allocate %zu bytes align=0x%x\n",
+ __func__, sizeof(*sub_res), 8);
+ *sub_res = *kres;
+ sub_res->end = res->end;
+ kres->start = res->end + 1;
+ request_resource(res, sub_res);
+ } else {
+ request_resource(res, kres);
+ }
+ }
+ }
+}
+
#if defined(CONFIG_DEBUG_FS) && defined(CONFIG_ARCH_KEEP_MEMBLOCK)
static int memblock_debug_show(struct seq_file *m, void *private)
--
2.28.0
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2021-05-31 12:33 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-05-31 12:29 [RFC/RFT PATCH 0/5] consolidate "System RAM" resources setup Mike Rapoport
2021-05-31 12:29 ` [RFC/RFT PATCH 1/5] s390: make crashk_res resource a child of "System RAM" Mike Rapoport
2021-06-01 8:45 ` David Hildenbrand
2021-06-01 9:02 ` David Hildenbrand
2021-06-02 6:25 ` Mike Rapoport
2021-06-01 13:18 ` Gerald Schaefer
2021-06-02 6:54 ` Mike Rapoport
2021-05-31 12:29 ` Mike Rapoport [this message]
2021-06-01 13:54 ` [RFC/RFT PATCH 2/5] memblock: introduce generic memblock_setup_resources() Russell King (Oracle)
2021-06-02 8:33 ` Mike Rapoport
2021-06-02 10:15 ` Russell King (Oracle)
2021-06-02 13:54 ` Mike Rapoport
2021-06-02 15:51 ` Russell King (Oracle)
2021-06-02 18:43 ` Mike Rapoport
2021-06-02 20:15 ` Russell King (Oracle)
2021-06-03 10:32 ` Mike Rapoport
2021-05-31 12:29 ` [RFC/RFT PATCH 3/5] arm: switch to " Mike Rapoport
2021-05-31 12:29 ` [RFC/RFT PATCH 4/5] MIPS: switch to generic memblock_setup_resources Mike Rapoport
2021-05-31 12:29 ` [RFC/RFT PATCH 5/5] arm64: switch to generic memblock_setup_resources() Mike Rapoport
2021-06-01 13:44 ` [RFC/RFT PATCH 0/5] consolidate "System RAM" resources setup Russell King (Oracle)
2021-06-02 7:05 ` Mike Rapoport
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=20210531122959.23499-3-rppt@kernel.org \
--to=rppt@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=borntraeger@de.ibm.com \
--cc=catalin.marinas@arm.com \
--cc=david@redhat.com \
--cc=gor@linux.ibm.com \
--cc=hca@linux.ibm.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mips@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-s390@vger.kernel.org \
--cc=linux@armlinux.org.uk \
--cc=rppt@linux.ibm.com \
--cc=tsbogend@alpha.franken.de \
--cc=will@kernel.org \
/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;
as well as URLs for NNTP newsgroup(s).