aboutsummaryrefslogtreecommitdiffstats
path: root/virt/kvm/irq_comm.c
diff options
context:
space:
mode:
authorPaul Mackerras <paulus@samba.org>2014-06-30 06:51:10 -0400
committerPaolo Bonzini <pbonzini@redhat.com>2014-08-05 08:26:16 -0400
commit8ba918d488caded2c4368b0b922eb905fe3bb101 (patch)
tree6b14bc6c9b763e5dd7b641c902db3fd04b4d4b89 /virt/kvm/irq_comm.c
parent56f89f3629ffd1a21d38c3d0bea23deac0e284ce (diff)
KVM: irqchip: Provide and use accessors for irq routing table
This provides accessor functions for the KVM interrupt mappings, in order to reduce the amount of code that accesses the fields of the kvm_irq_routing_table struct, and restrict that code to one file, virt/kvm/irqchip.c. The new functions are kvm_irq_map_gsi(), which maps from a global interrupt number to a set of IRQ routing entries, and kvm_irq_map_chip_pin, which maps from IRQ chip and pin numbers to a global interrupt number. This also moves the update of kvm_irq_routing_table::chip[][] into irqchip.c, out of the various kvm_set_routing_entry implementations. That means that none of the kvm_set_routing_entry implementations need the kvm_irq_routing_table argument anymore, so this removes it. This does not change any locking or data lifetime rules. Signed-off-by: Paul Mackerras <paulus@samba.org> Tested-by: Eric Auger <eric.auger@linaro.org> Tested-by: Cornelia Huck <cornelia.huck@de.ibm.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'virt/kvm/irq_comm.c')
-rw-r--r--virt/kvm/irq_comm.c20
1 files changed, 9 insertions, 11 deletions
diff --git a/virt/kvm/irq_comm.c b/virt/kvm/irq_comm.c
index a228ee82bad2..175844593243 100644
--- a/virt/kvm/irq_comm.c
+++ b/virt/kvm/irq_comm.c
@@ -160,6 +160,7 @@ static int kvm_set_msi_inatomic(struct kvm_kernel_irq_routing_entry *e,
160 */ 160 */
161int kvm_set_irq_inatomic(struct kvm *kvm, int irq_source_id, u32 irq, int level) 161int kvm_set_irq_inatomic(struct kvm *kvm, int irq_source_id, u32 irq, int level)
162{ 162{
163 struct kvm_kernel_irq_routing_entry entries[KVM_NR_IRQCHIPS];
163 struct kvm_kernel_irq_routing_entry *e; 164 struct kvm_kernel_irq_routing_entry *e;
164 int ret = -EINVAL; 165 int ret = -EINVAL;
165 struct kvm_irq_routing_table *irq_rt; 166 struct kvm_irq_routing_table *irq_rt;
@@ -177,14 +178,13 @@ int kvm_set_irq_inatomic(struct kvm *kvm, int irq_source_id, u32 irq, int level)
177 */ 178 */
178 idx = srcu_read_lock(&kvm->irq_srcu); 179 idx = srcu_read_lock(&kvm->irq_srcu);
179 irq_rt = srcu_dereference(kvm->irq_routing, &kvm->irq_srcu); 180 irq_rt = srcu_dereference(kvm->irq_routing, &kvm->irq_srcu);
180 if (irq < irq_rt->nr_rt_entries) 181 if (kvm_irq_map_gsi(entries, irq_rt, irq) > 0) {
181 hlist_for_each_entry(e, &irq_rt->map[irq], link) { 182 e = &entries[0];
182 if (likely(e->type == KVM_IRQ_ROUTING_MSI)) 183 if (likely(e->type == KVM_IRQ_ROUTING_MSI))
183 ret = kvm_set_msi_inatomic(e, kvm); 184 ret = kvm_set_msi_inatomic(e, kvm);
184 else 185 else
185 ret = -EWOULDBLOCK; 186 ret = -EWOULDBLOCK;
186 break; 187 }
187 }
188 srcu_read_unlock(&kvm->irq_srcu, idx); 188 srcu_read_unlock(&kvm->irq_srcu, idx);
189 return ret; 189 return ret;
190} 190}
@@ -272,8 +272,7 @@ void kvm_fire_mask_notifiers(struct kvm *kvm, unsigned irqchip, unsigned pin,
272 srcu_read_unlock(&kvm->irq_srcu, idx); 272 srcu_read_unlock(&kvm->irq_srcu, idx);
273} 273}
274 274
275int kvm_set_routing_entry(struct kvm_irq_routing_table *rt, 275int kvm_set_routing_entry(struct kvm_kernel_irq_routing_entry *e,
276 struct kvm_kernel_irq_routing_entry *e,
277 const struct kvm_irq_routing_entry *ue) 276 const struct kvm_irq_routing_entry *ue)
278{ 277{
279 int r = -EINVAL; 278 int r = -EINVAL;
@@ -304,7 +303,6 @@ int kvm_set_routing_entry(struct kvm_irq_routing_table *rt,
304 e->irqchip.pin = ue->u.irqchip.pin + delta; 303 e->irqchip.pin = ue->u.irqchip.pin + delta;
305 if (e->irqchip.pin >= max_pin) 304 if (e->irqchip.pin >= max_pin)
306 goto out; 305 goto out;
307 rt->chip[ue->u.irqchip.irqchip][e->irqchip.pin] = ue->gsi;
308 break; 306 break;
309 case KVM_IRQ_ROUTING_MSI: 307 case KVM_IRQ_ROUTING_MSI:
310 e->set = kvm_set_msi; 308 e->set = kvm_set_msi;