* [PATCH v2] arm64: pageattr: Explicitly bail out when changing permissions for vmalloc_huge mappings
@ 2025-04-03 5:28 Dev Jain
2025-04-03 9:31 ` Anshuman Khandual
` (4 more replies)
0 siblings, 5 replies; 7+ messages in thread
From: Dev Jain @ 2025-04-03 5:28 UTC (permalink / raw)
To: catalin.marinas, will
Cc: gshan, rppt, steven.price, suzuki.poulose, tianyaxiong, ardb,
david, ryan.roberts, urezki, linux-arm-kernel, linux-kernel,
Dev Jain
arm64 uses apply_to_page_range to change permissions for kernel vmalloc mappings,
which does not support changing permissions for block mappings. This function
will change permissions until it encounters a block mapping, and will bail
out with a warning. Since there are no reports of this triggering, it
implies that there are currently no cases of code doing a vmalloc_huge()
followed by partial permission change. But this is a footgun waiting to
go off, so let's detect it early and avoid the possibility of permissions
in an intermediate state. So, explicitly disallow changing permissions
for VM_ALLOW_HUGE_VMAP mappings.
Reviewed-by: Ryan Roberts <ryan.roberts@arm.com>
Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
Signed-off-by: Dev Jain <dev.jain@arm.com>
---
v1->v2:
- Improve changelog, keep mention of page mappings in comment
arch/arm64/mm/pageattr.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/arch/arm64/mm/pageattr.c b/arch/arm64/mm/pageattr.c
index 39fd1f7ff02a..04d4a8f676db 100644
--- a/arch/arm64/mm/pageattr.c
+++ b/arch/arm64/mm/pageattr.c
@@ -96,8 +96,8 @@ static int change_memory_common(unsigned long addr, int numpages,
* we are operating on does not result in such splitting.
*
* Let's restrict ourselves to mappings created by vmalloc (or vmap).
- * Those are guaranteed to consist entirely of page mappings, and
- * splitting is never needed.
+ * Disallow VM_ALLOW_HUGE_VMAP mappings to guarantee that only page
+ * mappings are updated and splitting is never needed.
*
* So check whether the [addr, addr + size) interval is entirely
* covered by precisely one VM area that has the VM_ALLOC flag set.
@@ -105,7 +105,7 @@ static int change_memory_common(unsigned long addr, int numpages,
area = find_vm_area((void *)addr);
if (!area ||
end > (unsigned long)kasan_reset_tag(area->addr) + area->size ||
- !(area->flags & VM_ALLOC))
+ ((area->flags & (VM_ALLOC | VM_ALLOW_HUGE_VMAP)) != VM_ALLOC))
return -EINVAL;
if (!numpages)
--
2.30.2
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v2] arm64: pageattr: Explicitly bail out when changing permissions for vmalloc_huge mappings
2025-04-03 5:28 [PATCH v2] arm64: pageattr: Explicitly bail out when changing permissions for vmalloc_huge mappings Dev Jain
@ 2025-04-03 9:31 ` Anshuman Khandual
2025-04-04 9:43 ` Gavin Shan
` (3 subsequent siblings)
4 siblings, 0 replies; 7+ messages in thread
From: Anshuman Khandual @ 2025-04-03 9:31 UTC (permalink / raw)
To: Dev Jain, catalin.marinas, will
Cc: gshan, rppt, steven.price, suzuki.poulose, tianyaxiong, ardb,
david, ryan.roberts, urezki, linux-arm-kernel, linux-kernel
On 4/3/25 10:58, Dev Jain wrote:
> arm64 uses apply_to_page_range to change permissions for kernel vmalloc mappings,
> which does not support changing permissions for block mappings. This function
> will change permissions until it encounters a block mapping, and will bail
> out with a warning. Since there are no reports of this triggering, it
> implies that there are currently no cases of code doing a vmalloc_huge()
> followed by partial permission change. But this is a footgun waiting to
> go off, so let's detect it early and avoid the possibility of permissions
> in an intermediate state. So, explicitly disallow changing permissions
> for VM_ALLOW_HUGE_VMAP mappings.
>
> Reviewed-by: Ryan Roberts <ryan.roberts@arm.com>
> Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
> Signed-off-by: Dev Jain <dev.jain@arm.com>
> ---
> v1->v2:
> - Improve changelog, keep mention of page mappings in comment
>
> arch/arm64/mm/pageattr.c | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/arch/arm64/mm/pageattr.c b/arch/arm64/mm/pageattr.c
> index 39fd1f7ff02a..04d4a8f676db 100644
> --- a/arch/arm64/mm/pageattr.c
> +++ b/arch/arm64/mm/pageattr.c
> @@ -96,8 +96,8 @@ static int change_memory_common(unsigned long addr, int numpages,
> * we are operating on does not result in such splitting.
> *
> * Let's restrict ourselves to mappings created by vmalloc (or vmap).
> - * Those are guaranteed to consist entirely of page mappings, and
> - * splitting is never needed.
> + * Disallow VM_ALLOW_HUGE_VMAP mappings to guarantee that only page
> + * mappings are updated and splitting is never needed.
> *
> * So check whether the [addr, addr + size) interval is entirely
> * covered by precisely one VM area that has the VM_ALLOC flag set.
> @@ -105,7 +105,7 @@ static int change_memory_common(unsigned long addr, int numpages,
> area = find_vm_area((void *)addr);
> if (!area ||
> end > (unsigned long)kasan_reset_tag(area->addr) + area->size ||
> - !(area->flags & VM_ALLOC))
> + ((area->flags & (VM_ALLOC | VM_ALLOW_HUGE_VMAP)) != VM_ALLOC))
> return -EINVAL;
>
> if (!numpages)
LGTM
Reviewed-by: Anshuman Khandual <anshuman.khandual@arm.com>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2] arm64: pageattr: Explicitly bail out when changing permissions for vmalloc_huge mappings
2025-04-03 5:28 [PATCH v2] arm64: pageattr: Explicitly bail out when changing permissions for vmalloc_huge mappings Dev Jain
2025-04-03 9:31 ` Anshuman Khandual
@ 2025-04-04 9:43 ` Gavin Shan
2025-04-04 12:57 ` David Hildenbrand
` (2 subsequent siblings)
4 siblings, 0 replies; 7+ messages in thread
From: Gavin Shan @ 2025-04-04 9:43 UTC (permalink / raw)
To: Dev Jain, catalin.marinas, will
Cc: rppt, steven.price, suzuki.poulose, tianyaxiong, ardb, david,
ryan.roberts, urezki, linux-arm-kernel, linux-kernel
On 4/3/25 3:28 PM, Dev Jain wrote:
> arm64 uses apply_to_page_range to change permissions for kernel vmalloc mappings,
> which does not support changing permissions for block mappings. This function
> will change permissions until it encounters a block mapping, and will bail
> out with a warning. Since there are no reports of this triggering, it
> implies that there are currently no cases of code doing a vmalloc_huge()
> followed by partial permission change. But this is a footgun waiting to
> go off, so let's detect it early and avoid the possibility of permissions
> in an intermediate state. So, explicitly disallow changing permissions
> for VM_ALLOW_HUGE_VMAP mappings.
>
> Reviewed-by: Ryan Roberts <ryan.roberts@arm.com>
> Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
> Signed-off-by: Dev Jain <dev.jain@arm.com>
> ---
> v1->v2:
> - Improve changelog, keep mention of page mappings in comment
>
> arch/arm64/mm/pageattr.c | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
>
Reviewed-by: Gavin Shan <gshan@redhat.com>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2] arm64: pageattr: Explicitly bail out when changing permissions for vmalloc_huge mappings
2025-04-03 5:28 [PATCH v2] arm64: pageattr: Explicitly bail out when changing permissions for vmalloc_huge mappings Dev Jain
2025-04-03 9:31 ` Anshuman Khandual
2025-04-04 9:43 ` Gavin Shan
@ 2025-04-04 12:57 ` David Hildenbrand
2025-04-14 13:48 ` Ryan Roberts
2025-04-27 14:35 ` Dev Jain
2025-04-29 20:27 ` Will Deacon
4 siblings, 1 reply; 7+ messages in thread
From: David Hildenbrand @ 2025-04-04 12:57 UTC (permalink / raw)
To: Dev Jain, catalin.marinas, will
Cc: gshan, rppt, steven.price, suzuki.poulose, tianyaxiong, ardb,
ryan.roberts, urezki, linux-arm-kernel, linux-kernel
On 03.04.25 07:28, Dev Jain wrote:
> arm64 uses apply_to_page_range to change permissions for kernel vmalloc mappings,
> which does not support changing permissions for block mappings. This function
> will change permissions until it encounters a block mapping, and will bail
> out with a warning. Since there are no reports of this triggering, it
> implies that there are currently no cases of code doing a vmalloc_huge()
> followed by partial permission change. But this is a footgun waiting to
> go off, so let's detect it early and avoid the possibility of permissions
> in an intermediate state. So, explicitly disallow changing permissions
> for VM_ALLOW_HUGE_VMAP mappings.
>
> Reviewed-by: Ryan Roberts <ryan.roberts@arm.com>
> Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
> Signed-off-by: Dev Jain <dev.jain@arm.com>
> ---
> v1->v2:
> - Improve changelog, keep mention of page mappings in comment
>
> arch/arm64/mm/pageattr.c | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/arch/arm64/mm/pageattr.c b/arch/arm64/mm/pageattr.c
> index 39fd1f7ff02a..04d4a8f676db 100644
> --- a/arch/arm64/mm/pageattr.c
> +++ b/arch/arm64/mm/pageattr.c
> @@ -96,8 +96,8 @@ static int change_memory_common(unsigned long addr, int numpages,
> * we are operating on does not result in such splitting.
> *
> * Let's restrict ourselves to mappings created by vmalloc (or vmap).
> - * Those are guaranteed to consist entirely of page mappings, and
> - * splitting is never needed.
> + * Disallow VM_ALLOW_HUGE_VMAP mappings to guarantee that only page
> + * mappings are updated and splitting is never needed.
> *
> * So check whether the [addr, addr + size) interval is entirely
> * covered by precisely one VM area that has the VM_ALLOC flag set.
> @@ -105,7 +105,7 @@ static int change_memory_common(unsigned long addr, int numpages,
> area = find_vm_area((void *)addr);
> if (!area ||
> end > (unsigned long)kasan_reset_tag(area->addr) + area->size ||
> - !(area->flags & VM_ALLOC))
> + ((area->flags & (VM_ALLOC | VM_ALLOW_HUGE_VMAP)) != VM_ALLOC))
> return -EINVAL;
>
> if (!numpages)
Makes sense to me. Whenever required, we can improve the checks (or even
try supporting splitting).
Acked-by: David Hildenbrand <david@redhat.com>
--
Cheers,
David / dhildenb
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2] arm64: pageattr: Explicitly bail out when changing permissions for vmalloc_huge mappings
2025-04-04 12:57 ` David Hildenbrand
@ 2025-04-14 13:48 ` Ryan Roberts
0 siblings, 0 replies; 7+ messages in thread
From: Ryan Roberts @ 2025-04-14 13:48 UTC (permalink / raw)
To: David Hildenbrand, Dev Jain, catalin.marinas, will
Cc: gshan, rppt, steven.price, suzuki.poulose, tianyaxiong, ardb,
urezki, linux-arm-kernel, linux-kernel
On 04/04/2025 13:57, David Hildenbrand wrote:
> On 03.04.25 07:28, Dev Jain wrote:
>> arm64 uses apply_to_page_range to change permissions for kernel vmalloc mappings,
>> which does not support changing permissions for block mappings. This function
>> will change permissions until it encounters a block mapping, and will bail
>> out with a warning. Since there are no reports of this triggering, it
>> implies that there are currently no cases of code doing a vmalloc_huge()
>> followed by partial permission change. But this is a footgun waiting to
>> go off, so let's detect it early and avoid the possibility of permissions
>> in an intermediate state. So, explicitly disallow changing permissions
>> for VM_ALLOW_HUGE_VMAP mappings.
>>
>> Reviewed-by: Ryan Roberts <ryan.roberts@arm.com>
>> Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
>> Signed-off-by: Dev Jain <dev.jain@arm.com>
>> ---
>> v1->v2:
>> - Improve changelog, keep mention of page mappings in comment
>>
>> arch/arm64/mm/pageattr.c | 6 +++---
>> 1 file changed, 3 insertions(+), 3 deletions(-)
>>
>> diff --git a/arch/arm64/mm/pageattr.c b/arch/arm64/mm/pageattr.c
>> index 39fd1f7ff02a..04d4a8f676db 100644
>> --- a/arch/arm64/mm/pageattr.c
>> +++ b/arch/arm64/mm/pageattr.c
>> @@ -96,8 +96,8 @@ static int change_memory_common(unsigned long addr, int
>> numpages,
>> * we are operating on does not result in such splitting.
>> *
>> * Let's restrict ourselves to mappings created by vmalloc (or vmap).
>> - * Those are guaranteed to consist entirely of page mappings, and
>> - * splitting is never needed.
>> + * Disallow VM_ALLOW_HUGE_VMAP mappings to guarantee that only page
>> + * mappings are updated and splitting is never needed.
>> *
>> * So check whether the [addr, addr + size) interval is entirely
>> * covered by precisely one VM area that has the VM_ALLOC flag set.
>> @@ -105,7 +105,7 @@ static int change_memory_common(unsigned long addr, int
>> numpages,
>> area = find_vm_area((void *)addr);
>> if (!area ||
>> end > (unsigned long)kasan_reset_tag(area->addr) + area->size ||
>> - !(area->flags & VM_ALLOC))
>> + ((area->flags & (VM_ALLOC | VM_ALLOW_HUGE_VMAP)) != VM_ALLOC))
>> return -EINVAL;
>> if (!numpages)
>
> Makes sense to me. Whenever required, we can improve the checks (or even try
> supporting splitting).
Yes that's the plan; I'd like to get to the point where we can do huge vmalloc
mappings by default on systems that support BBML2, then split mappings when needed.
>
> Acked-by: David Hildenbrand <david@redhat.com>
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2] arm64: pageattr: Explicitly bail out when changing permissions for vmalloc_huge mappings
2025-04-03 5:28 [PATCH v2] arm64: pageattr: Explicitly bail out when changing permissions for vmalloc_huge mappings Dev Jain
` (2 preceding siblings ...)
2025-04-04 12:57 ` David Hildenbrand
@ 2025-04-27 14:35 ` Dev Jain
2025-04-29 20:27 ` Will Deacon
4 siblings, 0 replies; 7+ messages in thread
From: Dev Jain @ 2025-04-27 14:35 UTC (permalink / raw)
To: catalin.marinas, will
Cc: gshan, rppt, steven.price, suzuki.poulose, tianyaxiong, ardb,
david, ryan.roberts, urezki, linux-arm-kernel, linux-kernel
Gentle Ping
On 03/04/25 10:58 am, Dev Jain wrote:
> arm64 uses apply_to_page_range to change permissions for kernel vmalloc mappings,
> which does not support changing permissions for block mappings. This function
> will change permissions until it encounters a block mapping, and will bail
> out with a warning. Since there are no reports of this triggering, it
> implies that there are currently no cases of code doing a vmalloc_huge()
> followed by partial permission change. But this is a footgun waiting to
> go off, so let's detect it early and avoid the possibility of permissions
> in an intermediate state. So, explicitly disallow changing permissions
> for VM_ALLOW_HUGE_VMAP mappings.
>
> Reviewed-by: Ryan Roberts <ryan.roberts@arm.com>
> Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
> Signed-off-by: Dev Jain <dev.jain@arm.com>
> ---
> v1->v2:
> - Improve changelog, keep mention of page mappings in comment
>
> arch/arm64/mm/pageattr.c | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/arch/arm64/mm/pageattr.c b/arch/arm64/mm/pageattr.c
> index 39fd1f7ff02a..04d4a8f676db 100644
> --- a/arch/arm64/mm/pageattr.c
> +++ b/arch/arm64/mm/pageattr.c
> @@ -96,8 +96,8 @@ static int change_memory_common(unsigned long addr, int numpages,
> * we are operating on does not result in such splitting.
> *
> * Let's restrict ourselves to mappings created by vmalloc (or vmap).
> - * Those are guaranteed to consist entirely of page mappings, and
> - * splitting is never needed.
> + * Disallow VM_ALLOW_HUGE_VMAP mappings to guarantee that only page
> + * mappings are updated and splitting is never needed.
> *
> * So check whether the [addr, addr + size) interval is entirely
> * covered by precisely one VM area that has the VM_ALLOC flag set.
> @@ -105,7 +105,7 @@ static int change_memory_common(unsigned long addr, int numpages,
> area = find_vm_area((void *)addr);
> if (!area ||
> end > (unsigned long)kasan_reset_tag(area->addr) + area->size ||
> - !(area->flags & VM_ALLOC))
> + ((area->flags & (VM_ALLOC | VM_ALLOW_HUGE_VMAP)) != VM_ALLOC))
> return -EINVAL;
>
> if (!numpages)
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2] arm64: pageattr: Explicitly bail out when changing permissions for vmalloc_huge mappings
2025-04-03 5:28 [PATCH v2] arm64: pageattr: Explicitly bail out when changing permissions for vmalloc_huge mappings Dev Jain
` (3 preceding siblings ...)
2025-04-27 14:35 ` Dev Jain
@ 2025-04-29 20:27 ` Will Deacon
4 siblings, 0 replies; 7+ messages in thread
From: Will Deacon @ 2025-04-29 20:27 UTC (permalink / raw)
To: catalin.marinas, Dev Jain
Cc: kernel-team, Will Deacon, gshan, rppt, steven.price,
suzuki.poulose, tianyaxiong, ardb, david, ryan.roberts, urezki,
linux-arm-kernel, linux-kernel
On Thu, 03 Apr 2025 10:58:44 +0530, Dev Jain wrote:
> arm64 uses apply_to_page_range to change permissions for kernel vmalloc mappings,
> which does not support changing permissions for block mappings. This function
> will change permissions until it encounters a block mapping, and will bail
> out with a warning. Since there are no reports of this triggering, it
> implies that there are currently no cases of code doing a vmalloc_huge()
> followed by partial permission change. But this is a footgun waiting to
> go off, so let's detect it early and avoid the possibility of permissions
> in an intermediate state. So, explicitly disallow changing permissions
> for VM_ALLOW_HUGE_VMAP mappings.
>
> [...]
Applied to arm64 (for-next/mm), thanks!
[1/1] arm64: pageattr: Explicitly bail out when changing permissions for vmalloc_huge mappings
https://git.kernel.org/arm64/c/fcf8dda8cc48
Cheers,
--
Will
https://fixes.arm64.dev
https://next.arm64.dev
https://will.arm64.dev
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2025-04-29 20:36 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-04-03 5:28 [PATCH v2] arm64: pageattr: Explicitly bail out when changing permissions for vmalloc_huge mappings Dev Jain
2025-04-03 9:31 ` Anshuman Khandual
2025-04-04 9:43 ` Gavin Shan
2025-04-04 12:57 ` David Hildenbrand
2025-04-14 13:48 ` Ryan Roberts
2025-04-27 14:35 ` Dev Jain
2025-04-29 20:27 ` Will Deacon
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).