Skip to content

Commit 9242b5b

Browse files
whitebrandybonzini
authored andcommitted
KVM: x86: Check for nested events if there is an injectable interrupt
With commit b6b8a14 that introduced vmx_check_nested_events, checks for injectable interrupts happen at different points in time for L1 and L2 that could potentially cause a race. The regression occurs because KVM_REQ_EVENT is always set when nested_run_pending is set even if there's no pending interrupt. Consequently, there could be a small window when check_nested_events returns without exiting to L1, but an interrupt comes through soon after and it incorrectly, gets injected to L2 by inject_pending_event Fix this by adding a call to check for nested events too when a check for injectable interrupt returns true Signed-off-by: Bandan Das <[email protected]> Signed-off-by: Paolo Bonzini <[email protected]>
1 parent cd3de83 commit 9242b5b

File tree

1 file changed

+12
-0
lines changed

1 file changed

+12
-0
lines changed

arch/x86/kvm/x86.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5887,6 +5887,18 @@ static int inject_pending_event(struct kvm_vcpu *vcpu, bool req_int_win)
58875887
kvm_x86_ops->set_nmi(vcpu);
58885888
}
58895889
} else if (kvm_cpu_has_injectable_intr(vcpu)) {
5890+
/*
5891+
* Because interrupts can be injected asynchronously, we are
5892+
* calling check_nested_events again here to avoid a race condition.
5893+
* See https://lkml.org/lkml/2014/7/2/60 for discussion about this
5894+
* proposal and current concerns. Perhaps we should be setting
5895+
* KVM_REQ_EVENT only on certain events and not unconditionally?
5896+
*/
5897+
if (is_guest_mode(vcpu) && kvm_x86_ops->check_nested_events) {
5898+
r = kvm_x86_ops->check_nested_events(vcpu, req_int_win);
5899+
if (r != 0)
5900+
return r;
5901+
}
58905902
if (kvm_x86_ops->interrupt_allowed(vcpu)) {
58915903
kvm_queue_interrupt(vcpu, kvm_cpu_get_interrupt(vcpu),
58925904
false);

0 commit comments

Comments
 (0)