Re: [PATCH] KVM: Get rid of KVM_REQ_KICK

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 05/04/2010 07:31 PM, Marcelo Tosatti wrote:
On Mon, May 03, 2010 at 05:19:08PM +0300, Avi Kivity wrote:
KVM_REQ_KICK poisons vcpu->requests by having a bit set during normal
operation.  This causes the fast path check for a clear vcpu->requests
to fail all the time, triggering tons of atomic operations.
Avi,

Do you have numbers?

Forgot to post, was about 100 cycles (I expected more, all those atomics really show up in the profile).

Fix by replacing KVM_REQ_KICK with a vcpu->guest_mode atomic.

Signed-off-by: Avi Kivity<avi@xxxxxxxxxx>
---
  arch/x86/kvm/x86.c       |   17 ++++++++++-------
  include/linux/kvm_host.h |    1 +
  2 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 6b2ce1d..307094a 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -4499,13 +4499,15 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu)
  	if (vcpu->fpu_active)
  		kvm_load_guest_fpu(vcpu);

-	local_irq_disable();
+	atomic_set(&vcpu->guest_mode, 1);
+	smp_wmb();
IPI can trigger here?

It can...

-	clear_bit(KVM_REQ_KICK,&vcpu->requests);
-	smp_mb__after_clear_bit();
+	local_irq_disable();

-	if (vcpu->requests || need_resched() || signal_pending(current)) {
-		set_bit(KVM_REQ_KICK,&vcpu->requests);
+	if (!atomic_read(&vcpu->guest_mode) || vcpu->requests
+	    || need_resched() || signal_pending(current)) {

... and we'll detect that guest_mode was cleared and go back.

+		atomic_set(&vcpu->guest_mode, 0);
+		smp_wmb();
  		local_irq_enable();
  		preempt_enable();
  		r = 1;
@@ -4550,7 +4552,8 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu)
  	if (hw_breakpoint_active())
  		hw_breakpoint_restore();

-	set_bit(KVM_REQ_KICK,&vcpu->requests);
+	atomic_set(&vcpu->guest_mode, 0);
+	smp_wmb();
  	local_irq_enable();

  	++vcpu->stat.exits;
@@ -5470,7 +5473,7 @@ void kvm_vcpu_kick(struct kvm_vcpu *vcpu)

  	me = get_cpu();
  	if (cpu != me&&  (unsigned)cpu<  nr_cpu_ids&&  cpu_online(cpu))
-		if (!test_and_set_bit(KVM_REQ_KICK,&vcpu->requests))
+		if (atomic_xchg(&vcpu->guest_mode, 0))
  			smp_send_reschedule(cpu);
  	put_cpu();

The atomic_xchg() does the trick.

--
error compiling committee.c: too many arguments to function

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux