* [PATCH 0/3] arm64: remove UEFI reserved regions from linear mapping
@ 2015-09-14 15:55 Ard Biesheuvel
2015-09-14 15:55 ` [PATCH 1/3] mm/memblock: add MEMBLOCK_NOMAP attribute to memblock memory table Ard Biesheuvel
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Ard Biesheuvel @ 2015-09-14 15:55 UTC (permalink / raw)
To: linux-arm-kernel, linux-mm, catalin.marinas, will.deacon,
leif.lindholm, mark.rutland, msalter, akpm
Cc: Ard Biesheuvel
This is an alternative approach to the series I posted in November 2014:
thread.gmane.org/gmane.linux.kernel.efi/5133
For arm64, we need to keep track of which parts of the physical memory space
are backed by normal memory, since device mappings and memory mappings are
mutually incompatible (device mappings don't allow unaligned accesses which
may occur when parsing ACPI tables, for instance, and mapping devices as
memory is also not allowed)
Instead of adding a physmem memblock table that contains all of memory,
including the memory that should not be covered by the linear mapping,
this series introduces a MEMBLOCK_NOMAP attribute that allows us to
carry the same information in the ordinary 'memory' memblock table.
Patch #1 introduces the attribute and the associated plumbing to interpret
the attribute and to ensure MEMBLOCK_NOMAP regions are not considered for
allocations.
Patch #2 makes the arm64 core mapping code aware of MEMBLOCK_NOMAP, by
honoring it when setting up the linear mapping, and by making pfn_valid()
aware of it.
Patch #3 updates the UEFI memory map handling logic to mark reserved regions
as MEMBLOCK_NOMAP.
Notable about this series is that it does not require any changes to the
iomem resource table handling or the definition of page_is_ram(), since
the nomap regions are still registered as 'System RAM'.
Ard Biesheuvel (3):
mm/memblock: add MEMBLOCK_NOMAP attribute to memblock memory table
arm64: only consider memblocks with NOMAP cleared for linear mapping
arm64/efi: mark UEFI reserved regions as MEMBLOCK_NOMAP
arch/arm64/kernel/efi.c | 5 ++--
arch/arm64/mm/init.c | 2 +-
arch/arm64/mm/mmu.c | 2 ++
include/linux/memblock.h | 8 ++++++
mm/memblock.c | 28 ++++++++++++++++++++
5 files changed, 41 insertions(+), 4 deletions(-)
--
1.9.1
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 1/3] mm/memblock: add MEMBLOCK_NOMAP attribute to memblock memory table
2015-09-14 15:55 [PATCH 0/3] arm64: remove UEFI reserved regions from linear mapping Ard Biesheuvel
@ 2015-09-14 15:55 ` Ard Biesheuvel
2015-09-14 15:55 ` [PATCH 2/3] arm64: only consider memblocks with NOMAP cleared for linear mapping Ard Biesheuvel
2015-09-14 15:55 ` [PATCH 3/3] arm64/efi: mark UEFI reserved regions as MEMBLOCK_NOMAP Ard Biesheuvel
2 siblings, 0 replies; 4+ messages in thread
From: Ard Biesheuvel @ 2015-09-14 15:55 UTC (permalink / raw)
To: linux-arm-kernel, linux-mm, catalin.marinas, will.deacon,
leif.lindholm, mark.rutland, msalter, akpm
Cc: Ard Biesheuvel
This introduces the MEMBLOCK_NOMAP attribute and the required plumbing
to make it usable as an indicator that some parts of normal memory
should not be covered by the kernel direct mapping. It is up to the
arch to actually honor the attribute when laying out this mapping,
but the memblock code itself is modified to disregard these regions
for allocations and other general use.
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
---
include/linux/memblock.h | 8 ++++++
mm/memblock.c | 28 ++++++++++++++++++++
2 files changed, 36 insertions(+)
diff --git a/include/linux/memblock.h b/include/linux/memblock.h
index c518eb589260..fdd6ac55c281 100644
--- a/include/linux/memblock.h
+++ b/include/linux/memblock.h
@@ -25,6 +25,7 @@ enum {
MEMBLOCK_NONE = 0x0, /* No special request */
MEMBLOCK_HOTPLUG = 0x1, /* hotpluggable region */
MEMBLOCK_MIRROR = 0x2, /* mirrored region */
+ MEMBLOCK_NOMAP = 0x4, /* don't add to kernel direct mapping */
};
struct memblock_region {
@@ -82,6 +83,7 @@ bool memblock_overlaps_region(struct memblock_type *type,
int memblock_mark_hotplug(phys_addr_t base, phys_addr_t size);
int memblock_clear_hotplug(phys_addr_t base, phys_addr_t size);
int memblock_mark_mirror(phys_addr_t base, phys_addr_t size);
+int memblock_mark_nomap(phys_addr_t base, phys_addr_t size);
ulong choose_memblock_flags(void);
/* Low level functions */
@@ -188,6 +190,11 @@ static inline bool memblock_is_mirror(struct memblock_region *m)
return m->flags & MEMBLOCK_MIRROR;
}
+static inline bool memblock_is_nomap(struct memblock_region *m)
+{
+ return m->flags & MEMBLOCK_NOMAP;
+}
+
#ifdef CONFIG_HAVE_MEMBLOCK_NODE_MAP
int memblock_search_pfn_nid(unsigned long pfn, unsigned long *start_pfn,
unsigned long *end_pfn);
@@ -323,6 +330,7 @@ phys_addr_t memblock_start_of_DRAM(void);
phys_addr_t memblock_end_of_DRAM(void);
void memblock_enforce_memory_limit(phys_addr_t memory_limit);
int memblock_is_memory(phys_addr_t addr);
+int memblock_is_map_memory(phys_addr_t addr);
int memblock_is_region_memory(phys_addr_t base, phys_addr_t size);
int memblock_is_reserved(phys_addr_t addr);
bool memblock_is_region_reserved(phys_addr_t base, phys_addr_t size);
diff --git a/mm/memblock.c b/mm/memblock.c
index 1c7b647e5897..bf2c8cfbc520 100644
--- a/mm/memblock.c
+++ b/mm/memblock.c
@@ -822,6 +822,17 @@ int __init_memblock memblock_mark_mirror(phys_addr_t base, phys_addr_t size)
return memblock_setclr_flag(base, size, 1, MEMBLOCK_MIRROR);
}
+/**
+ * memblock_mark_nomap - Mark a memory region with flag MEMBLOCK_NOMAP.
+ * @base: the base phys addr of the region
+ * @size: the size of the region
+ *
+ * Return 0 on success, -errno on failure.
+ */
+int __init_memblock memblock_mark_nomap(phys_addr_t base, phys_addr_t size)
+{
+ return memblock_setclr_flag(base, size, 1, MEMBLOCK_NOMAP);
+}
/**
* __next_reserved_mem_region - next function for for_each_reserved_region()
@@ -913,6 +924,10 @@ void __init_memblock __next_mem_range(u64 *idx, int nid, ulong flags,
if ((flags & MEMBLOCK_MIRROR) && !memblock_is_mirror(m))
continue;
+ /* skip nomap memory unless we were asked for it explicitly */
+ if (!(flags & MEMBLOCK_NOMAP) && memblock_is_nomap(m))
+ continue;
+
if (!type_b) {
if (out_start)
*out_start = m_start;
@@ -1022,6 +1037,10 @@ void __init_memblock __next_mem_range_rev(u64 *idx, int nid, ulong flags,
if ((flags & MEMBLOCK_MIRROR) && !memblock_is_mirror(m))
continue;
+ /* skip nomap memory unless we were asked for it explicitly */
+ if (!(flags & MEMBLOCK_NOMAP) && memblock_is_nomap(m))
+ continue;
+
if (!type_b) {
if (out_start)
*out_start = m_start;
@@ -1519,6 +1538,15 @@ int __init_memblock memblock_is_memory(phys_addr_t addr)
return memblock_search(&memblock.memory, addr) != -1;
}
+int __init_memblock memblock_is_map_memory(phys_addr_t addr)
+{
+ int i = memblock_search(&memblock.memory, addr);
+
+ if (i == -1)
+ return false;
+ return !memblock_is_nomap(&memblock.memory.regions[i]);
+}
+
#ifdef CONFIG_HAVE_MEMBLOCK_NODE_MAP
int __init_memblock memblock_search_pfn_nid(unsigned long pfn,
unsigned long *start_pfn, unsigned long *end_pfn)
--
1.9.1
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 2/3] arm64: only consider memblocks with NOMAP cleared for linear mapping
2015-09-14 15:55 [PATCH 0/3] arm64: remove UEFI reserved regions from linear mapping Ard Biesheuvel
2015-09-14 15:55 ` [PATCH 1/3] mm/memblock: add MEMBLOCK_NOMAP attribute to memblock memory table Ard Biesheuvel
@ 2015-09-14 15:55 ` Ard Biesheuvel
2015-09-14 15:55 ` [PATCH 3/3] arm64/efi: mark UEFI reserved regions as MEMBLOCK_NOMAP Ard Biesheuvel
2 siblings, 0 replies; 4+ messages in thread
From: Ard Biesheuvel @ 2015-09-14 15:55 UTC (permalink / raw)
To: linux-arm-kernel, linux-mm, catalin.marinas, will.deacon,
leif.lindholm, mark.rutland, msalter, akpm
Cc: Ard Biesheuvel
Take the new memblock attribute MEMBLOCK_NOMAP into account when
deciding whether a certain region is or should covered by the
kernel direct mapping.
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
---
arch/arm64/mm/init.c | 2 +-
arch/arm64/mm/mmu.c | 2 ++
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c
index f5c0680d17d9..48133235d9f5 100644
--- a/arch/arm64/mm/init.c
+++ b/arch/arm64/mm/init.c
@@ -119,7 +119,7 @@ static void __init zone_sizes_init(unsigned long min, unsigned long max)
#ifdef CONFIG_HAVE_ARCH_PFN_VALID
int pfn_valid(unsigned long pfn)
{
- return memblock_is_memory(pfn << PAGE_SHIFT);
+ return memblock_is_map_memory(pfn << PAGE_SHIFT);
}
EXPORT_SYMBOL(pfn_valid);
#endif
diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c
index 9211b8527f25..7067ae232bed 100644
--- a/arch/arm64/mm/mmu.c
+++ b/arch/arm64/mm/mmu.c
@@ -370,6 +370,8 @@ static void __init map_mem(void)
if (start >= end)
break;
+ if (memblock_is_nomap(reg))
+ continue;
#ifndef CONFIG_ARM64_64K_PAGES
/*
--
1.9.1
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 3/3] arm64/efi: mark UEFI reserved regions as MEMBLOCK_NOMAP
2015-09-14 15:55 [PATCH 0/3] arm64: remove UEFI reserved regions from linear mapping Ard Biesheuvel
2015-09-14 15:55 ` [PATCH 1/3] mm/memblock: add MEMBLOCK_NOMAP attribute to memblock memory table Ard Biesheuvel
2015-09-14 15:55 ` [PATCH 2/3] arm64: only consider memblocks with NOMAP cleared for linear mapping Ard Biesheuvel
@ 2015-09-14 15:55 ` Ard Biesheuvel
2 siblings, 0 replies; 4+ messages in thread
From: Ard Biesheuvel @ 2015-09-14 15:55 UTC (permalink / raw)
To: linux-arm-kernel, linux-mm, catalin.marinas, will.deacon,
leif.lindholm, mark.rutland, msalter, akpm
Cc: Ard Biesheuvel
Change the EFI memory reservation logic to use memblock_mark_nomap()
rather than memblock_reserve() to mark UEFI reserved regions as
occupied. In addition to reserving them against allocations done by
memblock, this will also prevent them from being covered by the linear
mapping.
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
---
arch/arm64/kernel/efi.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/arch/arm64/kernel/efi.c b/arch/arm64/kernel/efi.c
index e8ca6eaedd02..f609325c4a83 100644
--- a/arch/arm64/kernel/efi.c
+++ b/arch/arm64/kernel/efi.c
@@ -193,7 +193,7 @@ static __init void reserve_regions(void)
early_init_dt_add_memory_arch(paddr, size);
if (is_reserve_region(md)) {
- memblock_reserve(paddr, size);
+ memblock_mark_nomap(paddr, size);
if (uefi_debug)
pr_cont("*");
}
@@ -215,8 +215,6 @@ void __init efi_init(void)
efi_system_table = params.system_table;
- memblock_reserve(params.mmap & PAGE_MASK,
- PAGE_ALIGN(params.mmap_size + (params.mmap & ~PAGE_MASK)));
memmap.phys_map = (void *)params.mmap;
memmap.map = early_memremap(params.mmap, params.mmap_size);
memmap.map_end = memmap.map + params.mmap_size;
@@ -228,6 +226,7 @@ void __init efi_init(void)
reserve_regions();
early_memunmap(memmap.map, params.mmap_size);
+ memblock_mark_nomap(params.mmap, params.mmap_size);
}
static bool __init efi_virtmap_init(void)
--
1.9.1
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2015-09-14 15:55 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-09-14 15:55 [PATCH 0/3] arm64: remove UEFI reserved regions from linear mapping Ard Biesheuvel
2015-09-14 15:55 ` [PATCH 1/3] mm/memblock: add MEMBLOCK_NOMAP attribute to memblock memory table Ard Biesheuvel
2015-09-14 15:55 ` [PATCH 2/3] arm64: only consider memblocks with NOMAP cleared for linear mapping Ard Biesheuvel
2015-09-14 15:55 ` [PATCH 3/3] arm64/efi: mark UEFI reserved regions as MEMBLOCK_NOMAP Ard Biesheuvel
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).