|
@@ -233,19 +233,6 @@ static void kvm_ioapic_inject_all(struct kvm_ioapic *ioapic, unsigned long irr)
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
-static void update_handled_vectors(struct kvm_ioapic *ioapic)
|
|
|
|
-{
|
|
|
|
- DECLARE_BITMAP(handled_vectors, 256);
|
|
|
|
- int i;
|
|
|
|
-
|
|
|
|
- memset(handled_vectors, 0, sizeof(handled_vectors));
|
|
|
|
- for (i = 0; i < IOAPIC_NUM_PINS; ++i)
|
|
|
|
- __set_bit(ioapic->redirtbl[i].fields.vector, handled_vectors);
|
|
|
|
- memcpy(ioapic->handled_vectors, handled_vectors,
|
|
|
|
- sizeof(handled_vectors));
|
|
|
|
- smp_wmb();
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
void kvm_ioapic_scan_entry(struct kvm_vcpu *vcpu, u64 *eoi_exit_bitmap)
|
|
void kvm_ioapic_scan_entry(struct kvm_vcpu *vcpu, u64 *eoi_exit_bitmap)
|
|
{
|
|
{
|
|
struct kvm_ioapic *ioapic = vcpu->kvm->arch.vioapic;
|
|
struct kvm_ioapic *ioapic = vcpu->kvm->arch.vioapic;
|
|
@@ -310,7 +297,6 @@ static void ioapic_write_indirect(struct kvm_ioapic *ioapic, u32 val)
|
|
e->bits |= (u32) val;
|
|
e->bits |= (u32) val;
|
|
e->fields.remote_irr = 0;
|
|
e->fields.remote_irr = 0;
|
|
}
|
|
}
|
|
- update_handled_vectors(ioapic);
|
|
|
|
mask_after = e->fields.mask;
|
|
mask_after = e->fields.mask;
|
|
if (mask_before != mask_after)
|
|
if (mask_before != mask_after)
|
|
kvm_fire_mask_notifiers(ioapic->kvm, KVM_IRQCHIP_IOAPIC, index, mask_after);
|
|
kvm_fire_mask_notifiers(ioapic->kvm, KVM_IRQCHIP_IOAPIC, index, mask_after);
|
|
@@ -594,7 +580,6 @@ static void kvm_ioapic_reset(struct kvm_ioapic *ioapic)
|
|
ioapic->id = 0;
|
|
ioapic->id = 0;
|
|
memset(ioapic->irq_eoi, 0x00, IOAPIC_NUM_PINS);
|
|
memset(ioapic->irq_eoi, 0x00, IOAPIC_NUM_PINS);
|
|
rtc_irq_eoi_tracking_reset(ioapic);
|
|
rtc_irq_eoi_tracking_reset(ioapic);
|
|
- update_handled_vectors(ioapic);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
static const struct kvm_io_device_ops ioapic_mmio_ops = {
|
|
static const struct kvm_io_device_ops ioapic_mmio_ops = {
|
|
@@ -623,8 +608,10 @@ int kvm_ioapic_init(struct kvm *kvm)
|
|
if (ret < 0) {
|
|
if (ret < 0) {
|
|
kvm->arch.vioapic = NULL;
|
|
kvm->arch.vioapic = NULL;
|
|
kfree(ioapic);
|
|
kfree(ioapic);
|
|
|
|
+ return ret;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ kvm_vcpu_request_scan_ioapic(kvm);
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -661,7 +648,6 @@ int kvm_set_ioapic(struct kvm *kvm, struct kvm_ioapic_state *state)
|
|
memcpy(ioapic, state, sizeof(struct kvm_ioapic_state));
|
|
memcpy(ioapic, state, sizeof(struct kvm_ioapic_state));
|
|
ioapic->irr = 0;
|
|
ioapic->irr = 0;
|
|
ioapic->irr_delivered = 0;
|
|
ioapic->irr_delivered = 0;
|
|
- update_handled_vectors(ioapic);
|
|
|
|
kvm_vcpu_request_scan_ioapic(kvm);
|
|
kvm_vcpu_request_scan_ioapic(kvm);
|
|
kvm_ioapic_inject_all(ioapic, state->irr);
|
|
kvm_ioapic_inject_all(ioapic, state->irr);
|
|
spin_unlock(&ioapic->lock);
|
|
spin_unlock(&ioapic->lock);
|