diff options
Diffstat (limited to 'virt/kvm')
-rw-r--r-- | virt/kvm/ioapic.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/virt/kvm/ioapic.c b/virt/kvm/ioapic.c index 270f7fe73f39..d4b601547f1f 100644 --- a/virt/kvm/ioapic.c +++ b/virt/kvm/ioapic.c | |||
@@ -212,6 +212,18 @@ out: | |||
212 | return ret; | 212 | return ret; |
213 | } | 213 | } |
214 | 214 | ||
215 | static void kvm_ioapic_inject_all(struct kvm_ioapic *ioapic, unsigned long irr) | ||
216 | { | ||
217 | u32 idx; | ||
218 | |||
219 | rtc_irq_eoi_tracking_reset(ioapic); | ||
220 | for_each_set_bit(idx, &irr, IOAPIC_NUM_PINS) | ||
221 | ioapic_set_irq(ioapic, idx, 1, true); | ||
222 | |||
223 | kvm_rtc_eoi_tracking_restore_all(ioapic); | ||
224 | } | ||
225 | |||
226 | |||
215 | static void update_handled_vectors(struct kvm_ioapic *ioapic) | 227 | static void update_handled_vectors(struct kvm_ioapic *ioapic) |
216 | { | 228 | { |
217 | DECLARE_BITMAP(handled_vectors, 256); | 229 | DECLARE_BITMAP(handled_vectors, 256); |
@@ -612,9 +624,10 @@ int kvm_set_ioapic(struct kvm *kvm, struct kvm_ioapic_state *state) | |||
612 | 624 | ||
613 | spin_lock(&ioapic->lock); | 625 | spin_lock(&ioapic->lock); |
614 | memcpy(ioapic, state, sizeof(struct kvm_ioapic_state)); | 626 | memcpy(ioapic, state, sizeof(struct kvm_ioapic_state)); |
627 | ioapic->irr = 0; | ||
615 | update_handled_vectors(ioapic); | 628 | update_handled_vectors(ioapic); |
616 | kvm_vcpu_request_scan_ioapic(kvm); | 629 | kvm_vcpu_request_scan_ioapic(kvm); |
617 | kvm_rtc_eoi_tracking_restore_all(ioapic); | 630 | kvm_ioapic_inject_all(ioapic, state->irr); |
618 | spin_unlock(&ioapic->lock); | 631 | spin_unlock(&ioapic->lock); |
619 | return 0; | 632 | return 0; |
620 | } | 633 | } |