* [PATCH 6.6.y 0/2] KVM pgtable fixes
@ 2024-08-15 12:46 Will Deacon
2024-08-15 12:46 ` [PATCH 6.6.y 1/2] KVM: arm64: Don't defer TLB invalidation when zapping table entries Will Deacon
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Will Deacon @ 2024-08-15 12:46 UTC (permalink / raw)
To: stable; +Cc: Will Deacon, Marc Zyngier, Oliver Upton, kvmarm
Hi stable folks,
I noticed that these two KVM/arm64 pgtable fixes are missing from 6.6.y
so I've done the backports. The second one is also needed in 6.1.y but
it needs some tweaks so I'll post a separate backport for that.
Cheers,
Will
Cc: Marc Zyngier <maz@kernel.org>
Cc: Oliver Upton <oliver.upton@linux.dev>
cc: kvmarm@lists.linux.dev
--->8
Will Deacon (2):
KVM: arm64: Don't defer TLB invalidation when zapping table entries
KVM: arm64: Don't pass a TLBI level hint when zapping table entries
arch/arm64/kvm/hyp/pgtable.c | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
--
2.46.0.184.g6999bdac58-goog
^ permalink raw reply [flat|nested] 6+ messages in thread* [PATCH 6.6.y 1/2] KVM: arm64: Don't defer TLB invalidation when zapping table entries 2024-08-15 12:46 [PATCH 6.6.y 0/2] KVM pgtable fixes Will Deacon @ 2024-08-15 12:46 ` Will Deacon 2024-08-15 13:04 ` Patch "KVM: arm64: Don't defer TLB invalidation when zapping table entries" has been added to the 6.6-stable tree gregkh 2024-08-15 12:46 ` [PATCH 6.6.y 2/2] KVM: arm64: Don't pass a TLBI level hint when zapping table entries Will Deacon 2024-08-15 13:12 ` [PATCH 6.6.y 0/2] KVM pgtable fixes Greg KH 2 siblings, 1 reply; 6+ messages in thread From: Will Deacon @ 2024-08-15 12:46 UTC (permalink / raw) To: stable Cc: Will Deacon, Marc Zyngier, Oliver Upton, kvmarm, Raghavendra Rao Ananta, Shaoqin Huang commit f62d4c3eb687d87b616b4279acec7862553bda77 upstream. Commit 7657ea920c54 ("KVM: arm64: Use TLBI range-based instructions for unmap") introduced deferred TLB invalidation for the stage-2 page-table so that range-based invalidation can be used for the accumulated addresses. This works fine if the structure of the page-tables remains unchanged, but if entire tables are zapped and subsequently freed then we transiently leave the hardware page-table walker with a reference to freed memory thanks to the translation walk caches. For example, stage2_unmap_walker() will free page-table pages: if (childp) mm_ops->put_page(childp); and issue the TLB invalidation later in kvm_pgtable_stage2_unmap(): if (stage2_unmap_defer_tlb_flush(pgt)) /* Perform the deferred TLB invalidations */ kvm_tlb_flush_vmid_range(pgt->mmu, addr, size); For now, take the conservative approach and invalidate the TLB eagerly when we clear a table entry. Note, however, that the existing level hint passed to __kvm_tlb_flush_vmid_ipa() is incorrect and will be fixed in a subsequent patch. Cc: Raghavendra Rao Ananta <rananta@google.com> Cc: Shaoqin Huang <shahuang@redhat.com> Cc: Marc Zyngier <maz@kernel.org> Cc: Oliver Upton <oliver.upton@linux.dev> Reviewed-by: Shaoqin Huang <shahuang@redhat.com> Reviewed-by: Marc Zyngier <maz@kernel.org> Link: https://lore.kernel.org/r/20240327124853.11206-2-will@kernel.org Signed-off-by: Oliver Upton <oliver.upton@linux.dev> Cc: <stable@vger.kernel.org> # 6.6.y only Signed-off-by: Will Deacon <will@kernel.org> --- arch/arm64/kvm/hyp/pgtable.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/arch/arm64/kvm/hyp/pgtable.c b/arch/arm64/kvm/hyp/pgtable.c index 15aa9bad1c28..6692327fabe7 100644 --- a/arch/arm64/kvm/hyp/pgtable.c +++ b/arch/arm64/kvm/hyp/pgtable.c @@ -861,9 +861,11 @@ static void stage2_unmap_put_pte(const struct kvm_pgtable_visit_ctx *ctx, if (kvm_pte_valid(ctx->old)) { kvm_clear_pte(ctx->ptep); - if (!stage2_unmap_defer_tlb_flush(pgt)) + if (!stage2_unmap_defer_tlb_flush(pgt) || + kvm_pte_table(ctx->old, ctx->level)) { kvm_call_hyp(__kvm_tlb_flush_vmid_ipa, mmu, ctx->addr, ctx->level); + } } mm_ops->put_page(ctx->ptep); -- 2.46.0.184.g6999bdac58-goog ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Patch "KVM: arm64: Don't defer TLB invalidation when zapping table entries" has been added to the 6.6-stable tree 2024-08-15 12:46 ` [PATCH 6.6.y 1/2] KVM: arm64: Don't defer TLB invalidation when zapping table entries Will Deacon @ 2024-08-15 13:04 ` gregkh 0 siblings, 0 replies; 6+ messages in thread From: gregkh @ 2024-08-15 13:04 UTC (permalink / raw) To: gregkh, kvmarm, maz, oliver.upton, rananta, shahuang, will; +Cc: stable-commits This is a note to let you know that I've just added the patch titled KVM: arm64: Don't defer TLB invalidation when zapping table entries to the 6.6-stable tree which can be found at: http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary The filename of the patch is: kvm-arm64-don-t-defer-tlb-invalidation-when-zapping-table-entries.patch and it can be found in the queue-6.6 subdirectory. If you, or anyone else, feels it should not be added to the stable tree, please let <stable@vger.kernel.org> know about it. From stable+bounces-67767-greg=kroah.com@vger.kernel.org Thu Aug 15 14:49:10 2024 From: Will Deacon <will@kernel.org> Date: Thu, 15 Aug 2024 13:46:25 +0100 Subject: KVM: arm64: Don't defer TLB invalidation when zapping table entries To: stable@vger.kernel.org Cc: Will Deacon <will@kernel.org>, Marc Zyngier <maz@kernel.org>, Oliver Upton <oliver.upton@linux.dev>, kvmarm@lists.linux.dev, Raghavendra Rao Ananta <rananta@google.com>, Shaoqin Huang <shahuang@redhat.com> Message-ID: <20240815124626.21674-2-will@kernel.org> From: Will Deacon <will@kernel.org> commit f62d4c3eb687d87b616b4279acec7862553bda77 upstream. Commit 7657ea920c54 ("KVM: arm64: Use TLBI range-based instructions for unmap") introduced deferred TLB invalidation for the stage-2 page-table so that range-based invalidation can be used for the accumulated addresses. This works fine if the structure of the page-tables remains unchanged, but if entire tables are zapped and subsequently freed then we transiently leave the hardware page-table walker with a reference to freed memory thanks to the translation walk caches. For example, stage2_unmap_walker() will free page-table pages: if (childp) mm_ops->put_page(childp); and issue the TLB invalidation later in kvm_pgtable_stage2_unmap(): if (stage2_unmap_defer_tlb_flush(pgt)) /* Perform the deferred TLB invalidations */ kvm_tlb_flush_vmid_range(pgt->mmu, addr, size); For now, take the conservative approach and invalidate the TLB eagerly when we clear a table entry. Note, however, that the existing level hint passed to __kvm_tlb_flush_vmid_ipa() is incorrect and will be fixed in a subsequent patch. Cc: Raghavendra Rao Ananta <rananta@google.com> Cc: Shaoqin Huang <shahuang@redhat.com> Cc: Marc Zyngier <maz@kernel.org> Cc: Oliver Upton <oliver.upton@linux.dev> Reviewed-by: Shaoqin Huang <shahuang@redhat.com> Reviewed-by: Marc Zyngier <maz@kernel.org> Link: https://lore.kernel.org/r/20240327124853.11206-2-will@kernel.org Signed-off-by: Oliver Upton <oliver.upton@linux.dev> Cc: <stable@vger.kernel.org> # 6.6.y only Signed-off-by: Will Deacon <will@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> --- arch/arm64/kvm/hyp/pgtable.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) --- a/arch/arm64/kvm/hyp/pgtable.c +++ b/arch/arm64/kvm/hyp/pgtable.c @@ -861,9 +861,11 @@ static void stage2_unmap_put_pte(const s if (kvm_pte_valid(ctx->old)) { kvm_clear_pte(ctx->ptep); - if (!stage2_unmap_defer_tlb_flush(pgt)) + if (!stage2_unmap_defer_tlb_flush(pgt) || + kvm_pte_table(ctx->old, ctx->level)) { kvm_call_hyp(__kvm_tlb_flush_vmid_ipa, mmu, ctx->addr, ctx->level); + } } mm_ops->put_page(ctx->ptep); Patches currently in stable-queue which might be from will@kernel.org are queue-6.6/kvm-arm64-don-t-defer-tlb-invalidation-when-zapping-table-entries.patch queue-6.6/kvm-arm64-don-t-pass-a-tlbi-level-hint-when-zapping-table-entries.patch ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 6.6.y 2/2] KVM: arm64: Don't pass a TLBI level hint when zapping table entries 2024-08-15 12:46 [PATCH 6.6.y 0/2] KVM pgtable fixes Will Deacon 2024-08-15 12:46 ` [PATCH 6.6.y 1/2] KVM: arm64: Don't defer TLB invalidation when zapping table entries Will Deacon @ 2024-08-15 12:46 ` Will Deacon 2024-08-15 13:04 ` Patch "KVM: arm64: Don't pass a TLBI level hint when zapping table entries" has been added to the 6.6-stable tree gregkh 2024-08-15 13:12 ` [PATCH 6.6.y 0/2] KVM pgtable fixes Greg KH 2 siblings, 1 reply; 6+ messages in thread From: Will Deacon @ 2024-08-15 12:46 UTC (permalink / raw) To: stable Cc: Will Deacon, Marc Zyngier, Oliver Upton, kvmarm, Gavin Shan, Quentin Perret, Shaoqin Huang commit 36e008323926036650299cfbb2dca704c7aba849 upstream. The TLBI level hints are for leaf entries only, so take care not to pass them incorrectly after clearing a table entry. Cc: Gavin Shan <gshan@redhat.com> Cc: Marc Zyngier <maz@kernel.org> Cc: Quentin Perret <qperret@google.com> Fixes: 82bb02445de5 ("KVM: arm64: Implement kvm_pgtable_hyp_unmap() at EL2") Fixes: 6d9d2115c480 ("KVM: arm64: Add support for stage-2 map()/unmap() in generic page-table") Signed-off-by: Will Deacon <will@kernel.org> Reviewed-by: Shaoqin Huang <shahuang@redhat.com> Reviewed-by: Marc Zyngier <maz@kernel.org> Link: https://lore.kernel.org/r/20240327124853.11206-3-will@kernel.org Signed-off-by: Oliver Upton <oliver.upton@linux.dev> Cc: <stable@vger.kernel.org> # 6.6.y only [will@: Use '0' instead of TLBI_TTL_UNKNOWN to indicate "no level"] Signed-off-by: Will Deacon <will@kernel.org> --- arch/arm64/kvm/hyp/pgtable.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/arch/arm64/kvm/hyp/pgtable.c b/arch/arm64/kvm/hyp/pgtable.c index 6692327fabe7..ca0bf0b92ca0 100644 --- a/arch/arm64/kvm/hyp/pgtable.c +++ b/arch/arm64/kvm/hyp/pgtable.c @@ -523,7 +523,7 @@ static int hyp_unmap_walker(const struct kvm_pgtable_visit_ctx *ctx, kvm_clear_pte(ctx->ptep); dsb(ishst); - __tlbi_level(vae2is, __TLBI_VADDR(ctx->addr, 0), ctx->level); + __tlbi_level(vae2is, __TLBI_VADDR(ctx->addr, 0), 0); } else { if (ctx->end - ctx->addr < granule) return -EINVAL; @@ -861,10 +861,12 @@ static void stage2_unmap_put_pte(const struct kvm_pgtable_visit_ctx *ctx, if (kvm_pte_valid(ctx->old)) { kvm_clear_pte(ctx->ptep); - if (!stage2_unmap_defer_tlb_flush(pgt) || - kvm_pte_table(ctx->old, ctx->level)) { - kvm_call_hyp(__kvm_tlb_flush_vmid_ipa, mmu, - ctx->addr, ctx->level); + if (kvm_pte_table(ctx->old, ctx->level)) { + kvm_call_hyp(__kvm_tlb_flush_vmid_ipa, mmu, ctx->addr, + 0); + } else if (!stage2_unmap_defer_tlb_flush(pgt)) { + kvm_call_hyp(__kvm_tlb_flush_vmid_ipa, mmu, ctx->addr, + ctx->level); } } -- 2.46.0.184.g6999bdac58-goog ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Patch "KVM: arm64: Don't pass a TLBI level hint when zapping table entries" has been added to the 6.6-stable tree 2024-08-15 12:46 ` [PATCH 6.6.y 2/2] KVM: arm64: Don't pass a TLBI level hint when zapping table entries Will Deacon @ 2024-08-15 13:04 ` gregkh 0 siblings, 0 replies; 6+ messages in thread From: gregkh @ 2024-08-15 13:04 UTC (permalink / raw) To: gregkh, gshan, kvmarm, maz, oliver.upton, qperret, shahuang, will Cc: stable-commits This is a note to let you know that I've just added the patch titled KVM: arm64: Don't pass a TLBI level hint when zapping table entries to the 6.6-stable tree which can be found at: http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary The filename of the patch is: kvm-arm64-don-t-pass-a-tlbi-level-hint-when-zapping-table-entries.patch and it can be found in the queue-6.6 subdirectory. If you, or anyone else, feels it should not be added to the stable tree, please let <stable@vger.kernel.org> know about it. From stable+bounces-67768-greg=kroah.com@vger.kernel.org Thu Aug 15 14:49:11 2024 From: Will Deacon <will@kernel.org> Date: Thu, 15 Aug 2024 13:46:26 +0100 Subject: KVM: arm64: Don't pass a TLBI level hint when zapping table entries To: stable@vger.kernel.org Cc: Will Deacon <will@kernel.org>, Marc Zyngier <maz@kernel.org>, Oliver Upton <oliver.upton@linux.dev>, kvmarm@lists.linux.dev, Gavin Shan <gshan@redhat.com>, Quentin Perret <qperret@google.com>, Shaoqin Huang <shahuang@redhat.com> Message-ID: <20240815124626.21674-3-will@kernel.org> From: Will Deacon <will@kernel.org> commit 36e008323926036650299cfbb2dca704c7aba849 upstream. The TLBI level hints are for leaf entries only, so take care not to pass them incorrectly after clearing a table entry. Cc: Gavin Shan <gshan@redhat.com> Cc: Marc Zyngier <maz@kernel.org> Cc: Quentin Perret <qperret@google.com> Fixes: 82bb02445de5 ("KVM: arm64: Implement kvm_pgtable_hyp_unmap() at EL2") Fixes: 6d9d2115c480 ("KVM: arm64: Add support for stage-2 map()/unmap() in generic page-table") Signed-off-by: Will Deacon <will@kernel.org> Reviewed-by: Shaoqin Huang <shahuang@redhat.com> Reviewed-by: Marc Zyngier <maz@kernel.org> Link: https://lore.kernel.org/r/20240327124853.11206-3-will@kernel.org Signed-off-by: Oliver Upton <oliver.upton@linux.dev> Cc: <stable@vger.kernel.org> # 6.6.y only [will@: Use '0' instead of TLBI_TTL_UNKNOWN to indicate "no level"] Signed-off-by: Will Deacon <will@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> --- arch/arm64/kvm/hyp/pgtable.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) --- a/arch/arm64/kvm/hyp/pgtable.c +++ b/arch/arm64/kvm/hyp/pgtable.c @@ -523,7 +523,7 @@ static int hyp_unmap_walker(const struct kvm_clear_pte(ctx->ptep); dsb(ishst); - __tlbi_level(vae2is, __TLBI_VADDR(ctx->addr, 0), ctx->level); + __tlbi_level(vae2is, __TLBI_VADDR(ctx->addr, 0), 0); } else { if (ctx->end - ctx->addr < granule) return -EINVAL; @@ -861,10 +861,12 @@ static void stage2_unmap_put_pte(const s if (kvm_pte_valid(ctx->old)) { kvm_clear_pte(ctx->ptep); - if (!stage2_unmap_defer_tlb_flush(pgt) || - kvm_pte_table(ctx->old, ctx->level)) { - kvm_call_hyp(__kvm_tlb_flush_vmid_ipa, mmu, - ctx->addr, ctx->level); + if (kvm_pte_table(ctx->old, ctx->level)) { + kvm_call_hyp(__kvm_tlb_flush_vmid_ipa, mmu, ctx->addr, + 0); + } else if (!stage2_unmap_defer_tlb_flush(pgt)) { + kvm_call_hyp(__kvm_tlb_flush_vmid_ipa, mmu, ctx->addr, + ctx->level); } } Patches currently in stable-queue which might be from will@kernel.org are queue-6.6/kvm-arm64-don-t-defer-tlb-invalidation-when-zapping-table-entries.patch queue-6.6/kvm-arm64-don-t-pass-a-tlbi-level-hint-when-zapping-table-entries.patch ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 6.6.y 0/2] KVM pgtable fixes 2024-08-15 12:46 [PATCH 6.6.y 0/2] KVM pgtable fixes Will Deacon 2024-08-15 12:46 ` [PATCH 6.6.y 1/2] KVM: arm64: Don't defer TLB invalidation when zapping table entries Will Deacon 2024-08-15 12:46 ` [PATCH 6.6.y 2/2] KVM: arm64: Don't pass a TLBI level hint when zapping table entries Will Deacon @ 2024-08-15 13:12 ` Greg KH 2 siblings, 0 replies; 6+ messages in thread From: Greg KH @ 2024-08-15 13:12 UTC (permalink / raw) To: Will Deacon; +Cc: stable, Marc Zyngier, Oliver Upton, kvmarm On Thu, Aug 15, 2024 at 01:46:24PM +0100, Will Deacon wrote: > Hi stable folks, > > I noticed that these two KVM/arm64 pgtable fixes are missing from 6.6.y > so I've done the backports. The second one is also needed in 6.1.y but > it needs some tweaks so I'll post a separate backport for that. Now queued up, thanks. greg k-h ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2024-08-15 13:12 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2024-08-15 12:46 [PATCH 6.6.y 0/2] KVM pgtable fixes Will Deacon 2024-08-15 12:46 ` [PATCH 6.6.y 1/2] KVM: arm64: Don't defer TLB invalidation when zapping table entries Will Deacon 2024-08-15 13:04 ` Patch "KVM: arm64: Don't defer TLB invalidation when zapping table entries" has been added to the 6.6-stable tree gregkh 2024-08-15 12:46 ` [PATCH 6.6.y 2/2] KVM: arm64: Don't pass a TLBI level hint when zapping table entries Will Deacon 2024-08-15 13:04 ` Patch "KVM: arm64: Don't pass a TLBI level hint when zapping table entries" has been added to the 6.6-stable tree gregkh 2024-08-15 13:12 ` [PATCH 6.6.y 0/2] KVM pgtable fixes Greg KH
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.