Fix guest eating 100% cpu when guest is idle on PowerPC
Subsystems (4)
PATCH v2 1/1 Fix guest eating 100% cpu when guest is idle on PowerPC
* This update consolidates patches, adds more explicit comments, and add wait check when rfi instruction is emulated.
This set of patches fixes 100% CPU usage when a guest is idle on PowerPC. Idle CPU usage is now at ~15-16% CPU time. An improvment.
4 files changed, 91 insertions(+), 4 deletions(-) arch/powerpc/kvm/emulate.c | 14 +++++++ arch/powerpc/kvm/powerpc.c | 12 ++++-- arch/powerpc/platforms/44x/Makefile | 2 - arch/powerpc/platforms/44x/idle.c | 67 +++++++++++++++++++++++++++++++++++
-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference Don't miss this year's exciting event. There's still time to save $100. Use priority code J8TL2D2.
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
PATCH 1/1 Add idle wait support for 44x platforms
2 files changed, 68 insertions(+), 1 deletion(-)
arch/powerpc/platforms/44x/Makefile | 2 -arch/powerpc/platforms/44x/idle.c | 67 +++++++++++++++++++++++++++++++++++
This patch has been accepted upstream and will be in 2.6.26. So it will eventually need to be removed when we move to 2.6.26rc.
This patch adds the ability for the CPU to go into wait state while in cpu_idle loop. This helps virtulization solutions know when the guest Linux kernel is in an idle state. There are two ways to do it.
Command line options:
idle=spin <-- CPU will spin
By default will go into wait mode.
arch/powerpc/platforms/44x/Makefile +1 -1
@@ -1,4 +1,4 @@ obj-$(CONFIG_44x) := misc_44x.o -obj-$(CONFIG_44x) := misc_44x.o +obj-$(CONFIG_44x) := misc_44x.o idle.o obj-$(CONFIG_EBONY) += ebony.o obj-$(CONFIG_TAISHAN) += taishan.o obj-$(CONFIG_BAMBOO) += bamboo.o
arch/powerpc/platforms/44x/idle.c new file +67 -0
67 lines not on this page · raw message
-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference Don't miss this year's exciting event. There's still time to save $100. Use priority code J8TL2D2.
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
PATCH 1/1 Add PowerPC KVM guest wait handling support
In reply to Jerone Young2 files changed, 23 insertions(+), 3 deletions(-) arch/powerpc/kvm/emulate.c | 14 ++++++++++++++ arch/powerpc/kvm/powerpc.c | 12 +++++++++---
This patch handles a guest that is in a wait state & wake up guest that end up being recheduled and go to sleep. This ensures that the guest is not allways eating up 100% cpu when it is idle.
arch/powerpc/kvm/emulate.c +14 -0
@@ -235,6 +235,13 @@ int kvmppc_emulate_instruction(struct kvcase 50 :/* rfi */ kvmppc_emul_rfi (vcpu); advance =0 ; + +/* Handle guest vcpu that is in wait state. +* This will implicitly wake up when it is ready. +*/ +if (vcpu->arch.msr &MSR_WE ) { +kvm_vcpu_block (vcpu); + }break ;default :
@@ -265,6 +272,13 @@ int kvmppc_emulate_instruction(struct kvcase 146 :/* mtmsr */ rs =get_rs (inst);kvmppc_set_msr (vcpu, vcpu->arch.gpr[rs]); + +/* Handle guest vcpu that is in wait state +* This will implicitly wake up when it is ready. +*/ +if (vcpu->arch.msr &MSR_WE ) { +kvm_vcpu_block (vcpu); + }break ;case 163 :/* wrteei */
arch/powerpc/kvm/powerpc.c +9 -3
@@ -36,13 +36,12 @@ gfn_t unalias_gfn(struct kvm *kvm, gfn_tint kvm_cpu_has_interrupt (struct kvm_vcpu *v) { -/* XXX implement me */ -return 0 ; +return !!(v->arch.pending_exceptions); }int kvm_arch_vcpu_runnable (struct kvm_vcpu *v) { -return 1 ; +return !(v->arch.msr &MSR_WE ); }
@@ -213,6 +212,9 @@ static void kvmppc_decrementer_func(unsi {struct kvm_vcpu *vcpu = (struct kvm_vcpu *)data; +if (waitqueue_active (&vcpu->wq)) +wake_up_interruptible (&vcpu->wq); +kvmppc_queue_exception (vcpu,BOOKE_INTERRUPT_DECREMENTER ); }
@@ -339,6 +341,8 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vint r;sigset_t sigsaved; +vcpu_load (vcpu); +if (vcpu->sigset_active)sigprocmask (SIG_SETMASK , &vcpu->sigset, &sigsaved);
@@ -362,6 +366,8 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vif (vcpu->sigset_active)sigprocmask (SIG_SETMASK , &sigsaved,NULL ); + +vcpu_put (vcpu);return r; }
-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference Don't miss this year's exciting event. There's still time to save $100. Use priority code J8TL2D2.
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone