Separate update irq to a single function
PATCH 1/4 Separate update irq to a single function
Signed-off-by Sheng Yang <[email protected]>
--- arch/x86/kvm/x86.c | 78 ++++++++++++++++++++++++++++------------------------ 1 files changed, 42 insertions(+), 36 deletions(-)
arch/x86/kvm/x86.c +42 -36
@@ -205,6 +205,42 @@ static void kvm_free_all_assigned_devices(struct kvm *kvm) } } +static int assigned_device_update_irq (struct kvm *kvm, +struct kvm_assigned_dev_kernel *assigned_dev, +struct kvm_assigned_irq *assigned_irq) +{ +if (assigned_dev->irq_requested) { + assigned_dev->guest_irq = assigned_irq->guest_irq; + assigned_dev->ack_notifier.gsi = assigned_irq->guest_irq; +return 0 ; + } +if (irqchip_in_kernel (kvm)) { +if (!capable (CAP_SYS_RAWIO )) +return -EPERM ; + +if (assigned_irq->host_irq) + assigned_dev->host_irq = assigned_irq->host_irq; +else + assigned_dev->host_irq = assigned_dev->dev->irq; + assigned_dev->guest_irq = assigned_irq->guest_irq; + assigned_dev->ack_notifier.gsi = assigned_irq->guest_irq; + assigned_dev->ack_notifier.irq_acked = kvm_assigned_dev_ack_irq; +kvm_register_irq_ack_notifier (kvm, &assigned_dev->ack_notifier); + +/* Even though this is PCI, we don't want to use shared +* interrupts. Sharing host devices with guest-assigned devices +* on the same interrupt line is not a happy situation: there +* are going to be long delays in accepting, acking, etc. +*/ +if (request_irq (assigned_dev->host_irq, kvm_assigned_dev_intr, +0 ,"kvm_assigned_device" , (void *)assigned_dev)) +return -EIO ; + } + assigned_dev->irq_requested = true; + +return 0 ; +} +static int kvm_vm_ioctl_assign_irq (struct kvm *kvm,struct kvm_assigned_irq *assigned_irq)
@@ -221,44 +257,14 @@ static int kvm_vm_ioctl_assign_irq(struct kvm *kvm,return -EINVAL ; } -if (match->irq_requested) { - match->guest_irq = assigned_irq->guest_irq; - match->ack_notifier.gsi = assigned_irq->guest_irq; -mutex_unlock (&kvm->lock); -return 0 ; - } - -INIT_WORK (&match->interrupt_work, - kvm_assigned_dev_interrupt_work_handler); - -if (irqchip_in_kernel (kvm)) { -if (!capable (CAP_SYS_RAWIO )) { - r = -EPERM ; - goto out_release; - } - -if (assigned_irq->host_irq) - match->host_irq = assigned_irq->host_irq; -else - match->host_irq = match->dev->irq; - match->guest_irq = assigned_irq->guest_irq; - match->ack_notifier.gsi = assigned_irq->guest_irq; - match->ack_notifier.irq_acked = kvm_assigned_dev_ack_irq; -kvm_register_irq_ack_notifier (kvm, &match->ack_notifier); +if (!match->irq_requested) +INIT_WORK (&match->interrupt_work, + kvm_assigned_dev_interrupt_work_handler); -/* Even though this is PCI, we don't want to use shared -* interrupts. Sharing host devices with guest-assigned devices -* on the same interrupt line is not a happy situation: there -* are going to be long delays in accepting, acking, etc. -*/ -if (request_irq (match->host_irq, kvm_assigned_dev_intr,0 , -"kvm_assigned_device" , (void *)match)) { - r = -EIO ; - goto out_release; - } - } + r =assigned_device_update_irq (kvm, match, assigned_irq); +if (r) + goto out_release; - match->irq_requested = true;mutex_unlock (&kvm->lock);return r; out_release:
Signature · 1 line
1.5.4.5