KVM: cleanup io_device code
[platform/adaptation/renesas_rcar/renesas_kernel.git] / virt / kvm / kvm_main.c
index 2884baf..d1f9c87 100644 (file)
@@ -120,7 +120,7 @@ static void kvm_assigned_dev_interrupt_work_handler(struct work_struct *work)
 {
        struct kvm_assigned_dev_kernel *assigned_dev;
        struct kvm *kvm;
-       int irq, i;
+       int i;
 
        assigned_dev = container_of(work, struct kvm_assigned_dev_kernel,
                                    interrupt_work);
@@ -143,20 +143,10 @@ static void kvm_assigned_dev_interrupt_work_handler(struct work_struct *work)
                        kvm_set_irq(assigned_dev->kvm,
                                    assigned_dev->irq_source_id,
                                    guest_entries[i].vector, 1);
-                       irq = assigned_dev->host_msix_entries[i].vector;
-                       if (irq != 0)
-                               enable_irq(irq);
-                       assigned_dev->host_irq_disabled = false;
                }
-       } else {
+       } else
                kvm_set_irq(assigned_dev->kvm, assigned_dev->irq_source_id,
                            assigned_dev->guest_irq, 1);
-               if (assigned_dev->irq_requested_type &
-                               KVM_DEV_IRQ_GUEST_MSI) {
-                       enable_irq(assigned_dev->host_irq);
-                       assigned_dev->host_irq_disabled = false;
-               }
-       }
 
        spin_unlock_irq(&assigned_dev->assigned_dev_lock);
        mutex_unlock(&assigned_dev->kvm->lock);
@@ -179,8 +169,10 @@ static irqreturn_t kvm_assigned_dev_intr(int irq, void *dev_id)
 
        schedule_work(&assigned_dev->interrupt_work);
 
-       disable_irq_nosync(irq);
-       assigned_dev->host_irq_disabled = true;
+       if (assigned_dev->irq_requested_type & KVM_DEV_IRQ_GUEST_INTX) {
+               disable_irq_nosync(irq);
+               assigned_dev->host_irq_disabled = true;
+       }
 
 out:
        spin_unlock_irqrestore(&assigned_dev->assigned_dev_lock, flags);
@@ -417,6 +409,7 @@ static int assigned_device_enable_guest_msi(struct kvm *kvm,
 {
        dev->guest_irq = irq->guest_irq;
        dev->ack_notifier.gsi = -1;
+       dev->host_irq_disabled = false;
        return 0;
 }
 #endif
@@ -427,6 +420,7 @@ static int assigned_device_enable_guest_msix(struct kvm *kvm,
 {
        dev->guest_irq = irq->guest_irq;
        dev->ack_notifier.gsi = -1;
+       dev->host_irq_disabled = false;
        return 0;
 }
 #endif
@@ -986,6 +980,7 @@ static struct kvm *kvm_create_vm(void)
        spin_lock_init(&kvm->mmu_lock);
        spin_lock_init(&kvm->requests_lock);
        kvm_io_bus_init(&kvm->pio_bus);
+       kvm_irqfd_init(kvm);
        mutex_init(&kvm->lock);
        kvm_io_bus_init(&kvm->mmio_bus);
        init_rwsem(&kvm->slots_lock);
@@ -1071,6 +1066,8 @@ static int kvm_vm_release(struct inode *inode, struct file *filp)
 {
        struct kvm *kvm = filp->private_data;
 
+       kvm_irqfd_release(kvm);
+
        kvm_put_kvm(kvm);
        return 0;
 }
@@ -2222,6 +2219,15 @@ static long kvm_vm_ioctl(struct file *filp,
        }
 #endif
 #endif /* KVM_CAP_IRQ_ROUTING */
+       case KVM_IRQFD: {
+               struct kvm_irqfd data;
+
+               r = -EFAULT;
+               if (copy_from_user(&data, argp, sizeof data))
+                       goto out;
+               r = kvm_irqfd(kvm, data.fd, data.gsi, data.flags);
+               break;
+       }
        default:
                r = kvm_arch_vm_ioctl(filp, ioctl, arg);
        }
@@ -2457,7 +2463,7 @@ struct kvm_io_device *kvm_io_bus_find_dev(struct kvm_io_bus *bus,
        for (i = 0; i < bus->dev_count; i++) {
                struct kvm_io_device *pos = bus->devs[i];
 
-               if (pos->in_range(pos, addr, len, is_write))
+               if (kvm_iodevice_in_range(pos, addr, len, is_write))
                        return pos;
        }