diff options
Diffstat (limited to 'virt/kvm/irq_comm.c')
| -rw-r--r-- | virt/kvm/irq_comm.c | 17 | 
1 files changed, 14 insertions, 3 deletions
diff --git a/virt/kvm/irq_comm.c b/virt/kvm/irq_comm.c index 83402d74a76..2eb58af7ee9 100644 --- a/virt/kvm/irq_comm.c +++ b/virt/kvm/irq_comm.c @@ -68,8 +68,13 @@ int kvm_irq_delivery_to_apic(struct kvm *kvm, struct kvm_lapic *src,  	struct kvm_vcpu *vcpu, *lowest = NULL;  	if (irq->dest_mode == 0 && irq->dest_id == 0xff && -			kvm_is_dm_lowest_prio(irq)) +			kvm_is_dm_lowest_prio(irq)) {  		printk(KERN_INFO "kvm: apic: phys broadcast and lowest prio\n"); +		irq->delivery_mode = APIC_DM_FIXED; +	} + +	if (kvm_irq_delivery_to_apic_fast(kvm, src, irq, &r)) +		return r;  	kvm_for_each_vcpu(i, vcpu, kvm) {  		if (!kvm_apic_present(vcpu)) @@ -223,6 +228,9 @@ int kvm_request_irq_source_id(struct kvm *kvm)  	}  	ASSERT(irq_source_id != KVM_USERSPACE_IRQ_SOURCE_ID); +#ifdef CONFIG_X86 +	ASSERT(irq_source_id != KVM_IRQFD_RESAMPLE_IRQ_SOURCE_ID); +#endif  	set_bit(irq_source_id, bitmap);  unlock:  	mutex_unlock(&kvm->irq_lock); @@ -233,6 +241,9 @@ unlock:  void kvm_free_irq_source_id(struct kvm *kvm, int irq_source_id)  {  	ASSERT(irq_source_id != KVM_USERSPACE_IRQ_SOURCE_ID); +#ifdef CONFIG_X86 +	ASSERT(irq_source_id != KVM_IRQFD_RESAMPLE_IRQ_SOURCE_ID); +#endif  	mutex_lock(&kvm->irq_lock);  	if (irq_source_id < 0 || @@ -321,11 +332,11 @@ static int setup_routing_entry(struct kvm_irq_routing_table *rt,  		switch (ue->u.irqchip.irqchip) {  		case KVM_IRQCHIP_PIC_MASTER:  			e->set = kvm_set_pic_irq; -			max_pin = 16; +			max_pin = PIC_NUM_PINS;  			break;  		case KVM_IRQCHIP_PIC_SLAVE:  			e->set = kvm_set_pic_irq; -			max_pin = 16; +			max_pin = PIC_NUM_PINS;  			delta = 8;  			break;  		case KVM_IRQCHIP_IOAPIC:  |