From: Mike Rapoport via OP-TEE <op-tee@lists.trustedfirmware.org>
To: Vincent Donnefort <vdonnefort@google.com>
Cc: catalin.marinas@arm.com, will@kernel.org,
akpm@linux-foundation.org, sudeep.holla@kernel.org,
jenswi@kernel.org, robh@kernel.org, mark.rutland@arm.com,
sumit.garg@kernel.org, ardb@kernel.org,
thierry.reding@kernel.org, david@kernel.org,
danielmentz@google.com, linux-arm-kernel@lists.infradead.org,
linux-mm@kvack.org, op-tee@lists.trustedfirmware.org,
devicetree@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v9 01/10] memblock: Introduce MEMBLOCK_LLMAP
Date: Sun, 6 Sep 2026 22:33:11 +0300 [thread overview]
Message-ID: <ap2_926WXr7uAYVX@kernel.org> (raw)
In-Reply-To: <20260902104712.2399797-2-vdonnefort@google.com>
On Wed, Sep 02, 2026 at 11:47:03AM +0100, Vincent Donnefort wrote:
> Keeping last-level mappings is interesting on some architectures as it
> allows mapping/unmapping pages from the kernel direct map without the
> risk of splitting blocks which, under the break-before-make rule, may
> trigger page-faults the kernel can't handle.
>
> However, mapping the entire direct map at PTE-level is costly. So
> instead, create a new memblock flag MEMBLOCK_LLMAP to enable the system
I believe MEMBLOCK_PTE_MAP sounds more descriptive.
> to decide which region must be covered by mappings up to the last-level.
>
> Signed-off-by: Vincent Donnefort <vdonnefort@google.com>
>
> diff --git a/include/linux/memblock.h b/include/linux/memblock.h
> index d62db9e776cf..d40a5ded188d 100644
> --- a/include/linux/memblock.h
> +++ b/include/linux/memblock.h
> @@ -52,6 +52,7 @@ extern unsigned long long max_possible_pfn;
> * kernel that we know is good to use. It is the only memory that
> * allocations may happen from in this phase.
> * @MEMBLOCK_RSRV_HUGETLB: memory is reserved for hugetlb pages
> + * @MEMBLOCK_LLMAP: memory region to be mapped using last-level mapping
> */
> enum memblock_flags {
> MEMBLOCK_NONE = 0x0, /* No special request */
> @@ -63,6 +64,7 @@ enum memblock_flags {
> MEMBLOCK_RSRV_KERN = 0x20, /* memory reserved for kernel use */
> MEMBLOCK_KHO_SCRATCH = 0x40, /* scratch memory for kexec handover */
> MEMBLOCK_RSRV_HUGETLB = 0x80, /* memory reserved for hugetlb pages */
> + MEMBLOCK_LLMAP = 0x100,/* last-level mapping */
> };
>
> /**
> @@ -160,6 +162,8 @@ int memblock_reserved_mark_noinit(phys_addr_t base, phys_addr_t size);
> int memblock_reserved_mark_kern(phys_addr_t base, phys_addr_t size);
> int memblock_mark_kho_scratch(phys_addr_t base, phys_addr_t size);
> int memblock_clear_kho_scratch(phys_addr_t base, phys_addr_t size);
> +int memblock_mark_llmap(phys_addr_t base, phys_addr_t size);
> +int memblock_clear_llmap(phys_addr_t base, phys_addr_t size);
>
> void memblock_free(void *ptr, size_t size);
> void reset_all_zones_managed_pages(void);
> @@ -306,6 +310,11 @@ static inline bool memblock_is_kho_scratch(struct memblock_region *m)
> return m->flags & MEMBLOCK_KHO_SCRATCH;
> }
>
> +static inline bool memblock_is_llmap(struct memblock_region *m)
> +{
> + return m->flags & MEMBLOCK_LLMAP;
> +}
> +
> int memblock_search_pfn_nid(unsigned long pfn, unsigned long *start_pfn,
> unsigned long *end_pfn);
> void __next_mem_pfn_range(int *idx, int nid, unsigned long *out_start_pfn,
> diff --git a/mm/memblock.c b/mm/memblock.c
> index 9ce86349a29f..1591b50503ed 100644
> --- a/mm/memblock.c
> +++ b/mm/memblock.c
> @@ -1119,6 +1119,16 @@ int __init_memblock memblock_mark_mirror(phys_addr_t base, phys_addr_t size)
> */
> int __init_memblock memblock_mark_nomap(phys_addr_t base, phys_addr_t size)
> {
> + struct memblock_region *r;
> +
> + memblock_cap_size(base, &size);
> +
> + for_each_mem_region(r) {
> + if (memblock_is_llmap(r) &&
> + memblock_addrs_overlap(base, size, r->base, r->size))
> + return -EINVAL;
> + }
I'm not very fond of implicit skips here. memblock has no idea what's the
caller intention, maybe it actually wants to change the memory from nomap
to pte-mapped.
I'd rather warn in memblock_is_nomap() and memblock_is_llmap() if they both
are set and let the caller deal with making sure they are not.
> +
> return memblock_setclr_flag(&memblock.memory, base, size, 1, MEMBLOCK_NOMAP);
> }
>
> @@ -1204,6 +1214,45 @@ __init int memblock_clear_kho_scratch(phys_addr_t base, phys_addr_t size)
> MEMBLOCK_KHO_SCRATCH);
> }
>
> +/**
> + * memblock_mark_llmap - Mark a memory region with flag MEMBLOCK_LLMAP.
> + * @base: the base phys addr of the region
> + * @size: the size of the region
> + *
> + * If supported by the architecture, such region is mapped at the last-level in
> + * the kernel direct map.
> + *
> + * Return: 0 on success, -errno on failure.
> + */
> +int __init_memblock memblock_mark_llmap(phys_addr_t base, phys_addr_t size)
> +{
> + struct memblock_region *r;
> +
> + memblock_cap_size(base, &size);
> +
> + for_each_mem_region(r) {
> + if (memblock_is_nomap(r) &&
> + memblock_addrs_overlap(base, size, r->base, r->size))
> + return -EINVAL;
> + }
same here
> +
> + return memblock_setclr_flag(&memblock.memory, base, size, 1,
> + MEMBLOCK_LLMAP);
> +}
> +
> +/**
> + * memblock_clear_llmap - Clear flag MEMBLOCK_LLMAP for a specified region.
> + * @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_clear_llmap(phys_addr_t base, phys_addr_t size)
> +{
> + return memblock_setclr_flag(&memblock.memory, base, size, 0,
> + MEMBLOCK_LLMAP);
> +}
> +
> static bool should_skip_region(struct memblock_type *type,
> struct memblock_region *m,
> int nid, int flags)
> @@ -2886,6 +2935,7 @@ static const char * const flagname[] = {
> [ilog2(MEMBLOCK_RSRV_NOINIT)] = "RSV_NIT",
> [ilog2(MEMBLOCK_RSRV_KERN)] = "RSV_KERN",
> [ilog2(MEMBLOCK_KHO_SCRATCH)] = "KHO_SCRATCH",
> + [ilog2(MEMBLOCK_LLMAP)] = "LLMAP",
> };
>
> static int memblock_debug_show(struct seq_file *m, void *private)
> --
> 2.55.0.970.g62bdec98f9-goog
>
--
Sincerely yours,
Mike.
WARNING: multiple messages have this Message-ID (diff)
From: Mike Rapoport <rppt@kernel.org>
To: Vincent Donnefort <vdonnefort@google.com>
Cc: catalin.marinas@arm.com, will@kernel.org,
akpm@linux-foundation.org, sudeep.holla@kernel.org,
jenswi@kernel.org, robh@kernel.org, mark.rutland@arm.com,
sumit.garg@kernel.org, ardb@kernel.org,
thierry.reding@kernel.org, david@kernel.org,
danielmentz@google.com, linux-arm-kernel@lists.infradead.org,
linux-mm@kvack.org, op-tee@lists.trustedfirmware.org,
devicetree@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v9 01/10] memblock: Introduce MEMBLOCK_LLMAP
Date: Sun, 6 Sep 2026 22:33:11 +0300 [thread overview]
Message-ID: <ap2_926WXr7uAYVX@kernel.org> (raw)
In-Reply-To: <20260902104712.2399797-2-vdonnefort@google.com>
On Wed, Sep 02, 2026 at 11:47:03AM +0100, Vincent Donnefort wrote:
> Keeping last-level mappings is interesting on some architectures as it
> allows mapping/unmapping pages from the kernel direct map without the
> risk of splitting blocks which, under the break-before-make rule, may
> trigger page-faults the kernel can't handle.
>
> However, mapping the entire direct map at PTE-level is costly. So
> instead, create a new memblock flag MEMBLOCK_LLMAP to enable the system
I believe MEMBLOCK_PTE_MAP sounds more descriptive.
> to decide which region must be covered by mappings up to the last-level.
>
> Signed-off-by: Vincent Donnefort <vdonnefort@google.com>
>
> diff --git a/include/linux/memblock.h b/include/linux/memblock.h
> index d62db9e776cf..d40a5ded188d 100644
> --- a/include/linux/memblock.h
> +++ b/include/linux/memblock.h
> @@ -52,6 +52,7 @@ extern unsigned long long max_possible_pfn;
> * kernel that we know is good to use. It is the only memory that
> * allocations may happen from in this phase.
> * @MEMBLOCK_RSRV_HUGETLB: memory is reserved for hugetlb pages
> + * @MEMBLOCK_LLMAP: memory region to be mapped using last-level mapping
> */
> enum memblock_flags {
> MEMBLOCK_NONE = 0x0, /* No special request */
> @@ -63,6 +64,7 @@ enum memblock_flags {
> MEMBLOCK_RSRV_KERN = 0x20, /* memory reserved for kernel use */
> MEMBLOCK_KHO_SCRATCH = 0x40, /* scratch memory for kexec handover */
> MEMBLOCK_RSRV_HUGETLB = 0x80, /* memory reserved for hugetlb pages */
> + MEMBLOCK_LLMAP = 0x100,/* last-level mapping */
> };
>
> /**
> @@ -160,6 +162,8 @@ int memblock_reserved_mark_noinit(phys_addr_t base, phys_addr_t size);
> int memblock_reserved_mark_kern(phys_addr_t base, phys_addr_t size);
> int memblock_mark_kho_scratch(phys_addr_t base, phys_addr_t size);
> int memblock_clear_kho_scratch(phys_addr_t base, phys_addr_t size);
> +int memblock_mark_llmap(phys_addr_t base, phys_addr_t size);
> +int memblock_clear_llmap(phys_addr_t base, phys_addr_t size);
>
> void memblock_free(void *ptr, size_t size);
> void reset_all_zones_managed_pages(void);
> @@ -306,6 +310,11 @@ static inline bool memblock_is_kho_scratch(struct memblock_region *m)
> return m->flags & MEMBLOCK_KHO_SCRATCH;
> }
>
> +static inline bool memblock_is_llmap(struct memblock_region *m)
> +{
> + return m->flags & MEMBLOCK_LLMAP;
> +}
> +
> int memblock_search_pfn_nid(unsigned long pfn, unsigned long *start_pfn,
> unsigned long *end_pfn);
> void __next_mem_pfn_range(int *idx, int nid, unsigned long *out_start_pfn,
> diff --git a/mm/memblock.c b/mm/memblock.c
> index 9ce86349a29f..1591b50503ed 100644
> --- a/mm/memblock.c
> +++ b/mm/memblock.c
> @@ -1119,6 +1119,16 @@ int __init_memblock memblock_mark_mirror(phys_addr_t base, phys_addr_t size)
> */
> int __init_memblock memblock_mark_nomap(phys_addr_t base, phys_addr_t size)
> {
> + struct memblock_region *r;
> +
> + memblock_cap_size(base, &size);
> +
> + for_each_mem_region(r) {
> + if (memblock_is_llmap(r) &&
> + memblock_addrs_overlap(base, size, r->base, r->size))
> + return -EINVAL;
> + }
I'm not very fond of implicit skips here. memblock has no idea what's the
caller intention, maybe it actually wants to change the memory from nomap
to pte-mapped.
I'd rather warn in memblock_is_nomap() and memblock_is_llmap() if they both
are set and let the caller deal with making sure they are not.
> +
> return memblock_setclr_flag(&memblock.memory, base, size, 1, MEMBLOCK_NOMAP);
> }
>
> @@ -1204,6 +1214,45 @@ __init int memblock_clear_kho_scratch(phys_addr_t base, phys_addr_t size)
> MEMBLOCK_KHO_SCRATCH);
> }
>
> +/**
> + * memblock_mark_llmap - Mark a memory region with flag MEMBLOCK_LLMAP.
> + * @base: the base phys addr of the region
> + * @size: the size of the region
> + *
> + * If supported by the architecture, such region is mapped at the last-level in
> + * the kernel direct map.
> + *
> + * Return: 0 on success, -errno on failure.
> + */
> +int __init_memblock memblock_mark_llmap(phys_addr_t base, phys_addr_t size)
> +{
> + struct memblock_region *r;
> +
> + memblock_cap_size(base, &size);
> +
> + for_each_mem_region(r) {
> + if (memblock_is_nomap(r) &&
> + memblock_addrs_overlap(base, size, r->base, r->size))
> + return -EINVAL;
> + }
same here
> +
> + return memblock_setclr_flag(&memblock.memory, base, size, 1,
> + MEMBLOCK_LLMAP);
> +}
> +
> +/**
> + * memblock_clear_llmap - Clear flag MEMBLOCK_LLMAP for a specified region.
> + * @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_clear_llmap(phys_addr_t base, phys_addr_t size)
> +{
> + return memblock_setclr_flag(&memblock.memory, base, size, 0,
> + MEMBLOCK_LLMAP);
> +}
> +
> static bool should_skip_region(struct memblock_type *type,
> struct memblock_region *m,
> int nid, int flags)
> @@ -2886,6 +2935,7 @@ static const char * const flagname[] = {
> [ilog2(MEMBLOCK_RSRV_NOINIT)] = "RSV_NIT",
> [ilog2(MEMBLOCK_RSRV_KERN)] = "RSV_KERN",
> [ilog2(MEMBLOCK_KHO_SCRATCH)] = "KHO_SCRATCH",
> + [ilog2(MEMBLOCK_LLMAP)] = "LLMAP",
> };
>
> static int memblock_debug_show(struct seq_file *m, void *private)
> --
> 2.55.0.970.g62bdec98f9-goog
>
--
Sincerely yours,
Mike.
next prev parent reply other threads:[~2026-09-06 19:33 UTC|newest]
Thread overview: 57+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-02 10:47 [PATCH v9 00/10] arm64: Unmap FF-A lent memory from direct map Vincent Donnefort
2026-09-02 10:47 ` Vincent Donnefort via OP-TEE
2026-09-02 10:47 ` [PATCH v9 01/10] memblock: Introduce MEMBLOCK_LLMAP Vincent Donnefort
2026-09-02 10:47 ` Vincent Donnefort via OP-TEE
2026-09-06 19:33 ` Mike Rapoport via OP-TEE [this message]
2026-09-06 19:33 ` Mike Rapoport
2026-09-07 9:50 ` Vincent Donnefort via OP-TEE
2026-09-07 9:50 ` Vincent Donnefort
2026-09-08 7:40 ` Mike Rapoport
2026-09-08 7:40 ` Mike Rapoport via OP-TEE
2026-09-08 9:18 ` Thierry Reding
2026-09-08 9:18 ` Thierry Reding via OP-TEE
2026-09-08 10:17 ` Mike Rapoport via OP-TEE
2026-09-08 10:17 ` Mike Rapoport
2026-09-02 10:47 ` [PATCH v9 02/10] of: reserved_mem: Introduce "ll-map" property Vincent Donnefort
2026-09-02 10:47 ` Vincent Donnefort via OP-TEE
2026-09-02 11:02 ` sashiko-bot
2026-09-02 17:24 ` Rob Herring
2026-09-02 17:24 ` Rob Herring via OP-TEE
2026-09-03 10:03 ` Vincent Donnefort
2026-09-03 10:03 ` Vincent Donnefort via OP-TEE
2026-09-07 14:00 ` Thierry Reding
2026-09-07 14:00 ` Thierry Reding via OP-TEE
2026-09-07 17:03 ` Vincent Donnefort
2026-09-07 17:03 ` Vincent Donnefort via OP-TEE
2026-09-02 10:47 ` [PATCH v9 03/10] set_memory.h: Introduce can_set_direct_map_range() Vincent Donnefort
2026-09-02 10:47 ` Vincent Donnefort via OP-TEE
2026-09-06 19:39 ` Mike Rapoport via OP-TEE
2026-09-06 19:39 ` Mike Rapoport
2026-09-07 9:52 ` Vincent Donnefort
2026-09-07 9:52 ` Vincent Donnefort via OP-TEE
2026-09-02 10:47 ` [PATCH v9 04/10] set_memory.h: Introduce __set_direct_map*() Vincent Donnefort
2026-09-02 10:47 ` Vincent Donnefort via OP-TEE
2026-09-02 10:47 ` [PATCH v9 05/10] arm64: can_set_direct_map() if BBML3 Vincent Donnefort
2026-09-02 10:47 ` Vincent Donnefort via OP-TEE
2026-09-02 11:09 ` sashiko-bot
2026-09-02 10:47 ` [PATCH v9 06/10] arm64: Implement can_set_direct_map_range() Vincent Donnefort
2026-09-02 10:47 ` Vincent Donnefort via OP-TEE
2026-09-02 11:06 ` sashiko-bot
2026-09-02 10:47 ` [PATCH v9 07/10] arm64: Implement __set_direct_map*() Vincent Donnefort
2026-09-02 10:47 ` Vincent Donnefort via OP-TEE
2026-09-08 9:27 ` Thierry Reding
2026-09-08 9:27 ` Thierry Reding via OP-TEE
2026-09-02 10:47 ` [PATCH v9 08/10] arm64: Add support for MEMBLOCK_LLMAP Vincent Donnefort
2026-09-02 10:47 ` Vincent Donnefort via OP-TEE
2026-09-02 10:47 ` [PATCH v9 09/10] firmware: arm_ffa: Introduce ffa-lend-pool Vincent Donnefort
2026-09-02 10:47 ` Vincent Donnefort via OP-TEE
2026-09-02 11:06 ` sashiko-bot
2026-09-02 17:38 ` Rob Herring
2026-09-02 17:38 ` Rob Herring via OP-TEE
2026-09-03 10:10 ` Vincent Donnefort
2026-09-03 10:10 ` Vincent Donnefort via OP-TEE
2026-09-02 10:47 ` [PATCH v9 10/10] optee: Add support for arm,ffa-lend-pool Vincent Donnefort
2026-09-02 10:47 ` Vincent Donnefort via OP-TEE
2026-09-02 11:09 ` sashiko-bot
2026-09-02 13:27 ` [PATCH v9 00/10] arm64: Unmap FF-A lent memory from direct map Vincent Donnefort
2026-09-02 13:27 ` Vincent Donnefort via OP-TEE
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=ap2_926WXr7uAYVX@kernel.org \
--to=op-tee@lists.trustedfirmware.org \
--cc=akpm@linux-foundation.org \
--cc=ardb@kernel.org \
--cc=catalin.marinas@arm.com \
--cc=danielmentz@google.com \
--cc=david@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=jenswi@kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mark.rutland@arm.com \
--cc=robh@kernel.org \
--cc=rppt@kernel.org \
--cc=sudeep.holla@kernel.org \
--cc=sumit.garg@kernel.org \
--cc=thierry.reding@kernel.org \
--cc=vdonnefort@google.com \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.