On Thu, Mar 23, 2023 at 12:52:36PM +0100, Alexandre Ghiti wrote:
On 3/20/23 18:44, Mike Rapoport wrote:Didn't read the rest of the patches :)
On Mon, Mar 20, 2023 at 11:54:14AM +0100, Alexandre Ghiti wrote:
Hi Mike,With this change
On 3/16/23 21:12, Mike Rapoport wrote:
Hi Alexandre,No worries :)
On Thu, Mar 16, 2023 at 02:17:09PM +0100, Alexandre Ghiti wrote:
This function allows to split a region in memblock.memory and will beSorry I've missed it last time. The changelog is fine in the context of
useful when setting up the linear mapping with STRICT_KERNEL_RWX: it
allows to isolate the kernel text/rodata and then avoid to map those
regions with a PUD/P4D/PGD.
this series, but if you look at it as a part of memblock changelog itWhat about: "memblock.memory contains the list of memory regions and a
doesn't provide enough background on why memblock_isolate_memory() is
useful.
Can you please add more context so it would be self explanatory?
memory region can cover memory that will be mapped with different
permissions. So to ease the mapping process, allow to isolate those regions
by introducing a new function called memblock_isolate_memory. This will be
used in arch specific code to isolate the kernel text/rodata regions when
STRICT_KERNEL_RWX is enabled so that we avoid mapping them with PUD/P4D/PGD
mappings."
... STRICT_KERNEL_RWX is enabled so that they can be mapped with base pages.
Actually they will get mapped with PMD mappings :) I'll just append: "or PMD
mapping" to your sentence above if that's ok with you.
.. STRICT_KERNEL_RWX is enabled so that they can be mapped with differently
than the rest of the memory.
Does it cover the usescases?
Acked-by: Mike Rapoport (IBM) <rppt@xxxxxxxxxx>
Thanks for your review,
Alex
Thanks,
Alex
Signed-off-by: Alexandre Ghiti <alexghiti@xxxxxxxxxxxx>
Reviewed-by: Anup Patel <anup@xxxxxxxxxxxxxx>
Tested-by: Anup Patel <anup@xxxxxxxxxxxxxx>
---
include/linux/memblock.h | 1 +
mm/memblock.c | 20 ++++++++++++++++++++
2 files changed, 21 insertions(+)
diff --git a/include/linux/memblock.h b/include/linux/memblock.h
index 50ad19662a32..2f7ef97c0da7 100644
--- a/include/linux/memblock.h
+++ b/include/linux/memblock.h
@@ -125,6 +125,7 @@ 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);
int memblock_clear_nomap(phys_addr_t base, phys_addr_t size);
+int memblock_isolate_memory(phys_addr_t base, phys_addr_t size);
void memblock_free_all(void);
void memblock_free(void *ptr, size_t size);
diff --git a/mm/memblock.c b/mm/memblock.c
index 25fd0626a9e7..e8c651a37012 100644
--- a/mm/memblock.c
+++ b/mm/memblock.c
@@ -805,6 +805,26 @@ static int __init_memblock memblock_isolate_range(struct memblock_type *type,
return 0;
}
+/**
+ * memblock_isolate_memory - isolate given range in memblock.memory
+ * @base: base of range to isolate
+ * @size: size of range to isolate
+ *
+ * Isolates the given range in memblock.memory so that it does not share any
+ * region with other ranges.
+ *
+ * Return:
+ * 0 on success, -errno on failure.
+ */
+
+int __init_memblock memblock_isolate_memory(phys_addr_t base, phys_addr_t size)
+{
+ int start_rgn, end_rgn;
+
+ return memblock_isolate_range(&memblock.memory, base, size,
+ &start_rgn, &end_rgn);
+}
+
static int __init_memblock memblock_remove_range(struct memblock_type *type,
phys_addr_t base, phys_addr_t size)
{
--
2.37.2