aboutsummaryrefslogtreecommitdiffstats
path: root/virt/kvm
diff options
context:
space:
mode:
Diffstat (limited to 'virt/kvm')
-rw-r--r--virt/kvm/ioapic.c15
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
215static 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
215static void update_handled_vectors(struct kvm_ioapic *ioapic) 227static 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}