From mboxrd@z Thu Jan 1 00:00:00 1970 From: Keir Fraser Subject: Re: [PATCH] Allow wake up of offline vcpu via nmi-ipi Date: Wed, 18 Jan 2012 09:36:13 +0000 Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: Juergen Gross , xen-devel@lists.xensource.com List-Id: xen-devel@lists.xenproject.org On 18/01/2012 09:31, "Keir Fraser" wrote: > On 18/01/2012 09:07, "Juergen Gross" wrote: > >> On 01/18/2012 09:48 AM, Juergen Gross wrote: >>> On a real machine a cpu disabled via hlt with interrupts disabled can be >>> reactivated via a nmi ipi. Enable the hypervisor to do this for hvm, too. >>> >>> Signed-off-by: juergen.gross@ts.fujitsu.com >>> >>> >>> 1 file changed, 4 insertions(+), 1 deletion(-) >>> xen/arch/x86/hvm/vlapic.c | 5 ++++- >> >> BTW: I was not able to reactivate a vcpu via INIT/SIPI/SIPI sequence. It >> works >> on initial system boot when the target vcpu is activated the first time. If I >> deactivate a vcpu and try to activate it again it will start to run, but it >> is >> not starting at the specified entry point (at least it isn't performing the >> first instruction there). >> Is there some special initialization needed to make this work? Do I have to >> reset >> something on the vcpu before deactivating it? > > No it should just work. Hvmloader wakes and then sleeps every AP, in > hvmloader/smp.c. So even the first INIT-SIPI wakeup of an AP in the guest OS > is not the first, as hvmloader already did it once! So this path should be > working and indeed tested on every HVM guest boot. Bit more info: INIT-SIPI logic is complicated by needing to avoid deadlocks between two VCPUs attempting to pause and reset each other. But the core dispatch logic is in vlapic_init_sipi_action(). You will see that on INIT, we should call vcpu_reset() which will de-initialise and VCPU_down the vcpu. And then on SIPI we call hvm_vcpu_reset_state(), which should reinitialise and wake the vcpu to start running at the specified CS:IP. So the above will be good places for you to add tracing and work out what's going on. :-) -- Keir > -- Keir > >> >> Juergen > >