From: Jan Kiszka <jan.kiszka@siemens.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: Gleb Natapov <gleb@redhat.com>,
Marcelo Tosatti <mtosatti@redhat.com>, kvm <kvm@vger.kernel.org>
Subject: Re: KVM: x86: Racy mp_state manipulations
Date: Mon, 04 Mar 2013 15:28:44 +0100 [thread overview]
Message-ID: <5134AF9C.9070102@siemens.com> (raw)
In-Reply-To: <5134ABDD.4090908@redhat.com>
On 2013-03-04 15:12, Paolo Bonzini wrote:
> Il 03/03/2013 17:48, Jan Kiszka ha scritto:
>> Hi all,
>>
>> KVM's mp_state on x86 is usually manipulated over the context of the
>> VCPU. Therefore, no locking is required. There are unfortunately two
>> exceptions, and one of them is definitely broken: INIT and SIPI delivery.
>>
>> The lapic may set mp_state over the context of the sending VCPU. For
>> SIPI, it first checks if the mp_state is INIT_RECEIVED before updating
>> it to SIPI_RECEIVED. We can only race here with user space setting the
>> state in parallel, I suppose. Probably harmless in practice.
>
> Still it would be better to add an smp_wmb/smp_rmb pair between accesses
> of mp_state and sipi_vector.
Do we need a mb between sipi_vector assignment and kvm_make_request (see
my patch to fix this issue)?
>
> Also, Io
>> What is critical is the update on INIT. That signal is asynchronous to
>> the target VCPU state. And we can loose it:
>>
>> vcpu 1 vcpu 2
>> ------ ------
>> hlt;
>> vmexit
>> __apic_accept_irq(APIC_DM_INIT)
>> mp_state = KVM_MP_STATE_INIT_RECEIVED
>> mp_state = KVM_MP_STATE_HALTED
>>
>> And there it goes, our INIT state. I've triggered this under heavy INIT
>> load and my nVMX patch for processing it while in VMXON.
>>
>> I'm currently considering options to fix this:
>>
>> - through a lock at mp_state manipulations, check under the lock that
>> we don't perform invalid state transitions (e.g. INIT->HLT)
>> - signal the INIT via some KVM_REQ_INIT to the target VCPU, fully
>> localizing mp_state updates, the same could be done with SIPI, just
>> to play safe
>>
>> I'm leaning toward the latter ATM, Any thoughts or other idea?
>
> The latter makes sense since it's not a fast path, but the only
> transition that is acceptable to KVM_MP_STATE_HALTED is from
> KVM_MP_STATE_RUNNABLE:
>
> from \ to RUNNABLE UNINIT INIT HALTED SIPI
> RUNNABLE n/a yes yes yes NO
> UNINIT NO n/a yes NO NO
> INIT NO yes n/a NO yes
> HALTED yes yes yes n/a NO
> SIPI yes yes yes NO n/a
>
> so for this particular bug it should also work to use a cmpxchg when
> setting KVM_MP_STATE_HALTED. Same for INIT->SIPI, since writes to
> sipi_vector are harmless.
OK, but I already went for request bits. :)
>
> BTW, what happens when you send an INIT IPI to the bootstrap processor?
> This may be interesting if we want to emulate soft resets correctly in
> QEMU; KVM makes it go to wait-for-SIPI state if I read the code
> correctly, but that is wrong.
Where is this restriction specified? How do you reset the BP without
resetting the while system then?
Jan
--
Siemens AG, Corporate Technology, CT RTC ITP SDP-DE
Corporate Competence Center Embedded Linux
next prev parent reply other threads:[~2013-03-04 14:28 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-03-03 16:48 KVM: x86: Racy mp_state manipulations Jan Kiszka
2013-03-04 14:12 ` Paolo Bonzini
2013-03-04 14:28 ` Jan Kiszka [this message]
2013-03-04 15:08 ` Paolo Bonzini
2013-03-04 15:19 ` Jan Kiszka
2013-03-05 7:28 ` Gleb Natapov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5134AF9C.9070102@siemens.com \
--to=jan.kiszka@siemens.com \
--cc=gleb@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=mtosatti@redhat.com \
--cc=pbonzini@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.