* [PATCH] arm64: hugetlb: fix BBM for mprotect() on contiguous PTEs
@ 2026-09-01 13:18 Karl Mehltretter
2026-09-02 4:38 ` Anshuman Khandual
2026-09-02 14:46 ` Dev Jain
0 siblings, 2 replies; 7+ messages in thread
From: Karl Mehltretter @ 2026-09-01 13:18 UTC (permalink / raw)
To: Catalin Marinas, Will Deacon, linux-arm-kernel
Cc: Karl Mehltretter, Anshuman Khandual, Ryan Roberts, Mark Rutland,
Andrew Morton, Muchun Song, Oscar Salvador, David Hildenbrand,
linux-mm, linux-kernel
huge_ptep_modify_prot_start() clears a hugetlb entry before changing its
permissions. For contiguous PTE mappings, break-before-make (BBM)
requires a TLB invalidation after clearing the set and before making any
entry valid again.
Commit fb396bb459c1 ("arm64/hugetlb: Drop TLB flush from
get_clear_flush()") removed this invalidation, relying on the deferred
flush from the core code. Commit 410982303772 ("arm64: hugetlb: Restore
TLB invalidation for BBM on contiguous ptes") restored it for
huge_ptep_set_{access_flags,wrprotect}(), since a deferred flush is too
late for the break step. The modify-prot path has the same problem.
Use huge_ptep_clear_flush() for contiguous entries so that the TLB is
invalidated during the break step. Leave huge_ptep_get_and_clear()
unchanged because it is also used by teardown paths, where the deferred
flush is sufficient.
Fixes: fb396bb459c1 ("arm64/hugetlb: Drop TLB flush from get_clear_flush()")
Assisted-by: LLM
Signed-off-by: Karl Mehltretter <kmehltretter@gmail.com>
---
An instrumented QEMU detected the missing break-step TLBI on an unpatched
kernel and none with this change. A fork() control exercising
huge_ptep_set_wrprotect() remained clean. No user-visible failure was
reproduced.
The QEMU checker was exercised with 4K and 64K base-page kernels. The
patched kernel passed the LTP hugetlb tests with both -cpu max and -cpu
cortex-a72 (16 TPASS and no failures).
Testing on Neoverse N1 hardware would be welcome, as it can use the
contiguous hint and can be configured to report TLB conflicts.
arch/arm64/mm/hugetlbpage.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/arch/arm64/mm/hugetlbpage.c b/arch/arm64/mm/hugetlbpage.c
index 8e799c1fe0aa..bb53a04b73b2 100644
--- a/arch/arm64/mm/hugetlbpage.c
+++ b/arch/arm64/mm/hugetlbpage.c
@@ -517,6 +517,11 @@ bool __init arch_hugetlb_valid_size(unsigned long size)
pte_t huge_ptep_modify_prot_start(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep)
{
unsigned long psize = huge_page_size(hstate_vma(vma));
+ pte_t pte = __ptep_get(ptep);
+
+ /* The break step for contiguous PTEs must include the TLB flush. */
+ if (pte_cont(pte))
+ return huge_ptep_clear_flush(vma, addr, ptep);
if (alternative_has_cap_unlikely(ARM64_WORKAROUND_2645198)) {
/*
@@ -524,7 +529,7 @@ pte_t huge_ptep_modify_prot_start(struct vm_area_struct *vma, unsigned long addr
* when the permission changes from executable to non-executable
* in cases where cpu is affected with errata #2645198.
*/
- if (pte_user_exec(__ptep_get(ptep)))
+ if (pte_user_exec(pte))
return huge_ptep_clear_flush(vma, addr, ptep);
}
return huge_ptep_get_and_clear(vma->vm_mm, addr, ptep, psize);
base-commit: 786262be6048deab760f68c8acc2c85607165894
--
2.53.0
^ permalink raw reply related [flat|nested] 7+ messages in thread* Re: [PATCH] arm64: hugetlb: fix BBM for mprotect() on contiguous PTEs 2026-09-01 13:18 [PATCH] arm64: hugetlb: fix BBM for mprotect() on contiguous PTEs Karl Mehltretter @ 2026-09-02 4:38 ` Anshuman Khandual 2026-09-02 16:58 ` Karl Mehltretter 2026-09-02 14:46 ` Dev Jain 1 sibling, 1 reply; 7+ messages in thread From: Anshuman Khandual @ 2026-09-02 4:38 UTC (permalink / raw) To: Karl Mehltretter Cc: Catalin Marinas, Will Deacon, linux-arm-kernel, Ryan Roberts, Mark Rutland, Andrew Morton, Muchun Song, Oscar Salvador, David Hildenbrand, linux-mm, linux-kernel On Tue, Sep 01, 2026 at 03:18:23PM +0200, Karl Mehltretter wrote: > huge_ptep_modify_prot_start() clears a hugetlb entry before changing its > permissions. For contiguous PTE mappings, break-before-make (BBM) > requires a TLB invalidation after clearing the set and before making any > entry valid again. Agreed. > > Commit fb396bb459c1 ("arm64/hugetlb: Drop TLB flush from > get_clear_flush()") removed this invalidation, relying on the deferred > flush from the core code. Commit 410982303772 ("arm64: hugetlb: Restore > TLB invalidation for BBM on contiguous ptes") restored it for > huge_ptep_set_{access_flags,wrprotect}(), since a deferred flush is too > late for the break step. The modify-prot path has the same problem. The commit 410982303772 ("arm64: hugetlb: Restore TLB invalidation for BBM on contiguous ptes") should also have fixed huge_ptep_modify_prot_start() while at it ? > > Use huge_ptep_clear_flush() for contiguous entries so that the TLB is > invalidated during the break step. Leave huge_ptep_get_and_clear() > unchanged because it is also used by teardown paths, where the deferred > flush is sufficient. Makes sense. > > Fixes: fb396bb459c1 ("arm64/hugetlb: Drop TLB flush from get_clear_flush()") Probably OK as the earlier commit 410982303772 also blames the same. > Assisted-by: LLM So you did not actually see this problem on a system ? > Signed-off-by: Karl Mehltretter <kmehltretter@gmail.com> > --- > An instrumented QEMU detected the missing break-step TLBI on an unpatched > kernel and none with this change. A fork() control exercising > huge_ptep_set_wrprotect() remained clean. No user-visible failure was > reproduced. No user-visiable failure was reported even without this change ? Missing TLBI as seen in QEMU is the only clue here ? > > The QEMU checker was exercised with 4K and 64K base-page kernels. The > patched kernel passed the LTP hugetlb tests with both -cpu max and -cpu > cortex-a72 (16 TPASS and no failures). > > Testing on Neoverse N1 hardware would be welcome, as it can use the > contiguous hint and can be configured to report TLB conflicts. But you have not seen any real TLB conflicts even on custom QEMU ? > > arch/arm64/mm/hugetlbpage.c | 7 ++++++- > 1 file changed, 6 insertions(+), 1 deletion(-) > > diff --git a/arch/arm64/mm/hugetlbpage.c b/arch/arm64/mm/hugetlbpage.c > index 8e799c1fe0aa..bb53a04b73b2 100644 > --- a/arch/arm64/mm/hugetlbpage.c > +++ b/arch/arm64/mm/hugetlbpage.c > @@ -517,6 +517,11 @@ bool __init arch_hugetlb_valid_size(unsigned long size) > pte_t huge_ptep_modify_prot_start(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep) > { > unsigned long psize = huge_page_size(hstate_vma(vma)); > + pte_t pte = __ptep_get(ptep); > + > + /* The break step for contiguous PTEs must include the TLB flush. */ Probably helpful to mention here that subsequent huge_ptep_get_and_clearI() in the function depends on deferred TLB flush mechanism which would not be accurate for contig HugeTLB pages. > + if (pte_cont(pte)) > + return huge_ptep_clear_flush(vma, addr, ptep); > > if (alternative_has_cap_unlikely(ARM64_WORKAROUND_2645198)) { > /* > @@ -524,7 +529,7 @@ pte_t huge_ptep_modify_prot_start(struct vm_area_struct *vma, unsigned long addr > * when the permission changes from executable to non-executable > * in cases where cpu is affected with errata #2645198. > */ > - if (pte_user_exec(__ptep_get(ptep))) > + if (pte_user_exec(pte)) > return huge_ptep_clear_flush(vma, addr, ptep); > } > return huge_ptep_get_and_clear(vma->vm_mm, addr, ptep, psize); > > base-commit: 786262be6048deab760f68c8acc2c85607165894 > -- > 2.53.0 Overall LGTM but will need some more testing. ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] arm64: hugetlb: fix BBM for mprotect() on contiguous PTEs 2026-09-02 4:38 ` Anshuman Khandual @ 2026-09-02 16:58 ` Karl Mehltretter 0 siblings, 0 replies; 7+ messages in thread From: Karl Mehltretter @ 2026-09-02 16:58 UTC (permalink / raw) To: Anshuman Khandual Cc: Catalin Marinas, Will Deacon, linux-arm-kernel, Ryan Roberts, Mark Rutland, Andrew Morton, Muchun Song, Oscar Salvador, David Hildenbrand, linux-mm, linux-kernel On Wed, Sep 02, 2026 at 10:08:58AM +0100, Anshuman Khandual wrote: > No user-visiable failure was reported even without this change ? > Missing TLBI as seen in QEMU is the only clue here ?A This came out of an experiment to add warnings for architectural details that QEMU does not normally model. The checker tracks guest page-table writes and TLBIs using a shadow TLB. It reported 3072 contiguous PTE transitions without an intervening TLBI on the unpatched kernel, none with this change, and none for the already-flushed write-protect control. Together with the code history, that was the basis for the patch. As noted in the testing section, no user-visible failure was reproduced. I also tested an unpatched kernel on a Raspberry Pi 400. The Cortex-A72's L1 data-TLB refill ratio was approximately 1:16 for the 64K hugetlb mapping versus a forced-4K control, indicating that it amalgamated the 16 contiguous PTEs. A contended test still completed 85,396 full-range permission changes and about 2.8 billion reads without a fault or data mismatch. > But you have not seen any real TLB conflicts even on custom QEMU ? No. QEMU does not model the stage-1 Contiguous hint as a combined TLB entry. The added checker only logged the page-table/TLBI sequence, it did not change translation behaviour or inject TLB conflicts. Thanks, Karl ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] arm64: hugetlb: fix BBM for mprotect() on contiguous PTEs 2026-09-01 13:18 [PATCH] arm64: hugetlb: fix BBM for mprotect() on contiguous PTEs Karl Mehltretter 2026-09-02 4:38 ` Anshuman Khandual @ 2026-09-02 14:46 ` Dev Jain 2026-09-02 16:16 ` Ryan Roberts ` (2 more replies) 1 sibling, 3 replies; 7+ messages in thread From: Dev Jain @ 2026-09-02 14:46 UTC (permalink / raw) To: Karl Mehltretter, Catalin Marinas, Will Deacon, linux-arm-kernel Cc: Anshuman Khandual, Ryan Roberts, Mark Rutland, Andrew Morton, Muchun Song, Oscar Salvador, David Hildenbrand, linux-mm, linux-kernel On 01/09/26 6:48 pm, Karl Mehltretter wrote: > huge_ptep_modify_prot_start() clears a hugetlb entry before changing its > permissions. For contiguous PTE mappings, break-before-make (BBM) > requires a TLB invalidation after clearing the set and before making any > entry valid again. > > Commit fb396bb459c1 ("arm64/hugetlb: Drop TLB flush from > get_clear_flush()") removed this invalidation, relying on the deferred > flush from the core code. Commit 410982303772 ("arm64: hugetlb: Restore > TLB invalidation for BBM on contiguous ptes") restored it for > huge_ptep_set_{access_flags,wrprotect}(), since a deferred flush is too > late for the break step. The modify-prot path has the same problem. > > Use huge_ptep_clear_flush() for contiguous entries so that the TLB is > invalidated during the break step. Leave huge_ptep_get_and_clear() > unchanged because it is also used by teardown paths, where the deferred > flush is sufficient. > > Fixes: fb396bb459c1 ("arm64/hugetlb: Drop TLB flush from get_clear_flush()") > Assisted-by: LLM > Signed-off-by: Karl Mehltretter <kmehltretter@gmail.com> > --- The transition happening here is: old_prot+cont -> zero -> new_prot+cont ... (i) and then TLB flush. Arm Arm rule R_JQQTC says: "For a TLB lookup in a contiguous region mapped by translation table entries that have consistent values for the Contiguous bit, but have the OA, attributes, or permissions misprogrammed, that TLB lookup is permitted to produce an OA, access permissions, and memory attributes that are consistent with any one of the programmed translation table values." This implies that a live update like old_prot+cont -> new_prot+cont then TLB flush ... (ii) is safe. Which should also imply that the transition (i) is safe, since the configurations the PE can observe for (ii) is the same for (i), except that in (ii) the PE can fault too, which is fine. Upon discussing with Ryan I got to know, he was implementing the contpte stuff for non-hugetlb user mappings and that basically drove a clarification on the semantics of contiguous bit and this rule was added. If you see currently for non-hugetlb mprotect() we do not flush during contpte teardown. So if the above reasoning makes sense, I can infact audit and remove the flushes in the hugetlb helpers. > An instrumented QEMU detected the missing break-step TLBI on an unpatched > kernel and none with this change. A fork() control exercising > huge_ptep_set_wrprotect() remained clean. No user-visible failure was > reproduced. > > The QEMU checker was exercised with 4K and 64K base-page kernels. The > patched kernel passed the LTP hugetlb tests with both -cpu max and -cpu > cortex-a72 (16 TPASS and no failures). > > Testing on Neoverse N1 hardware would be welcome, as it can use the > contiguous hint and can be configured to report TLB conflicts. > > arch/arm64/mm/hugetlbpage.c | 7 ++++++- > 1 file changed, 6 insertions(+), 1 deletion(-) > > diff --git a/arch/arm64/mm/hugetlbpage.c b/arch/arm64/mm/hugetlbpage.c > index 8e799c1fe0aa..bb53a04b73b2 100644 > --- a/arch/arm64/mm/hugetlbpage.c > +++ b/arch/arm64/mm/hugetlbpage.c > @@ -517,6 +517,11 @@ bool __init arch_hugetlb_valid_size(unsigned long size) > pte_t huge_ptep_modify_prot_start(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep) > { > unsigned long psize = huge_page_size(hstate_vma(vma)); > + pte_t pte = __ptep_get(ptep); > + > + /* The break step for contiguous PTEs must include the TLB flush. */ > + if (pte_cont(pte)) > + return huge_ptep_clear_flush(vma, addr, ptep); > > if (alternative_has_cap_unlikely(ARM64_WORKAROUND_2645198)) { > /* > @@ -524,7 +529,7 @@ pte_t huge_ptep_modify_prot_start(struct vm_area_struct *vma, unsigned long addr > * when the permission changes from executable to non-executable > * in cases where cpu is affected with errata #2645198. > */ > - if (pte_user_exec(__ptep_get(ptep))) > + if (pte_user_exec(pte)) > return huge_ptep_clear_flush(vma, addr, ptep); > } > return huge_ptep_get_and_clear(vma->vm_mm, addr, ptep, psize); > > base-commit: 786262be6048deab760f68c8acc2c85607165894 ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] arm64: hugetlb: fix BBM for mprotect() on contiguous PTEs 2026-09-02 14:46 ` Dev Jain @ 2026-09-02 16:16 ` Ryan Roberts 2026-09-02 17:06 ` Karl Mehltretter 2026-09-03 10:45 ` Will Deacon 2 siblings, 0 replies; 7+ messages in thread From: Ryan Roberts @ 2026-09-02 16:16 UTC (permalink / raw) To: Dev Jain, Karl Mehltretter, Catalin Marinas, Will Deacon, linux-arm-kernel Cc: Anshuman Khandual, Mark Rutland, Andrew Morton, Muchun Song, Oscar Salvador, David Hildenbrand, linux-mm, linux-kernel On 02/09/2026 15:46, Dev Jain wrote: > > > On 01/09/26 6:48 pm, Karl Mehltretter wrote: >> huge_ptep_modify_prot_start() clears a hugetlb entry before changing its >> permissions. For contiguous PTE mappings, break-before-make (BBM) >> requires a TLB invalidation after clearing the set and before making any >> entry valid again. >> >> Commit fb396bb459c1 ("arm64/hugetlb: Drop TLB flush from >> get_clear_flush()") removed this invalidation, relying on the deferred >> flush from the core code. Commit 410982303772 ("arm64: hugetlb: Restore >> TLB invalidation for BBM on contiguous ptes") restored it for >> huge_ptep_set_{access_flags,wrprotect}(), since a deferred flush is too >> late for the break step. The modify-prot path has the same problem. >> >> Use huge_ptep_clear_flush() for contiguous entries so that the TLB is >> invalidated during the break step. Leave huge_ptep_get_and_clear() >> unchanged because it is also used by teardown paths, where the deferred >> flush is sufficient. >> >> Fixes: fb396bb459c1 ("arm64/hugetlb: Drop TLB flush from get_clear_flush()") >> Assisted-by: LLM >> Signed-off-by: Karl Mehltretter <kmehltretter@gmail.com> >> --- Is there a user-visible bug here? Or is this just AI-assisted hypothesising? > > The transition happening here is: > > old_prot+cont -> zero -> new_prot+cont ... (i) > and then TLB flush. > > Arm Arm rule R_JQQTC says: > "For a TLB lookup in a contiguous region mapped by translation table entries > that have consistent values for the Contiguous bit, but have the OA, attributes, > or permissions misprogrammed, that TLB lookup is permitted to produce an OA, > access permissions, and memory attributes that are consistent with any one > of the programmed translation table values." > > This implies that a live update like > old_prot+cont -> new_prot+cont then TLB flush ... (ii) > > is safe. Which should also imply that the transition (i) is safe, > since the configurations the PE can observe for (ii) is the same > for (i), except that in (ii) the PE can fault too, which is fine. > > Upon discussing with Ryan I got to know, he was implementing the > contpte stuff for non-hugetlb user mappings and that basically > drove a clarification on the semantics of contiguous bit and > this rule was added. > > If you see currently for non-hugetlb mprotect() we do not flush > during contpte teardown. > > So if the above reasoning makes sense, I can infact audit and > remove the flushes in the hugetlb helpers. I agree with this analysis. I believe it is safe to elide the intermediate flush in this case (as is done in contpte_wrprotect_ptes()). And I agree that we can likely remove some existing TLB maintenance in hugetlb helpers. Thanks, Ryan > >> An instrumented QEMU detected the missing break-step TLBI on an unpatched >> kernel and none with this change. A fork() control exercising >> huge_ptep_set_wrprotect() remained clean. No user-visible failure was >> reproduced. >> >> The QEMU checker was exercised with 4K and 64K base-page kernels. The >> patched kernel passed the LTP hugetlb tests with both -cpu max and -cpu >> cortex-a72 (16 TPASS and no failures). >> >> Testing on Neoverse N1 hardware would be welcome, as it can use the >> contiguous hint and can be configured to report TLB conflicts. >> >> arch/arm64/mm/hugetlbpage.c | 7 ++++++- >> 1 file changed, 6 insertions(+), 1 deletion(-) >> >> diff --git a/arch/arm64/mm/hugetlbpage.c b/arch/arm64/mm/hugetlbpage.c >> index 8e799c1fe0aa..bb53a04b73b2 100644 >> --- a/arch/arm64/mm/hugetlbpage.c >> +++ b/arch/arm64/mm/hugetlbpage.c >> @@ -517,6 +517,11 @@ bool __init arch_hugetlb_valid_size(unsigned long size) >> pte_t huge_ptep_modify_prot_start(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep) >> { >> unsigned long psize = huge_page_size(hstate_vma(vma)); >> + pte_t pte = __ptep_get(ptep); >> + >> + /* The break step for contiguous PTEs must include the TLB flush. */ >> + if (pte_cont(pte)) >> + return huge_ptep_clear_flush(vma, addr, ptep); >> >> if (alternative_has_cap_unlikely(ARM64_WORKAROUND_2645198)) { >> /* >> @@ -524,7 +529,7 @@ pte_t huge_ptep_modify_prot_start(struct vm_area_struct *vma, unsigned long addr >> * when the permission changes from executable to non-executable >> * in cases where cpu is affected with errata #2645198. >> */ >> - if (pte_user_exec(__ptep_get(ptep))) >> + if (pte_user_exec(pte)) >> return huge_ptep_clear_flush(vma, addr, ptep); >> } >> return huge_ptep_get_and_clear(vma->vm_mm, addr, ptep, psize); >> >> base-commit: 786262be6048deab760f68c8acc2c85607165894 > ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] arm64: hugetlb: fix BBM for mprotect() on contiguous PTEs 2026-09-02 14:46 ` Dev Jain 2026-09-02 16:16 ` Ryan Roberts @ 2026-09-02 17:06 ` Karl Mehltretter 2026-09-03 10:45 ` Will Deacon 2 siblings, 0 replies; 7+ messages in thread From: Karl Mehltretter @ 2026-09-02 17:06 UTC (permalink / raw) To: Dev Jain Cc: Catalin Marinas, Will Deacon, linux-arm-kernel, Anshuman Khandual, Ryan Roberts, Mark Rutland, Andrew Morton, Muchun Song, Oscar Salvador, David Hildenbrand, linux-mm, linux-kernel On Wed, Sep 02, 2026 at 08:16:36PM +0100, Dev Jain wrote: > Upon discussing with Ryan I got to know, he was implementing the > contpte stuff for non-hugetlb user mappings and that basically > drove a clarification on the semantics of contiguous bit and > this rule was added. > > If you see currently for non-hugetlb mprotect() we do not flush > during contpte teardown. > > So if the above reasoning makes sense, I can infact audit and > remove the flushes in the hugetlb helpers. > Well, that's quite a turn of events! I wasn't aware of R_JQQTC or the architectural clarification behind contpte_wrprotect_ptes(). My QEMU checker was based on the older assumption in commit 410982303772 and the existing hugetlb comments, so it treated a clear and remake without an intermediate TLBI as a violation. So... Please consider this patch withdrawn. It's good that this may have uncovered an opportunity to remove the flushes in the hugetlb helpers. Thanks, Karl ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] arm64: hugetlb: fix BBM for mprotect() on contiguous PTEs 2026-09-02 14:46 ` Dev Jain 2026-09-02 16:16 ` Ryan Roberts 2026-09-02 17:06 ` Karl Mehltretter @ 2026-09-03 10:45 ` Will Deacon 2 siblings, 0 replies; 7+ messages in thread From: Will Deacon @ 2026-09-03 10:45 UTC (permalink / raw) To: Dev Jain Cc: Karl Mehltretter, Catalin Marinas, linux-arm-kernel, Anshuman Khandual, Ryan Roberts, Mark Rutland, Andrew Morton, Muchun Song, Oscar Salvador, David Hildenbrand, linux-mm, linux-kernel On Wed, Sep 02, 2026 at 08:16:36PM +0530, Dev Jain wrote: > > > On 01/09/26 6:48 pm, Karl Mehltretter wrote: > > huge_ptep_modify_prot_start() clears a hugetlb entry before changing its > > permissions. For contiguous PTE mappings, break-before-make (BBM) > > requires a TLB invalidation after clearing the set and before making any > > entry valid again. > > > > Commit fb396bb459c1 ("arm64/hugetlb: Drop TLB flush from > > get_clear_flush()") removed this invalidation, relying on the deferred > > flush from the core code. Commit 410982303772 ("arm64: hugetlb: Restore > > TLB invalidation for BBM on contiguous ptes") restored it for > > huge_ptep_set_{access_flags,wrprotect}(), since a deferred flush is too > > late for the break step. The modify-prot path has the same problem. > > > > Use huge_ptep_clear_flush() for contiguous entries so that the TLB is > > invalidated during the break step. Leave huge_ptep_get_and_clear() > > unchanged because it is also used by teardown paths, where the deferred > > flush is sufficient. > > > > Fixes: fb396bb459c1 ("arm64/hugetlb: Drop TLB flush from get_clear_flush()") > > Assisted-by: LLM > > Signed-off-by: Karl Mehltretter <kmehltretter@gmail.com> > > --- > > The transition happening here is: > > old_prot+cont -> zero -> new_prot+cont ... (i) > and then TLB flush. > > Arm Arm rule R_JQQTC says: > "For a TLB lookup in a contiguous region mapped by translation table entries > that have consistent values for the Contiguous bit, but have the OA, attributes, > or permissions misprogrammed, that TLB lookup is permitted to produce an OA, > access permissions, and memory attributes that are consistent with any one > of the programmed translation table values." > > This implies that a live update like > old_prot+cont -> new_prot+cont then TLB flush ... (ii) > > is safe. Which should also imply that the transition (i) is safe, > since the configurations the PE can observe for (ii) is the same > for (i), except that in (ii) the PE can fault too, which is fine. I'm not sure I agree. As written, the text above says that if the permissions are misprogrammed (which they are in this case) then the TLB can produce an OA consistent with any of the entries. Hopefully it just needs some further clarification. There are probably also cases where we're changing the attributes and the permissions at the same time, so it's not clear to me that it's safe to allow those to be inconsistent (e.g. tagged/guarded vs read/write). If I was going from untagged read/write -> tagged read-only then I presumably wouldn't expect to see a tag check fault on a write? Will ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2026-09-03 10:46 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-09-01 13:18 [PATCH] arm64: hugetlb: fix BBM for mprotect() on contiguous PTEs Karl Mehltretter 2026-09-02 4:38 ` Anshuman Khandual 2026-09-02 16:58 ` Karl Mehltretter 2026-09-02 14:46 ` Dev Jain 2026-09-02 16:16 ` Ryan Roberts 2026-09-02 17:06 ` Karl Mehltretter 2026-09-03 10:45 ` Will Deacon
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox