All of lore.kernel.org
 help / color / mirror / Atom feed
From: Gleb Natapov <gleb@redhat.com>
To: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
Cc: Avi Kivity <avi@redhat.com>,
	Marcelo Tosatti <mtosatti@redhat.com>,
	LKML <linux-kernel@vger.kernel.org>, KVM <kvm@vger.kernel.org>
Subject: Re: [PATCH v2 5/7] KVM: handle more completed apfs if possible
Date: Mon, 1 Nov 2010 11:24:57 +0200	[thread overview]
Message-ID: <20101101092457.GY26191@redhat.com> (raw)
In-Reply-To: <4CCE822B.1070909@cn.fujitsu.com>

On Mon, Nov 01, 2010 at 05:02:35PM +0800, Xiao Guangrong wrote:
> If it's no need to inject async #PF to PV guest we can handle
> more completed apfs at one time, so we can retry guest #PF
> as early as possible
> 
> Signed-off-by: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
> ---
>  arch/x86/include/asm/kvm_host.h |    3 ++-
>  arch/x86/kvm/x86.c              |    8 ++++++--
>  virt/kvm/async_pf.c             |   28 ++++++++++++++++------------
>  3 files changed, 24 insertions(+), 15 deletions(-)
> 
> diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
> index 1be0058..c95b3ff 100644
> --- a/arch/x86/include/asm/kvm_host.h
> +++ b/arch/x86/include/asm/kvm_host.h
> @@ -818,7 +818,8 @@ bool kvm_is_linear_rip(struct kvm_vcpu *vcpu, unsigned long linear_rip);
>  
>  void kvm_arch_async_page_not_present(struct kvm_vcpu *vcpu,
>  				     struct kvm_async_pf *work);
> -void kvm_arch_async_page_present(struct kvm_vcpu *vcpu,
> +/* return true if we can handle more completed apfs, false otherwise */
> +bool kvm_arch_async_page_present(struct kvm_vcpu *vcpu,
>  				 struct kvm_async_pf *work);
>  void kvm_arch_async_page_ready(struct kvm_vcpu *vcpu,
>  			       struct kvm_async_pf *work);
> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> index 4da8485..189664a 100644
> --- a/arch/x86/kvm/x86.c
> +++ b/arch/x86/kvm/x86.c
> @@ -6265,7 +6265,7 @@ void kvm_arch_async_page_not_present(struct kvm_vcpu *vcpu,
>  	}
>  }
>  
> -void kvm_arch_async_page_present(struct kvm_vcpu *vcpu,
> +bool kvm_arch_async_page_present(struct kvm_vcpu *vcpu,
>  				 struct kvm_async_pf *work)
>  {
>  	trace_kvm_async_pf_ready(work->arch.token, work->gva);
> @@ -6274,13 +6274,17 @@ void kvm_arch_async_page_present(struct kvm_vcpu *vcpu,
>  	else
>  		kvm_del_async_pf_gfn(vcpu, work->arch.gfn);
>  
> +	vcpu->arch.apf.halted = false;
> +
>  	if ((vcpu->arch.apf.msr_val & KVM_ASYNC_PF_ENABLED) &&
>  	    !apf_put_user(vcpu, KVM_PV_REASON_PAGE_READY)) {
>  		vcpu->arch.fault.error_code = 0;
>  		vcpu->arch.fault.address = work->arch.token;
>  		kvm_inject_page_fault(vcpu);
> +		return false;
>  	}
> -	vcpu->arch.apf.halted = false;
> +
> +	return true;
>  }
>  
>  bool kvm_arch_can_inject_async_page_present(struct kvm_vcpu *vcpu)
> diff --git a/virt/kvm/async_pf.c b/virt/kvm/async_pf.c
> index 60df9e0..d57ec92 100644
> --- a/virt/kvm/async_pf.c
> +++ b/virt/kvm/async_pf.c
> @@ -123,25 +123,29 @@ void kvm_clear_async_pf_completion_queue(struct kvm_vcpu *vcpu)
>  void kvm_check_async_pf_completion(struct kvm_vcpu *vcpu)
>  {
>  	struct kvm_async_pf *work;
> +	bool ret;
>  
>  	if (list_empty_careful(&vcpu->async_pf.done) ||
>  	    !kvm_arch_can_inject_async_page_present(vcpu))
>  		return;
>  
> -	spin_lock(&vcpu->async_pf.lock);
> -	work = list_first_entry(&vcpu->async_pf.done, typeof(*work), link);
> -	list_del(&work->link);
> -	spin_unlock(&vcpu->async_pf.lock);
> +	do {
> +		spin_lock(&vcpu->async_pf.lock);
> +		work = list_first_entry(&vcpu->async_pf.done, typeof(*work),
> +							link);
> +		list_del(&work->link);
> +		spin_unlock(&vcpu->async_pf.lock);
>  
> -	if (work->page)
> -		kvm_arch_async_page_ready(vcpu, work);
> -	kvm_arch_async_page_present(vcpu, work);
> +		if (work->page)
> +			kvm_arch_async_page_ready(vcpu, work);
> +		ret = kvm_arch_async_page_present(vcpu, work);
>  
> -	list_del(&work->queue);
> -	vcpu->async_pf.queued--;
> -	if (work->page)
> -		put_page(work->page);
> -	kmem_cache_free(async_pf_cache, work);
> +		list_del(&work->queue);
> +		vcpu->async_pf.queued--;
> +		if (work->page)
> +			put_page(work->page);
> +		kmem_cache_free(async_pf_cache, work);
> +	} while (ret && !list_empty_careful(&vcpu->async_pf.done));
>  }
>  
No need to change kvm_arch_async_page_present() to return anything. You
can do while loop like this:

while (!list_empty_careful(&vcpu->async_pf.done) &&
       kvm_arch_can_inject_async_page_present(vcpu)) {
}

If kvm_arch_async_page_present() call injects exception
kvm_arch_can_inject_async_page_present() will return false on next
iteration.

--
			Gleb.

  reply	other threads:[~2010-11-01  9:25 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-11-01  8:58 [PATCH v2 1/7] KVM: fix tracing kvm_try_async_get_page Xiao Guangrong
2010-11-01  8:59 ` [PATCH v2 2/7] KVM: cleanup aysnc_pf tracepoints Xiao Guangrong
2010-11-01  9:00 ` [PATCH v2 3/7] KVM: fix searching async gfn in kvm_async_pf_gfn_slot Xiao Guangrong
2010-11-01  9:01 ` [PATCH v2 4/7] KVM: avoid unnecessary wait for a async pf Xiao Guangrong
2010-11-01  9:25   ` Gleb Natapov
2010-11-01  9:02 ` [PATCH v2 5/7] KVM: handle more completed apfs if possible Xiao Guangrong
2010-11-01  9:24   ` Gleb Natapov [this message]
2010-11-01  9:34     ` Xiao Guangrong
2010-11-02  9:35     ` [PATCH v3 " Xiao Guangrong
2010-11-02 12:38       ` Gleb Natapov
2010-11-01  9:03 ` [RFC PATCH v2 6/7] KVM: fix the race while wakeup all pv guest Xiao Guangrong
2010-11-01 12:58   ` Gleb Natapov
2010-11-01  9:05 ` [RFC PATCH v2 7/7] KVM: KVM: don't break vcpu 'halt' state due to apfs Xiao Guangrong
2010-11-01 12:55   ` Gleb Natapov
2010-11-02  2:30     ` Xiao Guangrong
2010-11-02  6:56       ` Gleb Natapov
2010-11-02  7:31         ` Xiao Guangrong
2010-11-02  7:45           ` Gleb Natapov
2010-11-02  9:09             ` Xiao Guangrong
2010-11-02  9:14               ` Gleb Natapov
2010-11-02  9:30                 ` Xiao Guangrong
2010-11-02 12:39                   ` Gleb Natapov
2010-11-03  9:47     ` Xiao Guangrong
2010-11-03  9:45       ` Gleb Natapov
2010-11-03 13:43         ` Marcelo Tosatti
2010-11-01 13:09 ` [PATCH v2 1/7] KVM: fix tracing kvm_try_async_get_page Gleb Natapov

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=20101101092457.GY26191@redhat.com \
    --to=gleb@redhat.com \
    --cc=avi@redhat.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mtosatti@redhat.com \
    --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.