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

Re: [Xen-devel] [PATCH] Allow wake up of offline vcpu via nmi-ipi

  • To: Juergen Gross <juergen.gross@xxxxxxxxxxxxxx>, <xen-devel@xxxxxxxxxxxxxxxxxxx>
  • From: Keir Fraser <keir.xen@xxxxxxxxx>
  • Date: Wed, 18 Jan 2012 09:36:13 +0000
  • Delivery-date: Wed, 18 Jan 2012 09:37:07 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xensource.com>
  • Thread-index: AczVw/Q+Cjbk8B14+Uy6l0c+PxeTZwAAKnhc
  • Thread-topic: [Xen-devel] [PATCH] Allow wake up of offline vcpu via nmi-ipi

On 18/01/2012 09:31, "Keir Fraser" <keir.xen@xxxxxxxxx> wrote:

> On 18/01/2012 09:07, "Juergen Gross" <juergen.gross@xxxxxxxxxxxxxx> 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@xxxxxxxxxxxxxx
>>> 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

Xen-devel mailing list



Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.