aboutsummaryrefslogtreecommitdiffstats
path: root/virt/kvm/irq_comm.c
diff options
context:
space:
mode:
Diffstat (limited to 'virt/kvm/irq_comm.c')
-rw-r--r--virt/kvm/irq_comm.c231
1 files changed, 136 insertions, 95 deletions
diff --git a/virt/kvm/irq_comm.c b/virt/kvm/irq_comm.c
index 001663ff401a..9b077342ab54 100644
--- a/virt/kvm/irq_comm.c
+++ b/virt/kvm/irq_comm.c
@@ -31,20 +31,39 @@
31 31
32#include "ioapic.h" 32#include "ioapic.h"
33 33
34static inline int kvm_irq_line_state(unsigned long *irq_state,
35 int irq_source_id, int level)
36{
37 /* Logical OR for level trig interrupt */
38 if (level)
39 set_bit(irq_source_id, irq_state);
40 else
41 clear_bit(irq_source_id, irq_state);
42
43 return !!(*irq_state);
44}
45
34static int kvm_set_pic_irq(struct kvm_kernel_irq_routing_entry *e, 46static int kvm_set_pic_irq(struct kvm_kernel_irq_routing_entry *e,
35 struct kvm *kvm, int level) 47 struct kvm *kvm, int irq_source_id, int level)
36{ 48{
37#ifdef CONFIG_X86 49#ifdef CONFIG_X86
38 return kvm_pic_set_irq(pic_irqchip(kvm), e->irqchip.pin, level); 50 struct kvm_pic *pic = pic_irqchip(kvm);
51 level = kvm_irq_line_state(&pic->irq_states[e->irqchip.pin],
52 irq_source_id, level);
53 return kvm_pic_set_irq(pic, e->irqchip.pin, level);
39#else 54#else
40 return -1; 55 return -1;
41#endif 56#endif
42} 57}
43 58
44static int kvm_set_ioapic_irq(struct kvm_kernel_irq_routing_entry *e, 59static int kvm_set_ioapic_irq(struct kvm_kernel_irq_routing_entry *e,
45 struct kvm *kvm, int level) 60 struct kvm *kvm, int irq_source_id, int level)
46{ 61{
47 return kvm_ioapic_set_irq(kvm->arch.vioapic, e->irqchip.pin, level); 62 struct kvm_ioapic *ioapic = kvm->arch.vioapic;
63 level = kvm_irq_line_state(&ioapic->irq_states[e->irqchip.pin],
64 irq_source_id, level);
65
66 return kvm_ioapic_set_irq(ioapic, e->irqchip.pin, level);
48} 67}
49 68
50inline static bool kvm_is_dm_lowest_prio(struct kvm_lapic_irq *irq) 69inline static bool kvm_is_dm_lowest_prio(struct kvm_lapic_irq *irq)
@@ -63,8 +82,6 @@ int kvm_irq_delivery_to_apic(struct kvm *kvm, struct kvm_lapic *src,
63 int i, r = -1; 82 int i, r = -1;
64 struct kvm_vcpu *vcpu, *lowest = NULL; 83 struct kvm_vcpu *vcpu, *lowest = NULL;
65 84
66 WARN_ON(!mutex_is_locked(&kvm->irq_lock));
67
68 if (irq->dest_mode == 0 && irq->dest_id == 0xff && 85 if (irq->dest_mode == 0 && irq->dest_id == 0xff &&
69 kvm_is_dm_lowest_prio(irq)) 86 kvm_is_dm_lowest_prio(irq))
70 printk(KERN_INFO "kvm: apic: phys broadcast and lowest prio\n"); 87 printk(KERN_INFO "kvm: apic: phys broadcast and lowest prio\n");
@@ -96,10 +113,13 @@ int kvm_irq_delivery_to_apic(struct kvm *kvm, struct kvm_lapic *src,
96} 113}
97 114
98static int kvm_set_msi(struct kvm_kernel_irq_routing_entry *e, 115static int kvm_set_msi(struct kvm_kernel_irq_routing_entry *e,
99 struct kvm *kvm, int level) 116 struct kvm *kvm, int irq_source_id, int level)
100{ 117{
101 struct kvm_lapic_irq irq; 118 struct kvm_lapic_irq irq;
102 119
120 if (!level)
121 return -1;
122
103 trace_kvm_msi_set_irq(e->msi.address_lo, e->msi.data); 123 trace_kvm_msi_set_irq(e->msi.address_lo, e->msi.data);
104 124
105 irq.dest_id = (e->msi.address_lo & 125 irq.dest_id = (e->msi.address_lo &
@@ -116,78 +136,67 @@ static int kvm_set_msi(struct kvm_kernel_irq_routing_entry *e,
116 return kvm_irq_delivery_to_apic(kvm, NULL, &irq); 136 return kvm_irq_delivery_to_apic(kvm, NULL, &irq);
117} 137}
118 138
119/* This should be called with the kvm->irq_lock mutex held 139/*
120 * Return value: 140 * Return value:
121 * < 0 Interrupt was ignored (masked or not delivered for other reasons) 141 * < 0 Interrupt was ignored (masked or not delivered for other reasons)
122 * = 0 Interrupt was coalesced (previous irq is still pending) 142 * = 0 Interrupt was coalesced (previous irq is still pending)
123 * > 0 Number of CPUs interrupt was delivered to 143 * > 0 Number of CPUs interrupt was delivered to
124 */ 144 */
125int kvm_set_irq(struct kvm *kvm, int irq_source_id, int irq, int level) 145int kvm_set_irq(struct kvm *kvm, int irq_source_id, u32 irq, int level)
126{ 146{
127 struct kvm_kernel_irq_routing_entry *e; 147 struct kvm_kernel_irq_routing_entry *e, irq_set[KVM_NR_IRQCHIPS];
128 unsigned long *irq_state, sig_level; 148 int ret = -1, i = 0;
129 int ret = -1; 149 struct kvm_irq_routing_table *irq_rt;
150 struct hlist_node *n;
130 151
131 trace_kvm_set_irq(irq, level, irq_source_id); 152 trace_kvm_set_irq(irq, level, irq_source_id);
132 153
133 WARN_ON(!mutex_is_locked(&kvm->irq_lock));
134
135 if (irq < KVM_IOAPIC_NUM_PINS) {
136 irq_state = (unsigned long *)&kvm->arch.irq_states[irq];
137
138 /* Logical OR for level trig interrupt */
139 if (level)
140 set_bit(irq_source_id, irq_state);
141 else
142 clear_bit(irq_source_id, irq_state);
143 sig_level = !!(*irq_state);
144 } else if (!level)
145 return ret;
146 else /* Deal with MSI/MSI-X */
147 sig_level = 1;
148
149 /* Not possible to detect if the guest uses the PIC or the 154 /* Not possible to detect if the guest uses the PIC or the
150 * IOAPIC. So set the bit in both. The guest will ignore 155 * IOAPIC. So set the bit in both. The guest will ignore
151 * writes to the unused one. 156 * writes to the unused one.
152 */ 157 */
153 list_for_each_entry(e, &kvm->irq_routing, link) 158 rcu_read_lock();
154 if (e->gsi == irq) { 159 irq_rt = rcu_dereference(kvm->irq_routing);
155 int r = e->set(e, kvm, sig_level); 160 if (irq < irq_rt->nr_rt_entries)
156 if (r < 0) 161 hlist_for_each_entry(e, n, &irq_rt->map[irq], link)
157 continue; 162 irq_set[i++] = *e;
163 rcu_read_unlock();
164
165 while(i--) {
166 int r;
167 r = irq_set[i].set(&irq_set[i], kvm, irq_source_id, level);
168 if (r < 0)
169 continue;
170
171 ret = r + ((ret < 0) ? 0 : ret);
172 }
158 173
159 ret = r + ((ret < 0) ? 0 : ret);
160 }
161 return ret; 174 return ret;
162} 175}
163 176
164void kvm_notify_acked_irq(struct kvm *kvm, unsigned irqchip, unsigned pin) 177void kvm_notify_acked_irq(struct kvm *kvm, unsigned irqchip, unsigned pin)
165{ 178{
166 struct kvm_kernel_irq_routing_entry *e;
167 struct kvm_irq_ack_notifier *kian; 179 struct kvm_irq_ack_notifier *kian;
168 struct hlist_node *n; 180 struct hlist_node *n;
169 unsigned gsi = pin; 181 int gsi;
170 182
171 trace_kvm_ack_irq(irqchip, pin); 183 trace_kvm_ack_irq(irqchip, pin);
172 184
173 list_for_each_entry(e, &kvm->irq_routing, link) 185 rcu_read_lock();
174 if (e->type == KVM_IRQ_ROUTING_IRQCHIP && 186 gsi = rcu_dereference(kvm->irq_routing)->chip[irqchip][pin];
175 e->irqchip.irqchip == irqchip && 187 if (gsi != -1)
176 e->irqchip.pin == pin) { 188 hlist_for_each_entry_rcu(kian, n, &kvm->irq_ack_notifier_list,
177 gsi = e->gsi; 189 link)
178 break; 190 if (kian->gsi == gsi)
179 } 191 kian->irq_acked(kian);
180 192 rcu_read_unlock();
181 hlist_for_each_entry(kian, n, &kvm->arch.irq_ack_notifier_list, link)
182 if (kian->gsi == gsi)
183 kian->irq_acked(kian);
184} 193}
185 194
186void kvm_register_irq_ack_notifier(struct kvm *kvm, 195void kvm_register_irq_ack_notifier(struct kvm *kvm,
187 struct kvm_irq_ack_notifier *kian) 196 struct kvm_irq_ack_notifier *kian)
188{ 197{
189 mutex_lock(&kvm->irq_lock); 198 mutex_lock(&kvm->irq_lock);
190 hlist_add_head(&kian->link, &kvm->arch.irq_ack_notifier_list); 199 hlist_add_head_rcu(&kian->link, &kvm->irq_ack_notifier_list);
191 mutex_unlock(&kvm->irq_lock); 200 mutex_unlock(&kvm->irq_lock);
192} 201}
193 202
@@ -195,8 +204,9 @@ void kvm_unregister_irq_ack_notifier(struct kvm *kvm,
195 struct kvm_irq_ack_notifier *kian) 204 struct kvm_irq_ack_notifier *kian)
196{ 205{
197 mutex_lock(&kvm->irq_lock); 206 mutex_lock(&kvm->irq_lock);
198 hlist_del_init(&kian->link); 207 hlist_del_init_rcu(&kian->link);
199 mutex_unlock(&kvm->irq_lock); 208 mutex_unlock(&kvm->irq_lock);
209 synchronize_rcu();
200} 210}
201 211
202int kvm_request_irq_source_id(struct kvm *kvm) 212int kvm_request_irq_source_id(struct kvm *kvm)
@@ -205,16 +215,17 @@ int kvm_request_irq_source_id(struct kvm *kvm)
205 int irq_source_id; 215 int irq_source_id;
206 216
207 mutex_lock(&kvm->irq_lock); 217 mutex_lock(&kvm->irq_lock);
208 irq_source_id = find_first_zero_bit(bitmap, 218 irq_source_id = find_first_zero_bit(bitmap, BITS_PER_LONG);
209 sizeof(kvm->arch.irq_sources_bitmap));
210 219
211 if (irq_source_id >= sizeof(kvm->arch.irq_sources_bitmap)) { 220 if (irq_source_id >= BITS_PER_LONG) {
212 printk(KERN_WARNING "kvm: exhaust allocatable IRQ sources!\n"); 221 printk(KERN_WARNING "kvm: exhaust allocatable IRQ sources!\n");
213 return -EFAULT; 222 irq_source_id = -EFAULT;
223 goto unlock;
214 } 224 }
215 225
216 ASSERT(irq_source_id != KVM_USERSPACE_IRQ_SOURCE_ID); 226 ASSERT(irq_source_id != KVM_USERSPACE_IRQ_SOURCE_ID);
217 set_bit(irq_source_id, bitmap); 227 set_bit(irq_source_id, bitmap);
228unlock:
218 mutex_unlock(&kvm->irq_lock); 229 mutex_unlock(&kvm->irq_lock);
219 230
220 return irq_source_id; 231 return irq_source_id;
@@ -228,13 +239,23 @@ void kvm_free_irq_source_id(struct kvm *kvm, int irq_source_id)
228 239
229 mutex_lock(&kvm->irq_lock); 240 mutex_lock(&kvm->irq_lock);
230 if (irq_source_id < 0 || 241 if (irq_source_id < 0 ||
231 irq_source_id >= sizeof(kvm->arch.irq_sources_bitmap)) { 242 irq_source_id >= BITS_PER_LONG) {
232 printk(KERN_ERR "kvm: IRQ source ID out of range!\n"); 243 printk(KERN_ERR "kvm: IRQ source ID out of range!\n");
233 return; 244 goto unlock;
234 } 245 }
235 for (i = 0; i < KVM_IOAPIC_NUM_PINS; i++)
236 clear_bit(irq_source_id, &kvm->arch.irq_states[i]);
237 clear_bit(irq_source_id, &kvm->arch.irq_sources_bitmap); 246 clear_bit(irq_source_id, &kvm->arch.irq_sources_bitmap);
247 if (!irqchip_in_kernel(kvm))
248 goto unlock;
249
250 for (i = 0; i < KVM_IOAPIC_NUM_PINS; i++) {
251 clear_bit(irq_source_id, &kvm->arch.vioapic->irq_states[i]);
252 if (i >= 16)
253 continue;
254#ifdef CONFIG_X86
255 clear_bit(irq_source_id, &pic_irqchip(kvm)->irq_states[i]);
256#endif
257 }
258unlock:
238 mutex_unlock(&kvm->irq_lock); 259 mutex_unlock(&kvm->irq_lock);
239} 260}
240 261
@@ -243,7 +264,7 @@ void kvm_register_irq_mask_notifier(struct kvm *kvm, int irq,
243{ 264{
244 mutex_lock(&kvm->irq_lock); 265 mutex_lock(&kvm->irq_lock);
245 kimn->irq = irq; 266 kimn->irq = irq;
246 hlist_add_head(&kimn->link, &kvm->mask_notifier_list); 267 hlist_add_head_rcu(&kimn->link, &kvm->mask_notifier_list);
247 mutex_unlock(&kvm->irq_lock); 268 mutex_unlock(&kvm->irq_lock);
248} 269}
249 270
@@ -251,8 +272,9 @@ void kvm_unregister_irq_mask_notifier(struct kvm *kvm, int irq,
251 struct kvm_irq_mask_notifier *kimn) 272 struct kvm_irq_mask_notifier *kimn)
252{ 273{
253 mutex_lock(&kvm->irq_lock); 274 mutex_lock(&kvm->irq_lock);
254 hlist_del(&kimn->link); 275 hlist_del_rcu(&kimn->link);
255 mutex_unlock(&kvm->irq_lock); 276 mutex_unlock(&kvm->irq_lock);
277 synchronize_rcu();
256} 278}
257 279
258void kvm_fire_mask_notifiers(struct kvm *kvm, int irq, bool mask) 280void kvm_fire_mask_notifiers(struct kvm *kvm, int irq, bool mask)
@@ -260,33 +282,37 @@ void kvm_fire_mask_notifiers(struct kvm *kvm, int irq, bool mask)
260 struct kvm_irq_mask_notifier *kimn; 282 struct kvm_irq_mask_notifier *kimn;
261 struct hlist_node *n; 283 struct hlist_node *n;
262 284
263 WARN_ON(!mutex_is_locked(&kvm->irq_lock)); 285 rcu_read_lock();
264 286 hlist_for_each_entry_rcu(kimn, n, &kvm->mask_notifier_list, link)
265 hlist_for_each_entry(kimn, n, &kvm->mask_notifier_list, link)
266 if (kimn->irq == irq) 287 if (kimn->irq == irq)
267 kimn->func(kimn, mask); 288 kimn->func(kimn, mask);
268} 289 rcu_read_unlock();
269
270static void __kvm_free_irq_routing(struct list_head *irq_routing)
271{
272 struct kvm_kernel_irq_routing_entry *e, *n;
273
274 list_for_each_entry_safe(e, n, irq_routing, link)
275 kfree(e);
276} 290}
277 291
278void kvm_free_irq_routing(struct kvm *kvm) 292void kvm_free_irq_routing(struct kvm *kvm)
279{ 293{
280 mutex_lock(&kvm->irq_lock); 294 /* Called only during vm destruction. Nobody can use the pointer
281 __kvm_free_irq_routing(&kvm->irq_routing); 295 at this stage */
282 mutex_unlock(&kvm->irq_lock); 296 kfree(kvm->irq_routing);
283} 297}
284 298
285static int setup_routing_entry(struct kvm_kernel_irq_routing_entry *e, 299static int setup_routing_entry(struct kvm_irq_routing_table *rt,
300 struct kvm_kernel_irq_routing_entry *e,
286 const struct kvm_irq_routing_entry *ue) 301 const struct kvm_irq_routing_entry *ue)
287{ 302{
288 int r = -EINVAL; 303 int r = -EINVAL;
289 int delta; 304 int delta;
305 struct kvm_kernel_irq_routing_entry *ei;
306 struct hlist_node *n;
307
308 /*
309 * Do not allow GSI to be mapped to the same irqchip more than once.
310 * Allow only one to one mapping between GSI and MSI.
311 */
312 hlist_for_each_entry(ei, n, &rt->map[ue->gsi], link)
313 if (ei->type == KVM_IRQ_ROUTING_MSI ||
314 ue->u.irqchip.irqchip == ei->irqchip.irqchip)
315 return r;
290 316
291 e->gsi = ue->gsi; 317 e->gsi = ue->gsi;
292 e->type = ue->type; 318 e->type = ue->type;
@@ -309,6 +335,9 @@ static int setup_routing_entry(struct kvm_kernel_irq_routing_entry *e,
309 } 335 }
310 e->irqchip.irqchip = ue->u.irqchip.irqchip; 336 e->irqchip.irqchip = ue->u.irqchip.irqchip;
311 e->irqchip.pin = ue->u.irqchip.pin + delta; 337 e->irqchip.pin = ue->u.irqchip.pin + delta;
338 if (e->irqchip.pin >= KVM_IOAPIC_NUM_PINS)
339 goto out;
340 rt->chip[ue->u.irqchip.irqchip][e->irqchip.pin] = ue->gsi;
312 break; 341 break;
313 case KVM_IRQ_ROUTING_MSI: 342 case KVM_IRQ_ROUTING_MSI:
314 e->set = kvm_set_msi; 343 e->set = kvm_set_msi;
@@ -319,6 +348,8 @@ static int setup_routing_entry(struct kvm_kernel_irq_routing_entry *e,
319 default: 348 default:
320 goto out; 349 goto out;
321 } 350 }
351
352 hlist_add_head(&e->link, &rt->map[e->gsi]);
322 r = 0; 353 r = 0;
323out: 354out:
324 return r; 355 return r;
@@ -330,43 +361,53 @@ int kvm_set_irq_routing(struct kvm *kvm,
330 unsigned nr, 361 unsigned nr,
331 unsigned flags) 362 unsigned flags)
332{ 363{
333 struct list_head irq_list = LIST_HEAD_INIT(irq_list); 364 struct kvm_irq_routing_table *new, *old;
334 struct list_head tmp = LIST_HEAD_INIT(tmp); 365 u32 i, j, nr_rt_entries = 0;
335 struct kvm_kernel_irq_routing_entry *e = NULL;
336 unsigned i;
337 int r; 366 int r;
338 367
339 for (i = 0; i < nr; ++i) { 368 for (i = 0; i < nr; ++i) {
369 if (ue[i].gsi >= KVM_MAX_IRQ_ROUTES)
370 return -EINVAL;
371 nr_rt_entries = max(nr_rt_entries, ue[i].gsi);
372 }
373
374 nr_rt_entries += 1;
375
376 new = kzalloc(sizeof(*new) + (nr_rt_entries * sizeof(struct hlist_head))
377 + (nr * sizeof(struct kvm_kernel_irq_routing_entry)),
378 GFP_KERNEL);
379
380 if (!new)
381 return -ENOMEM;
382
383 new->rt_entries = (void *)&new->map[nr_rt_entries];
384
385 new->nr_rt_entries = nr_rt_entries;
386 for (i = 0; i < 3; i++)
387 for (j = 0; j < KVM_IOAPIC_NUM_PINS; j++)
388 new->chip[i][j] = -1;
389
390 for (i = 0; i < nr; ++i) {
340 r = -EINVAL; 391 r = -EINVAL;
341 if (ue->gsi >= KVM_MAX_IRQ_ROUTES)
342 goto out;
343 if (ue->flags) 392 if (ue->flags)
344 goto out; 393 goto out;
345 r = -ENOMEM; 394 r = setup_routing_entry(new, &new->rt_entries[i], ue);
346 e = kzalloc(sizeof(*e), GFP_KERNEL);
347 if (!e)
348 goto out;
349 r = setup_routing_entry(e, ue);
350 if (r) 395 if (r)
351 goto out; 396 goto out;
352 ++ue; 397 ++ue;
353 list_add(&e->link, &irq_list);
354 e = NULL;
355 } 398 }
356 399
357 mutex_lock(&kvm->irq_lock); 400 mutex_lock(&kvm->irq_lock);
358 list_splice(&kvm->irq_routing, &tmp); 401 old = kvm->irq_routing;
359 INIT_LIST_HEAD(&kvm->irq_routing); 402 rcu_assign_pointer(kvm->irq_routing, new);
360 list_splice(&irq_list, &kvm->irq_routing);
361 INIT_LIST_HEAD(&irq_list);
362 list_splice(&tmp, &irq_list);
363 mutex_unlock(&kvm->irq_lock); 403 mutex_unlock(&kvm->irq_lock);
404 synchronize_rcu();
364 405
406 new = old;
365 r = 0; 407 r = 0;
366 408
367out: 409out:
368 kfree(e); 410 kfree(new);
369 __kvm_free_irq_routing(&irq_list);
370 return r; 411 return r;
371} 412}
372 413