Commit 46a47b1ed118cda1a08b7f6077b837a00fbc112b
1 parent
be835674b5
KVM: convert ioapic lock to spinlock
kvm_set_irq is used from non sleepable contexes, so convert ioapic from mutex to spinlock. KVM-Stable-Tag. Tested-by: Ralf Bonenkamp <ralf.bonenkamp@swyx.com> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Showing 2 changed files with 16 additions and 16 deletions Side-by-side Diff
virt/kvm/ioapic.c
... | ... | @@ -197,7 +197,7 @@ |
197 | 197 | union kvm_ioapic_redirect_entry entry; |
198 | 198 | int ret = 1; |
199 | 199 | |
200 | - mutex_lock(&ioapic->lock); | |
200 | + spin_lock(&ioapic->lock); | |
201 | 201 | if (irq >= 0 && irq < IOAPIC_NUM_PINS) { |
202 | 202 | entry = ioapic->redirtbl[irq]; |
203 | 203 | level ^= entry.fields.polarity; |
... | ... | @@ -214,7 +214,7 @@ |
214 | 214 | } |
215 | 215 | trace_kvm_ioapic_set_irq(entry.bits, irq, ret == 0); |
216 | 216 | } |
217 | - mutex_unlock(&ioapic->lock); | |
217 | + spin_unlock(&ioapic->lock); | |
218 | 218 | |
219 | 219 | return ret; |
220 | 220 | } |
221 | 221 | |
... | ... | @@ -238,9 +238,9 @@ |
238 | 238 | * is dropped it will be put into irr and will be delivered |
239 | 239 | * after ack notifier returns. |
240 | 240 | */ |
241 | - mutex_unlock(&ioapic->lock); | |
241 | + spin_unlock(&ioapic->lock); | |
242 | 242 | kvm_notify_acked_irq(ioapic->kvm, KVM_IRQCHIP_IOAPIC, i); |
243 | - mutex_lock(&ioapic->lock); | |
243 | + spin_lock(&ioapic->lock); | |
244 | 244 | |
245 | 245 | if (trigger_mode != IOAPIC_LEVEL_TRIG) |
246 | 246 | continue; |
247 | 247 | |
... | ... | @@ -259,9 +259,9 @@ |
259 | 259 | smp_rmb(); |
260 | 260 | if (!test_bit(vector, ioapic->handled_vectors)) |
261 | 261 | return; |
262 | - mutex_lock(&ioapic->lock); | |
262 | + spin_lock(&ioapic->lock); | |
263 | 263 | __kvm_ioapic_update_eoi(ioapic, vector, trigger_mode); |
264 | - mutex_unlock(&ioapic->lock); | |
264 | + spin_unlock(&ioapic->lock); | |
265 | 265 | } |
266 | 266 | |
267 | 267 | static inline struct kvm_ioapic *to_ioapic(struct kvm_io_device *dev) |
... | ... | @@ -287,7 +287,7 @@ |
287 | 287 | ASSERT(!(addr & 0xf)); /* check alignment */ |
288 | 288 | |
289 | 289 | addr &= 0xff; |
290 | - mutex_lock(&ioapic->lock); | |
290 | + spin_lock(&ioapic->lock); | |
291 | 291 | switch (addr) { |
292 | 292 | case IOAPIC_REG_SELECT: |
293 | 293 | result = ioapic->ioregsel; |
... | ... | @@ -301,7 +301,7 @@ |
301 | 301 | result = 0; |
302 | 302 | break; |
303 | 303 | } |
304 | - mutex_unlock(&ioapic->lock); | |
304 | + spin_unlock(&ioapic->lock); | |
305 | 305 | |
306 | 306 | switch (len) { |
307 | 307 | case 8: |
... | ... | @@ -338,7 +338,7 @@ |
338 | 338 | } |
339 | 339 | |
340 | 340 | addr &= 0xff; |
341 | - mutex_lock(&ioapic->lock); | |
341 | + spin_lock(&ioapic->lock); | |
342 | 342 | switch (addr) { |
343 | 343 | case IOAPIC_REG_SELECT: |
344 | 344 | ioapic->ioregsel = data; |
... | ... | @@ -356,7 +356,7 @@ |
356 | 356 | default: |
357 | 357 | break; |
358 | 358 | } |
359 | - mutex_unlock(&ioapic->lock); | |
359 | + spin_unlock(&ioapic->lock); | |
360 | 360 | return 0; |
361 | 361 | } |
362 | 362 | |
... | ... | @@ -386,7 +386,7 @@ |
386 | 386 | ioapic = kzalloc(sizeof(struct kvm_ioapic), GFP_KERNEL); |
387 | 387 | if (!ioapic) |
388 | 388 | return -ENOMEM; |
389 | - mutex_init(&ioapic->lock); | |
389 | + spin_lock_init(&ioapic->lock); | |
390 | 390 | kvm->arch.vioapic = ioapic; |
391 | 391 | kvm_ioapic_reset(ioapic); |
392 | 392 | kvm_iodevice_init(&ioapic->dev, &ioapic_mmio_ops); |
393 | 393 | |
... | ... | @@ -419,9 +419,9 @@ |
419 | 419 | if (!ioapic) |
420 | 420 | return -EINVAL; |
421 | 421 | |
422 | - mutex_lock(&ioapic->lock); | |
422 | + spin_lock(&ioapic->lock); | |
423 | 423 | memcpy(state, ioapic, sizeof(struct kvm_ioapic_state)); |
424 | - mutex_unlock(&ioapic->lock); | |
424 | + spin_unlock(&ioapic->lock); | |
425 | 425 | return 0; |
426 | 426 | } |
427 | 427 | |
428 | 428 | |
... | ... | @@ -431,10 +431,10 @@ |
431 | 431 | if (!ioapic) |
432 | 432 | return -EINVAL; |
433 | 433 | |
434 | - mutex_lock(&ioapic->lock); | |
434 | + spin_lock(&ioapic->lock); | |
435 | 435 | memcpy(ioapic, state, sizeof(struct kvm_ioapic_state)); |
436 | 436 | update_handled_vectors(ioapic); |
437 | - mutex_unlock(&ioapic->lock); | |
437 | + spin_unlock(&ioapic->lock); | |
438 | 438 | return 0; |
439 | 439 | } |