KVM: arm/arm64: vgic: Remove irq_phys_map from interface
authorAndre Przywara <andre.przywara@arm.com>
Wed, 13 Apr 2016 10:49:07 +0000 (11:49 +0100)
committerChristoffer Dall <christoffer.dall@linaro.org>
Fri, 20 May 2016 13:39:40 +0000 (15:39 +0200)
Now that the virtual arch timer does not care about the irq_phys_map
anymore, let's rework kvm_vgic_map_phys_irq() to return an error
value instead. Any reference to that mapping can later be done by
passing the correct combination of VCPU and virtual IRQ number.
This makes the irq_phys_map handling completely private to the
VGIC code.

Signed-off-by: Andre Przywara <andre.przywara@arm.com>
Reviewed-by: Eric Auger <eric.auger@linaro.org>
Reviewed-by: Christoffer Dall <christoffer.dall@linaro.org>
include/kvm/arm_vgic.h
virt/kvm/arm/arch_timer.c
virt/kvm/arm/vgic.c

index 9ad7625c0e79dbd99e51ab4ae7662497e0323bc2..3e17fb4e64b7b290cd3d6e227ca302e08c32f369 100644 (file)
@@ -344,8 +344,7 @@ int kvm_vgic_inject_mapped_irq(struct kvm *kvm, int cpuid,
                               unsigned int virt_irq, bool level);
 void vgic_v3_dispatch_sgi(struct kvm_vcpu *vcpu, u64 reg);
 int kvm_vgic_vcpu_pending_irq(struct kvm_vcpu *vcpu);
-struct irq_phys_map *kvm_vgic_map_phys_irq(struct kvm_vcpu *vcpu,
-                                          int virt_irq, int phys_irq);
+int kvm_vgic_map_phys_irq(struct kvm_vcpu *vcpu, int virt_irq, int phys_irq);
 int kvm_vgic_unmap_phys_irq(struct kvm_vcpu *vcpu, unsigned int virt_irq);
 bool kvm_vgic_map_is_active(struct kvm_vcpu *vcpu, unsigned int virt_irq);
 
index 458d4d8ce7950f5a9dbd2e39d1ac2e9e042ada99..3232105e6afd24f7971eec06c5c60a4a11214cd7 100644 (file)
@@ -333,7 +333,6 @@ int kvm_timer_vcpu_reset(struct kvm_vcpu *vcpu,
                         const struct kvm_irq_level *irq)
 {
        struct arch_timer_cpu *timer = &vcpu->arch.timer_cpu;
-       struct irq_phys_map *map;
        struct irq_desc *desc;
        struct irq_data *data;
        int phys_irq;
@@ -374,11 +373,7 @@ int kvm_timer_vcpu_reset(struct kvm_vcpu *vcpu,
         * Tell the VGIC that the virtual interrupt is tied to a
         * physical interrupt. We do that once per VCPU.
         */
-       map = kvm_vgic_map_phys_irq(vcpu, irq->irq, phys_irq);
-       if (WARN_ON(IS_ERR(map)))
-               return PTR_ERR(map);
-
-       return 0;
+       return kvm_vgic_map_phys_irq(vcpu, irq->irq, phys_irq);
 }
 
 void kvm_timer_vcpu_init(struct kvm_vcpu *vcpu)
index a7e496abfca290270ad062a4336a63c28bd3d40b..91d42a8a5f725913a81afbfcbb8e8a827f54cd4a 100644 (file)
@@ -1719,21 +1719,20 @@ static struct list_head *vgic_get_irq_phys_map_list(struct kvm_vcpu *vcpu,
  * the physical interrupt represented by @phys_irq. This mapping can be
  * established multiple times as long as the parameters are the same.
  *
- * Returns a valid pointer on success, and an error pointer otherwise
+ * Returns 0 on success or an error value otherwise.
  */
-struct irq_phys_map *kvm_vgic_map_phys_irq(struct kvm_vcpu *vcpu,
-                                          int virt_irq, int phys_irq)
+int kvm_vgic_map_phys_irq(struct kvm_vcpu *vcpu, int virt_irq, int phys_irq)
 {
        struct vgic_dist *dist = &vcpu->kvm->arch.vgic;
        struct list_head *root = vgic_get_irq_phys_map_list(vcpu, virt_irq);
        struct irq_phys_map *map;
        struct irq_phys_map_entry *entry;
-
+       int ret = 0;
 
        /* Create a new mapping */
        entry = kzalloc(sizeof(*entry), GFP_KERNEL);
        if (!entry)
-               return ERR_PTR(-ENOMEM);
+               return -ENOMEM;
 
        spin_lock(&dist->irq_phys_map_lock);
 
@@ -1742,7 +1741,7 @@ struct irq_phys_map *kvm_vgic_map_phys_irq(struct kvm_vcpu *vcpu,
        if (map) {
                /* Make sure this mapping matches */
                if (map->phys_irq != phys_irq)
-                       map = ERR_PTR(-EINVAL);
+                       ret = -EINVAL;
 
                /* Found an existing, valid mapping */
                goto out;
@@ -1758,9 +1757,9 @@ out:
        spin_unlock(&dist->irq_phys_map_lock);
        /* If we've found a hit in the existing list, free the useless
         * entry */
-       if (IS_ERR(map) || map != &entry->map)
+       if (ret || map != &entry->map)
                kfree(entry);
-       return map;
+       return ret;
 }
 
 static struct irq_phys_map *vgic_irq_map_search(struct kvm_vcpu *vcpu,