From: "Radim Krčmář" <rkrcmar@redhat.com>
To: Liran Alon <LIRAN.ALON@ORACLE.COM>
Cc: Paolo Bonzini <pbonzini@redhat.com>,
kvm@vger.kernel.org, jmattson@google.com, wanpeng.li@hotmail.com,
idan.brown@ORACLE.COM,
Krish Sadhukhan <krish.sadhukhan@ORACLE.COM>
Subject: Re: [PATCH] KVM: nVMX: Fix races when sending nested PI while dest enters/leaves L2
Date: Thu, 16 Nov 2017 18:37:15 +0100 [thread overview]
Message-ID: <20171116173714.GC20438@flask> (raw)
In-Reply-To: <5A062A2C.9040102@ORACLE.COM>
2017-11-11 00:37+0200, Liran Alon:
> On 10/11/17 23:37, Paolo Bonzini wrote:
> > On 10/11/2017 19:06, Radim Krčmář wrote:
> > > > /* the PIR and ON have been set by L1. */
> > > > if (!kvm_vcpu_trigger_posted_interrupt(vcpu, true)) {
> > > This would still fail on the exiting case.
> > >
> > > If one VCPU was just after a VM exit, then the sender would see it
> > > IN_GUEST_MODE, send the posted notification and return true, but the
> > > notification would do nothing
> >
> > It would cause *something*---a vmexit because the vector doesn't match
> > the L1 posted interrupt. Then smp_kvm_posted_intr_nested_ipi would be
> > invoked from vmx_handle_external_intr.
> >
> > Could we detect the vector in vmx_handle_external_intr and set
> > pi_pending+KVM_REQ_EVENT? Or invoke a function in KVM from
> > smp_kvm_posted_intr_nested_ipi? Or would both be insane?...
> >
>
> I have actually thought about it before writing this patch. But have found
> an issue with this approach (which doesn't exist in this v1 patch and in
> Radim's suggestion for v2):
>
> Consider the case sender sees vcpu->mode==IN_GUEST_MODE and before it sends
> the physical IPI, dest CPU exits from guest and continues in L0 all the way
> until vcpu_enter_guest() and pass the part it checks for KVM_REQ_EVENT but
> before it disables interrupts. Then sender sends the physical IPI which is
> received in host-context and therefore runs smp_kvm_posted_intr_nested_ipi()
> which sets KVM_REQ_EVENT & pi_pending=true. But without Radim's suggestion
> of checking pi_pending after interrupts disabled, this is too late as dest
> CPU will not check these again until next exit from L2 guest.
>
> I hope I didn't misunderstand something here :)
kvm_request_pending() would notice KVM_REQ_EVENT and forces the VM entry
to restart, so that wouldn't be a problem.
I just realized another complication, though: when the sender looks at
IN_GUEST_MODE and before it sends IPI, the destination can reschedule to
a different VCPU => the IPI handler cannot use the 'current VCPU' and we
have to build a list of VCPUs potentially awaiting notification vector
for every PCPU, which makes it strictly worse than just looking directly
at the ON bit, IMO.
next prev parent reply other threads:[~2017-11-16 17:37 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-11-09 18:27 [PATCH] KVM: nVMX: Fix races when sending nested PI while dest enters/leaves L2 Liran Alon
2017-11-10 17:06 ` Paolo Bonzini
2017-11-10 18:06 ` Radim Krčmář
2017-11-10 20:40 ` Liran Alon
2017-11-10 21:24 ` Radim Krčmář
2017-11-10 21:30 ` Paolo Bonzini
2017-11-10 21:37 ` Paolo Bonzini
2017-11-10 22:30 ` Radim Krčmář
2017-11-10 22:47 ` Liran Alon
2017-11-10 22:51 ` Paolo Bonzini
2017-11-10 22:59 ` Liran Alon
2017-11-10 22:37 ` Liran Alon
2017-11-16 17:37 ` Radim Krčmář [this message]
2017-11-16 18:36 ` Liran Alon
2017-11-16 19:47 ` Paolo Bonzini
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=20171116173714.GC20438@flask \
--to=rkrcmar@redhat.com \
--cc=LIRAN.ALON@ORACLE.COM \
--cc=idan.brown@ORACLE.COM \
--cc=jmattson@google.com \
--cc=krish.sadhukhan@ORACLE.COM \
--cc=kvm@vger.kernel.org \
--cc=pbonzini@redhat.com \
--cc=wanpeng.li@hotmail.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.