Commit 46a47b1ed118cda1a08b7f6077b837a00fbc112b

Authored by Marcelo Tosatti
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

... ... @@ -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 }
... ... @@ -45,7 +45,7 @@
45 45 struct kvm_io_device dev;
46 46 struct kvm *kvm;
47 47 void (*ack_notifier)(void *opaque, int irq);
48   - struct mutex lock;
  48 + spinlock_t lock;
49 49 DECLARE_BITMAP(handled_vectors, 256);
50 50 };
51 51