[PATCH] fixup! ARM: KVM: add page accounting and guest page table eviction

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Just a few cosmetic fixes that were in my tree and didn't make it
into the v10 tree yet.

Signed-off-by: Marc Zyngier <marc.zyngier@xxxxxxx>
---
 arch/arm/kvm/mmu.c |   30 +++++++++++++++---------------
 1 file changed, 15 insertions(+), 15 deletions(-)

diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c
index 30d0cfc..e29b588 100644
--- a/arch/arm/kvm/mmu.c
+++ b/arch/arm/kvm/mmu.c
@@ -286,13 +286,15 @@ static void free_guest_pages(pte_t *pte, unsigned long addr)
 		}
 		pte++;
 	}
+
+	WARN_ON(page_count(pte_page) != 1);
 }
 
 static void free_stage2_ptes(pmd_t *pmd, unsigned long addr)
 {
 	unsigned int i;
 	pte_t *pte;
-	struct page *page, *pmd_page;
+	struct page *pmd_page;
 
 	pmd_page = virt_to_page(pmd);
 
@@ -301,14 +303,14 @@ static void free_stage2_ptes(pmd_t *pmd, unsigned long addr)
 		if (!pmd_none(*pmd) && pmd_table(*pmd)) {
 			pte = pte_offset_kernel(pmd, addr);
 			free_guest_pages(pte, addr);
-			page = virt_to_page((void *)pte);
-			WARN_ON(page_count(page) != 1);
 			pte_free_kernel(NULL, pte);
 
 			put_page(pmd_page);
 		}
 		pmd++;
 	}
+
+	WARN_ON(page_count(pmd_page) != 1);
 }
 
 /**
@@ -328,7 +330,7 @@ void kvm_free_stage2_pgd(struct kvm *kvm)
 	pud_t *pud;
 	pmd_t *pmd;
 	unsigned long long i, addr;
-	struct page *page, *pud_page;
+	struct page *pud_page;
 
 	if (kvm->arch.pgd == NULL)
 		return;
@@ -351,8 +353,6 @@ void kvm_free_stage2_pgd(struct kvm *kvm)
 
 		pmd = pmd_offset(pud, addr);
 		free_stage2_ptes(pmd, addr);
-		page = virt_to_page((void *)pmd);
-		WARN_ON(page_count(page) != 1);
 		pmd_free(NULL, pmd);
 		put_page(pud_page);
 	}
@@ -362,7 +362,11 @@ void kvm_free_stage2_pgd(struct kvm *kvm)
 	kvm->arch.pgd = NULL;
 }
 
-/*
+/**
+ * stage2_clear_pte -- Clear a stage-2 PTE.
+ * @kvm:  The VM pointer
+ * @addr: The physical address of the PTE
+ *
  * Clear a stage-2 PTE, lowering the various ref-counts. Also takes
  * care of invalidating the TLBs.  Must be called while holding
  * pgd_lock, otherwise another faulting VCPU may come in and mess
@@ -376,7 +380,6 @@ static void stage2_clear_pte(struct kvm *kvm, phys_addr_t addr)
 	pte_t *pte;
 	struct page *page;
 
-	kvm_debug("Clearing PTE&%08llx\n", addr);
 	pgd = kvm->arch.pgd + pgd_index(addr);
 	pud = pud_offset(pgd, addr);
 	BUG_ON(pud_none(*pud));
@@ -396,24 +399,21 @@ static void stage2_clear_pte(struct kvm *kvm, phys_addr_t addr)
 
 	/* Need to remove pte page */
 	pmd_clear(pmd);
-	__kvm_tlb_flush_vmid(kvm);
 	pte_free_kernel(NULL, (pte_t *)((unsigned long)pte & PAGE_MASK));
 
 	page = virt_to_page(pmd);
 	put_page(page);
-	if (page_count(page) != 1)
+	if (page_count(page) != 1) {
+		__kvm_tlb_flush_vmid(kvm);
 		return;
+	}
 
-	/*
-	 * Need to remove pmd page. This is the worst case, and we end
-	 * up invalidating the TLB twice. No big deal.
-	 */
 	pud_clear(pud);
-	__kvm_tlb_flush_vmid(kvm);
 	pmd_free(NULL, (pmd_t *)((unsigned long)pmd & PAGE_MASK));
 
 	page = virt_to_page(pud);
 	put_page(page);
+	__kvm_tlb_flush_vmid(kvm);
 }
 
 static void stage2_set_pte(struct kvm *kvm, struct kvm_mmu_memory_cache *cache,
-- 
1.7.10.3



_______________________________________________
kvmarm mailing list
kvmarm@xxxxxxxxxxxxxxxxxxxxx
https://lists.cs.columbia.edu/cucslists/listinfo/kvmarm


[Index of Archives]     [Linux KVM]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux