From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jan Kiszka Subject: Re: [PATCH 1/1 v2] KVM: MMU: Optimize guest page table walk Date: Mon, 25 Apr 2011 10:04:43 +0200 Message-ID: <4DB52B1B.5080407@web.de> References: <20110422003222.9d08aee3.takuya.yoshikawa@gmail.com> <20110422003444.5b3a876a.takuya.yoshikawa@gmail.com> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="------------enigB1D685E5280414175094FC18" Cc: avi@redhat.com, mtosatti@redhat.com, kvm@vger.kernel.org, yoshikawa.takuya@oss.ntt.co.jp, xiaoguangrong@cn.fujitsu.com, Joerg.Roedel@amd.com To: Takuya Yoshikawa Return-path: Received: from fmmailgate03.web.de ([217.72.192.234]:48077 "EHLO fmmailgate03.web.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756663Ab1DYIEw (ORCPT ); Mon, 25 Apr 2011 04:04:52 -0400 In-Reply-To: <20110422003444.5b3a876a.takuya.yoshikawa@gmail.com> Sender: kvm-owner@vger.kernel.org List-ID: This is an OpenPGP/MIME signed message (RFC 2440 and 3156) --------------enigB1D685E5280414175094FC18 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable On 2011-04-21 17:34, Takuya Yoshikawa wrote: > From: Takuya Yoshikawa >=20 > This patch optimizes the guest page table walk by using get_user() > instead of copy_from_user(). >=20 > With this patch applied, paging64_walk_addr_generic() has become > about 0.5us to 1.0us faster on my Phenom II machine with NPT on. >=20 > Signed-off-by: Takuya Yoshikawa > --- > arch/x86/kvm/paging_tmpl.h | 23 ++++++++++++++++++++--- > 1 files changed, 20 insertions(+), 3 deletions(-) >=20 > diff --git a/arch/x86/kvm/paging_tmpl.h b/arch/x86/kvm/paging_tmpl.h > index 74f8567..825d953 100644 > --- a/arch/x86/kvm/paging_tmpl.h > +++ b/arch/x86/kvm/paging_tmpl.h > @@ -117,6 +117,7 @@ static int FNAME(walk_addr_generic)(struct guest_wa= lker *walker, > gva_t addr, u32 access) > { > pt_element_t pte; > + pt_element_t __user *ptep_user; > gfn_t table_gfn; > unsigned index, pt_access, uninitialized_var(pte_access); > gpa_t pte_gpa; > @@ -152,6 +153,9 @@ walk: > pt_access =3D ACC_ALL; > =20 > for (;;) { > + gfn_t real_gfn; > + unsigned long host_addr; > + > index =3D PT_INDEX(addr, walker->level); > =20 > table_gfn =3D gpte_to_gfn(pte); > @@ -160,9 +164,22 @@ walk: > walker->table_gfn[walker->level - 1] =3D table_gfn; > walker->pte_gpa[walker->level - 1] =3D pte_gpa; > =20 > - if (kvm_read_guest_page_mmu(vcpu, mmu, table_gfn, &pte, > - offset, sizeof(pte), > - PFERR_USER_MASK|PFERR_WRITE_MASK)) { > + real_gfn =3D mmu->translate_gpa(vcpu, gfn_to_gpa(table_gfn), > + PFERR_USER_MASK|PFERR_WRITE_MASK); > + if (real_gfn =3D=3D UNMAPPED_GVA) { > + present =3D false; > + break; > + } > + real_gfn =3D gpa_to_gfn(real_gfn); > + > + host_addr =3D gfn_to_hva(vcpu->kvm, real_gfn); > + if (kvm_is_error_hva(host_addr)) { > + present =3D false; > + break; > + } > + > + ptep_user =3D (pt_element_t __user *)((void *)host_addr + offset); > + if (get_user(pte, ptep_user)) { ^^^^^^^^^^^^ This doesn't work for x86-32: pte is 64 bit, but get_user is only defined up to 32 bit on that platform. Avi, what's your 32-bit buildbot doing? :) Jan --------------enigB1D685E5280414175094FC18 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.15 (GNU/Linux) Comment: Using GnuPG with SUSE - http://enigmail.mozdev.org/ iEYEARECAAYFAk21KyEACgkQitSsb3rl5xRUggCePjGZExD1ADn4l5S0gfUeFClY VsgAoIjapdJp7p9H3HHJglwlONOwbfmB =/SEh -----END PGP SIGNATURE----- --------------enigB1D685E5280414175094FC18--