Re: [PATCH 3/3] KVM: x86: improve reexecute_instruction

Marcelo Tosatti
2012-12-03T19:47:04Z

On Mon, Dec 03, 2012 at 04:33:01PM +0800, Xiao Guangrong wrote:
> Hi Marcelo,
>
> Thanks for your patience. I was reading your reply over and over again, i would
> like to argue it more :).
> Please see below.
>
> On 11/29/2012 08:21 AM, Marcelo Tosatti wrote:
>
> >
> > https://lkml.org/lkml/2012/11/17/75
> >
> > Does unshadowing work with large sptes at reexecute_instruction? That
> > is, do we nuke any large read-only sptes that might be causing a certain
> > gfn to be read-only?
> >
> > That is, following the sequence there, is the large read-only spte
> > properly destroyed?
>
> Actually, sptes can not prevent gfn becoming writable, that means the gfn
> can become writable *even if* it exists a spte which maps to the gfn.
>
> The condition that can prevent gfn becoming writable is, the gfn has been
> shadowed, that means the gfn can not become writable if it exists a sp
> with sp.gfn = gfn.
>
> Note, drop_spte does not remove any sp. So, either destroying spte or keeping
> spte doest not have any affect for gfn write-protection.
>
> If luck enough, my point is right, the current code can do some optimizations
> as below:
>
> if (level > PT_PAGE_TABLE_LEVEL &&
> - has_wrprotected_page(vcpu->kvm, gfn, level)) {
> - ret = 1;
> - drop_spte(vcpu->kvm, sptep);
> - goto done;
> - }
> + has_wrprotected_page(vcpu->kvm, gfn, level))
> + return 0;
>
>
> 1): we can return 0 instead of 1 to avoid unnecessary emulation. vcpu will refault
> again then kvm will use small page.

So on refault the large spte is nuked. That works, yes.

> 2): need not do any change on the spte.