From mboxrd@z Thu Jan 1 00:00:00 1970 From: David Gibson Date: Wed, 26 Sep 2018 04:30:02 +0000 Subject: Re: [RFC PATCH 18/32] KVM: PPC: Book3S HV: Use kvmppc_unmap_pte() in kvm_unmap_radix() Message-Id: <20180926043002.GU30868@umbus.fritz.box> MIME-Version: 1 Content-Type: multipart/mixed; boundary="cdcYGd5Oh7AfgVra" 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 --cdcYGd5Oh7AfgVra Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Wed, Sep 26, 2018 at 02:08:37PM +1000, David Gibson wrote: > 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 >=20 > Reviewed-by: David Gibson Although... > > --- > > 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/= book3s_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); =2E.it might be nicer to avoid the explicit test on memslot by maping a __kvmppc_unmap_pte() which must have memslot passed in, and a wrapper which computes it from the 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, = pte_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, = pmd_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_m= emory_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 --=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 --cdcYGd5Oh7AfgVra Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQIzBAEBCAAdFiEEdfRlhq5hpmzETofcbDjKyiDZs5IFAlurC0cACgkQbDjKyiDZ s5J/eA/8DfrgPgVLXhPdAlUcpk9hhLILU/Ts5Gj6KUG7dSg1yFD1bLPfShNQbWHh kjgXlXRfWVd4QfzGBRQZbA7bB+OY3z3hcP7KxBAz8K56FMJJ3rp0exVpOXBkJJBJ /zCINYnTdPq/eYGEyQjobia7AAOf0eQvF70dx45DCEUAXDGUtfAF2V6g33bZ98nI v9VVFcscXqlJYmTutDk4a1/vm1rOL87yDaY8FAKx/XkX55tJgXWWAe8xRIQNk5rR kt7vwtOEY0fpbTMn7gOcGv76TZwy118pIYrJfC1GGAKEO2ENF7umheSI8FkK0rNW HwKGI8vHNWfZ6sAPu/5hlR+ZM2k+AiW9N5Pzb6CTjC49ygkthuJ+YS9RgfatcjNq 8oN5hkzboapgv3SQQbUJvk3OTe64aAhFGsX+c5BQSGpTnFPTY7pZRFkP+bNa+ywY i7rXXlekqGQHQowMuWfAiXJQqWSPC8B1zcDi5B14JEdROCPtEm5ghoc3yFZLiQ5G 7Ge2VXGuO4fG+lDJaCWT1AKCIQR+DlJmOq5rXjRYZrL7soR26Gsuctv/gcGVnmcx mmVXK28cOsIMpnU5COBWDuICdZ/kZ/ABhmQ/qJdyfh4ttDGP6ZwErVQvJ3sw4o98 ni3u/y/BPreIWd1c0deOrhc9ibGeja6A+GSHtaEkXFQ5m/ulNqE= =jYcq -----END PGP SIGNATURE----- --cdcYGd5Oh7AfgVra--