|
@@ -9,12 +9,16 @@ static int __kvm_timer_fn(struct kvm_vcpu *vcpu, struct kvm_timer *ktimer)
|
|
|
int restart_timer = 0;
|
|
|
wait_queue_head_t *q = &vcpu->wq;
|
|
|
|
|
|
- /* FIXME: this code should not know anything about vcpus */
|
|
|
- if (!atomic_inc_and_test(&ktimer->pending))
|
|
|
- set_bit(KVM_REQ_PENDING_TIMER, &vcpu->requests);
|
|
|
-
|
|
|
- if (!ktimer->reinject)
|
|
|
- atomic_set(&ktimer->pending, 1);
|
|
|
+ /*
|
|
|
+ * There is a race window between reading and incrementing, but we do
|
|
|
+ * not care about potentially loosing timer events in the !reinject
|
|
|
+ * case anyway.
|
|
|
+ */
|
|
|
+ if (ktimer->reinject || !atomic_read(&ktimer->pending)) {
|
|
|
+ /* FIXME: this code should not know anything about vcpus */
|
|
|
+ if (!atomic_inc_and_test(&ktimer->pending))
|
|
|
+ set_bit(KVM_REQ_PENDING_TIMER, &vcpu->requests);
|
|
|
+ }
|
|
|
|
|
|
if (waitqueue_active(q))
|
|
|
wake_up_interruptible(q);
|