From mboxrd@z Thu Jan 1 00:00:00 1970 From: Hollis Blanchard Date: Mon, 31 Mar 2008 16:35:20 +0000 Subject: Re: [kvm-ppc-devel] [PATCH 2 of 2] Add PowerPC KVM guest Message-Id: <1206981320.5919.12.camel@basalt> List-Id: References: <1206741014.5432.36.camel@basalt> In-Reply-To: <1206741014.5432.36.camel@basalt> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: kvm-ppc@vger.kernel.org On Mon, 2008-03-31 at 07:57 -0500, Jerone Young wrote: > # HG changeset patch > # User Jerone Young > # Date 1206968186 18000 > # Node ID 529f5a653d1e86b81270eeb7598dafcdba9abc1d > # Parent 15675e59e019c4800a834ae79090d92b07f1d0ce > Add PowerPC KVM guest wait handling support > > This patch handles a guest that is in a wait state. This ensures that > the guest is not allways eating up 100% cpu when it is idle. > > Signed-off-by: Jerone Young > > diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c > --- a/arch/powerpc/kvm/powerpc.c > +++ b/arch/powerpc/kvm/powerpc.c > @@ -214,6 +214,10 @@ static void kvmppc_deliver_interrupt(str > vcpu->arch.tsr |= TSR_DIS; > break; > } > + > + /* clear guest wait state */ > + if (vcpu->arch.msr & MSR_WE) > + vcpu->arch.msr &= ~MSR_WE; > > vcpu->arch.srr0 = vcpu->arch.pc; > vcpu->arch.srr1 = vcpu->arch.msr; No need to modify msr: we're about to blow it away anyways. In fact, I don't think you even need to mask off WE at all. Leave it in srr1, and the CPU will automatically go back to sleep when it executes rfi. This probably explains why many existing power_save() implementations never return at all... > @@ -452,6 +456,20 @@ int kvmppc_handle_exit(struct kvm_run *r > local_irq_disable(); > > kvmppc_check_and_deliver_interrupts(vcpu); > + > + /* handle guest vcpu that is in wait state */ > + if (vcpu->arch.msr & MSR_WE) { > + DECLARE_WAITQUEUE(wait, current); > + add_wait_queue(&vcpu->wq, &wait); > + > + while (!signal_pending(current)) { > + set_current_state(TASK_INTERRUPTIBLE); > + schedule(); > + } > + > + set_current_state(TASK_RUNNING); > + remove_wait_queue(&vcpu->wq, &wait); > + } > > /* Do some exit accounting. */ > vcpu->stat.exits++; We already know exactly when we're setting MSR_WE, so there is no need to poll for it on every exit. You should call kvm_vcpu_block() instead of duplicating it. -- Hollis Blanchard IBM Linux Technology Center ------------------------------------------------------------------------- Check out the new SourceForge.net Marketplace. It's the best place to buy or sell services for just about anything Open Source. http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace _______________________________________________ kvm-ppc-devel mailing list kvm-ppc-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/kvm-ppc-devel