From mboxrd@z Thu Jan 1 00:00:00 1970 From: David Gibson Date: Wed, 26 Sep 2018 04:08:37 +0000 Subject: Re: [RFC PATCH 18/32] KVM: PPC: Book3S HV: Use kvmppc_unmap_pte() in kvm_unmap_radix() Message-Id: <20180926040837.GT30868@umbus.fritz.box> MIME-Version: 1 Content-Type: multipart/mixed; boundary="u08a77unfWDSo9q0" List-Id: References: <1537524123-9578-19-git-send-email-paulus@ozlabs.org> In-Reply-To: <1537524123-9578-19-git-send-email-paulus@ozlabs.org> To: kvm-ppc@vger.kernel.org --u08a77unfWDSo9q0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Fri, Sep 21, 2018 at 08:01:49PM +1000, Paul Mackerras wrote: > kvmppc_unmap_pte() does a sequence of operations that are open-coded in > kvm_unmap_radix(). This extends kvmppc_unmap_pte() a little so that it > can be used by kvm_unmap_radix(), and makes kvm_unmap_radix() call it. >=20 > Signed-off-by: Paul Mackerras Reviewed-by: David Gibson > --- > arch/powerpc/kvm/book3s_64_mmu_radix.c | 36 ++++++++++++++--------------= ------ > 1 file changed, 15 insertions(+), 21 deletions(-) >=20 > diff --git a/arch/powerpc/kvm/book3s_64_mmu_radix.c b/arch/powerpc/kvm/bo= ok3s_64_mmu_radix.c > index 47f2b18..d9357e0 100644 > --- a/arch/powerpc/kvm/book3s_64_mmu_radix.c > +++ b/arch/powerpc/kvm/book3s_64_mmu_radix.c > @@ -240,21 +240,25 @@ static void kvmppc_pmd_free(pmd_t *pmdp) > } > =20 > static void kvmppc_unmap_pte(struct kvm *kvm, pte_t *pte, > - unsigned long gpa, unsigned int shift) > + unsigned long gpa, unsigned int shift, > + struct kvm_memory_slot *memslot) > =20 > { > - unsigned long page_size =3D 1ul << shift; > unsigned long old; > =20 > old =3D kvmppc_radix_update_pte(kvm, pte, ~0UL, 0, gpa, shift); > kvmppc_radix_tlbie_page(kvm, gpa, shift); > if (old & _PAGE_DIRTY) { > unsigned long gfn =3D gpa >> PAGE_SHIFT; > - struct kvm_memory_slot *memslot; > + unsigned long page_size =3D PAGE_SIZE; > =20 > - memslot =3D gfn_to_memslot(kvm, gfn); > - if (memslot && memslot->dirty_bitmap) > + if (shift) > + page_size =3D 1ul << shift; > + if (!memslot) > + memslot =3D gfn_to_memslot(kvm, gfn); > + if (memslot && memslot->dirty_bitmap) { > kvmppc_update_dirty_map(memslot, gfn, page_size); > + } > } > } > =20 > @@ -282,7 +286,7 @@ static void kvmppc_unmap_free_pte(struct kvm *kvm, pt= e_t *pte, bool full) > WARN_ON_ONCE(1); > kvmppc_unmap_pte(kvm, p, > pte_pfn(*p) << PAGE_SHIFT, > - PAGE_SHIFT); > + PAGE_SHIFT, NULL); > } > } > =20 > @@ -304,7 +308,7 @@ static void kvmppc_unmap_free_pmd(struct kvm *kvm, pm= d_t *pmd, bool full) > WARN_ON_ONCE(1); > kvmppc_unmap_pte(kvm, (pte_t *)p, > pte_pfn(*(pte_t *)p) << PAGE_SHIFT, > - PMD_SHIFT); > + PMD_SHIFT, NULL); > } > } else { > pte_t *pte; > @@ -468,7 +472,7 @@ static int kvmppc_create_pte(struct kvm *kvm, pgd_t *= pgtable, pte_t pte, > goto out_unlock; > } > /* Valid 1GB page here already, remove it */ > - kvmppc_unmap_pte(kvm, (pte_t *)pud, hgpa, PUD_SHIFT); > + kvmppc_unmap_pte(kvm, (pte_t *)pud, hgpa, PUD_SHIFT, NULL); > } > if (level =3D=3D 2) { > if (!pud_none(*pud)) { > @@ -517,7 +521,7 @@ static int kvmppc_create_pte(struct kvm *kvm, pgd_t *= pgtable, pte_t pte, > goto out_unlock; > } > /* Valid 2MB page here already, remove it */ > - kvmppc_unmap_pte(kvm, pmdp_ptep(pmd), lgpa, PMD_SHIFT); > + kvmppc_unmap_pte(kvm, pmdp_ptep(pmd), lgpa, PMD_SHIFT, NULL); > } > if (level =3D=3D 1) { > if (!pmd_none(*pmd)) { > @@ -780,20 +784,10 @@ int kvm_unmap_radix(struct kvm *kvm, struct kvm_mem= ory_slot *memslot, > pte_t *ptep; > unsigned long gpa =3D gfn << PAGE_SHIFT; > unsigned int shift; > - unsigned long old; > =20 > ptep =3D __find_linux_pte(kvm->arch.pgtable, gpa, NULL, &shift); > - if (ptep && pte_present(*ptep)) { > - old =3D kvmppc_radix_update_pte(kvm, ptep, ~0UL, 0, > - gpa, shift); > - kvmppc_radix_tlbie_page(kvm, gpa, shift); > - if ((old & _PAGE_DIRTY) && memslot->dirty_bitmap) { > - unsigned long psize =3D PAGE_SIZE; > - if (shift) > - psize =3D 1ul << shift; > - kvmppc_update_dirty_map(memslot, gfn, psize); > - } > - } > + if (ptep && pte_present(*ptep)) > + kvmppc_unmap_pte(kvm, ptep, gpa, shift, memslot); > return 0; =09 > } > =20 --=20 David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson --u08a77unfWDSo9q0 Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQIzBAEBCAAdFiEEdfRlhq5hpmzETofcbDjKyiDZs5IFAlurBkIACgkQbDjKyiDZ s5LTERAA4QfSTY4C9rZ4fA0OZlUGZhFYsvxl1wSJCKU6NQFr3+jXGF6Se9DOt5YR tAsd3gFJ7p7iCo+ojyaPK0xzCMNalxDvKBWB0bWR6LbpZLFe4k7C8ShKLoPcbOv4 ThBTrzW07uCLPaHUyXUvEb3s8FPAzfrwmQBkpqUZomjalxi9mmdtviPlWx7n/tSM eqOMNxO9ZsMWSerH3A2Sbe55oRUR6wDx1c7/Cpq+pX1dvNEAp9dL85MMZNXWh60y qNyzbUxiH4GxbeApUXgoiFDFw2vxNDYSxcYvjZ7GW5KPQOP2BISD5pdEpAFXaGXr nFRo8hPsDMky1DzfYqjtvo85tHIUWOh+8SmmhfJijrIRxF4Ov31ClZ0f+BeLDv5Y YzfI895xevxYCFyXlZf9bZnVv7iE/Fzo7t/z78owP9ULW8sbvP2nKRTOu5gEuldz RVw2xZq8zIx7t8c2Mlr3eLqFkKvIxafmrDXhJ600Y4S6ppRVzOK4dxY/sydcRdAo h6EBo9N7u5a1C5ORph3tr0Ioc4h+bFY5rTZ/8SxXKdU/TUSQqO4ppeqZAmT0rTjk ruyDiMDosnfNwed8mmUfl+YtxuFV99ns0/0vjwaFa1gmJIcuD2YN1Hb++xuHAJ6S 1ehNZeEOxoxHxnHHh9YZlBY6tB4Y595p92za35Y3Ic/42Cx4If8= =Ggb5 -----END PGP SIGNATURE----- --u08a77unfWDSo9q0--