From: Marcelo Tosatti <mtosatti@redhat.com>
To: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
Cc: Avi Kivity <avi@redhat.com>, LKML <linux-kernel@vger.kernel.org>,
KVM <kvm@vger.kernel.org>
Subject: Re: [PATCH 03/11] KVM: x86: retry non-page-table writing instruction
Date: Mon, 22 Aug 2011 16:59:29 -0300 [thread overview]
Message-ID: <20110822195929.GA2662@amt.cnet> (raw)
In-Reply-To: <4E4A113F.5090404@cn.fujitsu.com>
On Tue, Aug 16, 2011 at 02:42:07PM +0800, Xiao Guangrong wrote:
> If the emulation is caused by #PF and it is non-page_table writing instruction,
> it means the VM-EXIT is caused by shadow page protected, we can zap the shadow
> page and retry this instruction directly
>
> The idea is from Avi
>
> Signed-off-by: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
> ---
> arch/x86/include/asm/kvm_emulate.h | 1 +
> arch/x86/include/asm/kvm_host.h | 5 +++
> arch/x86/kvm/emulate.c | 5 +++
> arch/x86/kvm/mmu.c | 22 +++++++++++---
> arch/x86/kvm/x86.c | 53 ++++++++++++++++++++++++++++++++++++
> 5 files changed, 81 insertions(+), 5 deletions(-)
>
> --- a/arch/x86/kvm/x86.c
> +++ b/arch/x86/kvm/x86.c
> @@ -4814,6 +4814,56 @@ static bool reexecute_instruction(struct kvm_vcpu *vcpu, gva_t gva)
> return false;
> }
>
> +static bool retry_instruction(struct x86_emulate_ctxt *ctxt,
> + unsigned long cr2, int emulation_type)
> +{
> + struct kvm_vcpu *vcpu = emul_to_vcpu(ctxt);
> + unsigned long last_retry_eip, last_retry_addr, gpa = cr2;
> +
> + last_retry_eip = vcpu->arch.last_retry_eip;
> + last_retry_addr = vcpu->arch.last_retry_addr;
> +
> + /*
> + * If the emulation is caused by #PF and it is non-page_table
> + * writing instruction, it means the VM-EXIT is caused by shadow
> + * page protected, we can zap the shadow page and retry this
> + * instruction directly.
> + *
> + * Note: if the guest uses a non-page-table modifying instruction
> + * on the PDE that points to the instruction, then we will unmap
> + * the instruction and go to an infinite loop. So, we cache the
> + * last retried eip and the last fault address, if we meet the eip
> + * and the address again, we can break out of the potential infinite
> + * loop.
> + */
> + vcpu->arch.last_retry_eip = vcpu->arch.last_retry_addr = 0;
> +
> + if (!(emulation_type & EMULTYPE_RETRY))
> + return false;
> +
> + if (page_table_writing_insn(ctxt))
> + return false;
> +
> + if (ctxt->eip == last_retry_eip && last_retry_addr == cr2)
> + return false;
> +
> + vcpu->arch.last_retry_eip = ctxt->eip;
> + vcpu->arch.last_retry_addr = cr2;
> +
> + if (!vcpu->arch.mmu.direct_map && !mmu_is_nested(vcpu))
> + gpa = kvm_mmu_gva_to_gpa_write(vcpu, cr2, NULL);
Why write?
> + kvm_mmu_unprotect_page(vcpu->kvm, gpa >> PAGE_SHIFT);
> +
> + /*
> + * The shadow pages have been zapped, then we call the page
> + * fault path to change the mapping to writable.
> + */
> + vcpu->arch.mmu.page_fault(vcpu, cr2, PFERR_WRITE_MASK, true);
I don't see why is this necessary. Just allowing the instruction to
proceed should be enough?
Looks good otherwise.
next prev parent reply other threads:[~2011-08-22 20:02 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-08-16 6:40 [PATCH 01/11] KVM: MMU: avoid pte_list_desc running out in kvm_mmu_pte_write Xiao Guangrong
2011-08-16 6:41 ` [PATCH 02/11] KVM: x86: tag the instructions which are used to write page table Xiao Guangrong
2011-08-22 14:32 ` Marcelo Tosatti
2011-08-22 14:36 ` Avi Kivity
2011-08-16 6:42 ` [PATCH 03/11] KVM: x86: retry non-page-table writing instruction Xiao Guangrong
2011-08-22 19:59 ` Marcelo Tosatti [this message]
2011-08-22 20:21 ` Xiao Guangrong
2011-08-22 20:42 ` Marcelo Tosatti
2011-08-16 6:42 ` [PATCH 04/11] KVM: x86: cleanup port-in/port-out emulated Xiao Guangrong
2011-08-16 6:43 ` [PATCH 05/11] KVM: MMU: do not mark access bit on pte write path Xiao Guangrong
2011-08-16 6:44 ` [PATCH 06/11] KVM: MMU: cleanup FNAME(invlpg) Xiao Guangrong
2011-08-16 6:44 ` [PATCH 07/11] KVM: MMU: fast prefetch spte on invlpg path Xiao Guangrong
2011-08-22 22:28 ` Marcelo Tosatti
2011-08-23 1:50 ` Xiao Guangrong
2011-08-16 6:45 ` [PATCH 08/11] KVM: MMU: remove unnecessary kvm_mmu_free_some_pages Xiao Guangrong
2011-08-16 6:45 ` [PATCH 09/11] KVM: MMU: split kvm_mmu_pte_write function Xiao Guangrong
2011-08-16 6:46 ` [PATCH 10/11] KVM: MMU: fix detecting misaligned accessed Xiao Guangrong
2011-08-16 6:46 ` [PATCH 11/11] KVM: MMU: improve write flooding detected Xiao Guangrong
2011-08-23 8:00 ` Marcelo Tosatti
2011-08-23 10:55 ` Xiao Guangrong
2011-08-23 12:38 ` Marcelo Tosatti
2011-08-23 16:32 ` Xiao Guangrong
2011-08-23 19:09 ` Marcelo Tosatti
2011-08-23 20:16 ` Xiao Guangrong
2011-08-24 20:05 ` Marcelo Tosatti
2011-08-25 2:04 ` Marcelo Tosatti
2011-08-25 4:42 ` Avi Kivity
2011-08-25 13:21 ` Marcelo Tosatti
2011-08-25 14:06 ` Avi Kivity
2011-08-25 14:07 ` Avi Kivity
2011-08-25 7:40 ` Xiao Guangrong
2011-08-25 7:57 ` Xiao Guangrong
2011-08-25 13:47 ` Marcelo Tosatti
2011-08-26 3:18 ` Xiao Guangrong
2011-08-26 10:53 ` Marcelo Tosatti
2011-08-26 14:24 ` Xiao Guangrong
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20110822195929.GA2662@amt.cnet \
--to=mtosatti@redhat.com \
--cc=avi@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=xiaoguangrong@cn.fujitsu.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.