Skip to content

Commit 117940a

Browse files
rananta468Marc Zyngier
authored andcommitted
KVM: arm64: Define kvm_tlb_flush_vmid_range()
Implement the helper kvm_tlb_flush_vmid_range() that acts as a wrapper for range-based TLB invalidations. For the given VMID, use the range-based TLBI instructions to do the job or fallback to invalidating all the TLB entries. Signed-off-by: Raghavendra Rao Ananta <rananta@google.com> Reviewed-by: Gavin Shan <gshan@redhat.com> Reviewed-by: Shaoqin Huang <shahuang@redhat.com> Signed-off-by: Marc Zyngier <maz@kernel.org> Link: https://lore.kernel.org/r/20230811045127.3308641-11-rananta@google.com
1 parent 6354d15 commit 117940a

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed

arch/arm64/include/asm/kvm_pgtable.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -746,4 +746,14 @@ enum kvm_pgtable_prot kvm_pgtable_stage2_pte_prot(kvm_pte_t pte);
746746
* kvm_pgtable_prot format.
747747
*/
748748
enum kvm_pgtable_prot kvm_pgtable_hyp_pte_prot(kvm_pte_t pte);
749+
750+
/**
751+
* kvm_tlb_flush_vmid_range() - Invalidate/flush a range of TLB entries
752+
*
753+
* @mmu: Stage-2 KVM MMU struct
754+
* @addr: The base Intermediate physical address from which to invalidate
755+
* @size: Size of the range from the base to invalidate
756+
*/
757+
void kvm_tlb_flush_vmid_range(struct kvm_s2_mmu *mmu,
758+
phys_addr_t addr, size_t size);
749759
#endif /* __ARM64_KVM_PGTABLE_H__ */

arch/arm64/kvm/hyp/pgtable.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -670,6 +670,26 @@ static bool stage2_has_fwb(struct kvm_pgtable *pgt)
670670
return !(pgt->flags & KVM_PGTABLE_S2_NOFWB);
671671
}
672672

673+
void kvm_tlb_flush_vmid_range(struct kvm_s2_mmu *mmu,
674+
phys_addr_t addr, size_t size)
675+
{
676+
unsigned long pages, inval_pages;
677+
678+
if (!system_supports_tlb_range()) {
679+
kvm_call_hyp(__kvm_tlb_flush_vmid, mmu);
680+
return;
681+
}
682+
683+
pages = size >> PAGE_SHIFT;
684+
while (pages > 0) {
685+
inval_pages = min(pages, MAX_TLBI_RANGE_PAGES);
686+
kvm_call_hyp(__kvm_tlb_flush_vmid_range, mmu, addr, inval_pages);
687+
688+
addr += inval_pages << PAGE_SHIFT;
689+
pages -= inval_pages;
690+
}
691+
}
692+
673693
#define KVM_S2_MEMATTR(pgt, attr) PAGE_S2_MEMATTR(attr, stage2_has_fwb(pgt))
674694

675695
static int stage2_set_prot_attr(struct kvm_pgtable *pgt, enum kvm_pgtable_prot prot,

0 commit comments

Comments
 (0)