ANDROID: KVM: arm64: Check for existing pinned_pages before THP in pkvm_mem_abort
With the later introduction of the SPLIT request, we can expect to have a level-3 mapping on the stage-2 where a level-2 is installed for the stage-1. Also, part of the stage-2 might have been unmapped already. So check for existing stage-2 mappings before checking for the stage-1 (transparent_hugepage_adjust()). Bug: 419548963 Bug: 357781595 Bug: 278011447 Change-Id: Iff7755ff6a82fa080c3a04efe1e689bc0500a3c9 Signed-off-by: Vincent Donnefort <vdonnefort@google.com>
This commit is contained in:
@@ -1730,9 +1730,8 @@ __pkvm_pages_to_ppages(struct kvm *kvm, struct kvm_memory_slot *memslot, gfn_t g
|
|||||||
read_lock(&kvm->mmu_lock);
|
read_lock(&kvm->mmu_lock);
|
||||||
while (p < nr_pages) {
|
while (p < nr_pages) {
|
||||||
phys_addr_t ipa = gfn << PAGE_SHIFT;
|
phys_addr_t ipa = gfn << PAGE_SHIFT;
|
||||||
|
long skip, page_size = PAGE_SIZE;
|
||||||
struct page *page = pages[p];
|
struct page *page = pages[p];
|
||||||
long page_size, skip;
|
|
||||||
unsigned long hva;
|
|
||||||
u64 pfn;
|
u64 pfn;
|
||||||
|
|
||||||
ppage = kvm_pinned_pages_iter_first(&kvm->arch.pkvm.pinned_pages,
|
ppage = kvm_pinned_pages_iter_first(&kvm->arch.pkvm.pinned_pages,
|
||||||
@@ -1743,8 +1742,14 @@ __pkvm_pages_to_ppages(struct kvm *kvm, struct kvm_memory_slot *memslot, gfn_t g
|
|||||||
}
|
}
|
||||||
|
|
||||||
pfn = page_to_pfn(page);
|
pfn = page_to_pfn(page);
|
||||||
hva = gfn_to_hva_memslot_prot(memslot, gfn, NULL);
|
|
||||||
page_size = transparent_hugepage_adjust(kvm, memslot, hva, &pfn, &ipa);
|
if (!kvm_pinned_pages_iter_first(&kvm->arch.pkvm.pinned_pages,
|
||||||
|
ALIGN_DOWN(ipa, PMD_SIZE),
|
||||||
|
ALIGN(ipa + 1, PMD_SIZE) - 1)){
|
||||||
|
unsigned long hva = gfn_to_hva_memslot_prot(memslot, gfn, NULL);
|
||||||
|
|
||||||
|
page_size = transparent_hugepage_adjust(kvm, memslot, hva, &pfn, &ipa);
|
||||||
|
}
|
||||||
|
|
||||||
/* Pop a ppage from the pre-allocated list */
|
/* Pop a ppage from the pre-allocated list */
|
||||||
ppage = list_first_entry(&ppage_prealloc, struct kvm_pinned_page, list_node);
|
ppage = list_first_entry(&ppage_prealloc, struct kvm_pinned_page, list_node);
|
||||||
|
|||||||
Reference in New Issue
Block a user