diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2010-02-17 09:00:41 -0500 |
---|---|---|
committer | Marcelo Tosatti <mtosatti@redhat.com> | 2010-03-01 10:36:12 -0500 |
commit | fa8273e9549b3cee2947d1aebe5242e7a25eb3de (patch) | |
tree | 4a9c8b38fe5a4a1a8d366f898afd47512dee1f36 | |
parent | e424e1918345ab17d3beb068b8745ab1706d0e1b (diff) |
KVM: Convert i8254/i8259 locks to raw_spinlocks
The i8254/i8259 locks need to be real spinlocks on preempt-rt. Convert
them to raw_spinlock. No change for !RT kernels.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Avi Kivity <avi@redhat.com>
-rw-r--r-- | arch/x86/kvm/i8254.c | 10 | ||||
-rw-r--r-- | arch/x86/kvm/i8254.h | 2 | ||||
-rw-r--r-- | arch/x86/kvm/i8259.c | 31 | ||||
-rw-r--r-- | arch/x86/kvm/irq.h | 2 | ||||
-rw-r--r-- | arch/x86/kvm/x86.c | 8 |
5 files changed, 27 insertions, 26 deletions
diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c index c9569f20dfba..294698b6daff 100644 --- a/arch/x86/kvm/i8254.c +++ b/arch/x86/kvm/i8254.c | |||
@@ -242,11 +242,11 @@ static void kvm_pit_ack_irq(struct kvm_irq_ack_notifier *kian) | |||
242 | { | 242 | { |
243 | struct kvm_kpit_state *ps = container_of(kian, struct kvm_kpit_state, | 243 | struct kvm_kpit_state *ps = container_of(kian, struct kvm_kpit_state, |
244 | irq_ack_notifier); | 244 | irq_ack_notifier); |
245 | spin_lock(&ps->inject_lock); | 245 | raw_spin_lock(&ps->inject_lock); |
246 | if (atomic_dec_return(&ps->pit_timer.pending) < 0) | 246 | if (atomic_dec_return(&ps->pit_timer.pending) < 0) |
247 | atomic_inc(&ps->pit_timer.pending); | 247 | atomic_inc(&ps->pit_timer.pending); |
248 | ps->irq_ack = 1; | 248 | ps->irq_ack = 1; |
249 | spin_unlock(&ps->inject_lock); | 249 | raw_spin_unlock(&ps->inject_lock); |
250 | } | 250 | } |
251 | 251 | ||
252 | void __kvm_migrate_pit_timer(struct kvm_vcpu *vcpu) | 252 | void __kvm_migrate_pit_timer(struct kvm_vcpu *vcpu) |
@@ -624,7 +624,7 @@ struct kvm_pit *kvm_create_pit(struct kvm *kvm, u32 flags) | |||
624 | 624 | ||
625 | mutex_init(&pit->pit_state.lock); | 625 | mutex_init(&pit->pit_state.lock); |
626 | mutex_lock(&pit->pit_state.lock); | 626 | mutex_lock(&pit->pit_state.lock); |
627 | spin_lock_init(&pit->pit_state.inject_lock); | 627 | raw_spin_lock_init(&pit->pit_state.inject_lock); |
628 | 628 | ||
629 | kvm->arch.vpit = pit; | 629 | kvm->arch.vpit = pit; |
630 | pit->kvm = kvm; | 630 | pit->kvm = kvm; |
@@ -724,12 +724,12 @@ void kvm_inject_pit_timer_irqs(struct kvm_vcpu *vcpu) | |||
724 | /* Try to inject pending interrupts when | 724 | /* Try to inject pending interrupts when |
725 | * last one has been acked. | 725 | * last one has been acked. |
726 | */ | 726 | */ |
727 | spin_lock(&ps->inject_lock); | 727 | raw_spin_lock(&ps->inject_lock); |
728 | if (atomic_read(&ps->pit_timer.pending) && ps->irq_ack) { | 728 | if (atomic_read(&ps->pit_timer.pending) && ps->irq_ack) { |
729 | ps->irq_ack = 0; | 729 | ps->irq_ack = 0; |
730 | inject = 1; | 730 | inject = 1; |
731 | } | 731 | } |
732 | spin_unlock(&ps->inject_lock); | 732 | raw_spin_unlock(&ps->inject_lock); |
733 | if (inject) | 733 | if (inject) |
734 | __inject_pit_timer_intr(kvm); | 734 | __inject_pit_timer_intr(kvm); |
735 | } | 735 | } |
diff --git a/arch/x86/kvm/i8254.h b/arch/x86/kvm/i8254.h index d4c1c7ffdc09..900d6b0ba7c2 100644 --- a/arch/x86/kvm/i8254.h +++ b/arch/x86/kvm/i8254.h | |||
@@ -27,7 +27,7 @@ struct kvm_kpit_state { | |||
27 | u32 speaker_data_on; | 27 | u32 speaker_data_on; |
28 | struct mutex lock; | 28 | struct mutex lock; |
29 | struct kvm_pit *pit; | 29 | struct kvm_pit *pit; |
30 | spinlock_t inject_lock; | 30 | raw_spinlock_t inject_lock; |
31 | unsigned long irq_ack; | 31 | unsigned long irq_ack; |
32 | struct kvm_irq_ack_notifier irq_ack_notifier; | 32 | struct kvm_irq_ack_notifier irq_ack_notifier; |
33 | }; | 33 | }; |
diff --git a/arch/x86/kvm/i8259.c b/arch/x86/kvm/i8259.c index a3711f9e580f..07771da85de5 100644 --- a/arch/x86/kvm/i8259.c +++ b/arch/x86/kvm/i8259.c | |||
@@ -44,18 +44,19 @@ static void pic_clear_isr(struct kvm_kpic_state *s, int irq) | |||
44 | * Other interrupt may be delivered to PIC while lock is dropped but | 44 | * Other interrupt may be delivered to PIC while lock is dropped but |
45 | * it should be safe since PIC state is already updated at this stage. | 45 | * it should be safe since PIC state is already updated at this stage. |
46 | */ | 46 | */ |
47 | spin_unlock(&s->pics_state->lock); | 47 | raw_spin_unlock(&s->pics_state->lock); |
48 | kvm_notify_acked_irq(s->pics_state->kvm, SELECT_PIC(irq), irq); | 48 | kvm_notify_acked_irq(s->pics_state->kvm, SELECT_PIC(irq), irq); |
49 | spin_lock(&s->pics_state->lock); | 49 | raw_spin_lock(&s->pics_state->lock); |
50 | } | 50 | } |
51 | 51 | ||
52 | void kvm_pic_clear_isr_ack(struct kvm *kvm) | 52 | void kvm_pic_clear_isr_ack(struct kvm *kvm) |
53 | { | 53 | { |
54 | struct kvm_pic *s = pic_irqchip(kvm); | 54 | struct kvm_pic *s = pic_irqchip(kvm); |
55 | spin_lock(&s->lock); | 55 | |
56 | raw_spin_lock(&s->lock); | ||
56 | s->pics[0].isr_ack = 0xff; | 57 | s->pics[0].isr_ack = 0xff; |
57 | s->pics[1].isr_ack = 0xff; | 58 | s->pics[1].isr_ack = 0xff; |
58 | spin_unlock(&s->lock); | 59 | raw_spin_unlock(&s->lock); |
59 | } | 60 | } |
60 | 61 | ||
61 | /* | 62 | /* |
@@ -156,9 +157,9 @@ static void pic_update_irq(struct kvm_pic *s) | |||
156 | 157 | ||
157 | void kvm_pic_update_irq(struct kvm_pic *s) | 158 | void kvm_pic_update_irq(struct kvm_pic *s) |
158 | { | 159 | { |
159 | spin_lock(&s->lock); | 160 | raw_spin_lock(&s->lock); |
160 | pic_update_irq(s); | 161 | pic_update_irq(s); |
161 | spin_unlock(&s->lock); | 162 | raw_spin_unlock(&s->lock); |
162 | } | 163 | } |
163 | 164 | ||
164 | int kvm_pic_set_irq(void *opaque, int irq, int level) | 165 | int kvm_pic_set_irq(void *opaque, int irq, int level) |
@@ -166,14 +167,14 @@ int kvm_pic_set_irq(void *opaque, int irq, int level) | |||
166 | struct kvm_pic *s = opaque; | 167 | struct kvm_pic *s = opaque; |
167 | int ret = -1; | 168 | int ret = -1; |
168 | 169 | ||
169 | spin_lock(&s->lock); | 170 | raw_spin_lock(&s->lock); |
170 | if (irq >= 0 && irq < PIC_NUM_PINS) { | 171 | if (irq >= 0 && irq < PIC_NUM_PINS) { |
171 | ret = pic_set_irq1(&s->pics[irq >> 3], irq & 7, level); | 172 | ret = pic_set_irq1(&s->pics[irq >> 3], irq & 7, level); |
172 | pic_update_irq(s); | 173 | pic_update_irq(s); |
173 | trace_kvm_pic_set_irq(irq >> 3, irq & 7, s->pics[irq >> 3].elcr, | 174 | trace_kvm_pic_set_irq(irq >> 3, irq & 7, s->pics[irq >> 3].elcr, |
174 | s->pics[irq >> 3].imr, ret == 0); | 175 | s->pics[irq >> 3].imr, ret == 0); |
175 | } | 176 | } |
176 | spin_unlock(&s->lock); | 177 | raw_spin_unlock(&s->lock); |
177 | 178 | ||
178 | return ret; | 179 | return ret; |
179 | } | 180 | } |
@@ -203,7 +204,7 @@ int kvm_pic_read_irq(struct kvm *kvm) | |||
203 | int irq, irq2, intno; | 204 | int irq, irq2, intno; |
204 | struct kvm_pic *s = pic_irqchip(kvm); | 205 | struct kvm_pic *s = pic_irqchip(kvm); |
205 | 206 | ||
206 | spin_lock(&s->lock); | 207 | raw_spin_lock(&s->lock); |
207 | irq = pic_get_irq(&s->pics[0]); | 208 | irq = pic_get_irq(&s->pics[0]); |
208 | if (irq >= 0) { | 209 | if (irq >= 0) { |
209 | pic_intack(&s->pics[0], irq); | 210 | pic_intack(&s->pics[0], irq); |
@@ -228,7 +229,7 @@ int kvm_pic_read_irq(struct kvm *kvm) | |||
228 | intno = s->pics[0].irq_base + irq; | 229 | intno = s->pics[0].irq_base + irq; |
229 | } | 230 | } |
230 | pic_update_irq(s); | 231 | pic_update_irq(s); |
231 | spin_unlock(&s->lock); | 232 | raw_spin_unlock(&s->lock); |
232 | 233 | ||
233 | return intno; | 234 | return intno; |
234 | } | 235 | } |
@@ -442,7 +443,7 @@ static int picdev_write(struct kvm_io_device *this, | |||
442 | printk(KERN_ERR "PIC: non byte write\n"); | 443 | printk(KERN_ERR "PIC: non byte write\n"); |
443 | return 0; | 444 | return 0; |
444 | } | 445 | } |
445 | spin_lock(&s->lock); | 446 | raw_spin_lock(&s->lock); |
446 | switch (addr) { | 447 | switch (addr) { |
447 | case 0x20: | 448 | case 0x20: |
448 | case 0x21: | 449 | case 0x21: |
@@ -455,7 +456,7 @@ static int picdev_write(struct kvm_io_device *this, | |||
455 | elcr_ioport_write(&s->pics[addr & 1], addr, data); | 456 | elcr_ioport_write(&s->pics[addr & 1], addr, data); |
456 | break; | 457 | break; |
457 | } | 458 | } |
458 | spin_unlock(&s->lock); | 459 | raw_spin_unlock(&s->lock); |
459 | return 0; | 460 | return 0; |
460 | } | 461 | } |
461 | 462 | ||
@@ -472,7 +473,7 @@ static int picdev_read(struct kvm_io_device *this, | |||
472 | printk(KERN_ERR "PIC: non byte read\n"); | 473 | printk(KERN_ERR "PIC: non byte read\n"); |
473 | return 0; | 474 | return 0; |
474 | } | 475 | } |
475 | spin_lock(&s->lock); | 476 | raw_spin_lock(&s->lock); |
476 | switch (addr) { | 477 | switch (addr) { |
477 | case 0x20: | 478 | case 0x20: |
478 | case 0x21: | 479 | case 0x21: |
@@ -486,7 +487,7 @@ static int picdev_read(struct kvm_io_device *this, | |||
486 | break; | 487 | break; |
487 | } | 488 | } |
488 | *(unsigned char *)val = data; | 489 | *(unsigned char *)val = data; |
489 | spin_unlock(&s->lock); | 490 | raw_spin_unlock(&s->lock); |
490 | return 0; | 491 | return 0; |
491 | } | 492 | } |
492 | 493 | ||
@@ -520,7 +521,7 @@ struct kvm_pic *kvm_create_pic(struct kvm *kvm) | |||
520 | s = kzalloc(sizeof(struct kvm_pic), GFP_KERNEL); | 521 | s = kzalloc(sizeof(struct kvm_pic), GFP_KERNEL); |
521 | if (!s) | 522 | if (!s) |
522 | return NULL; | 523 | return NULL; |
523 | spin_lock_init(&s->lock); | 524 | raw_spin_lock_init(&s->lock); |
524 | s->kvm = kvm; | 525 | s->kvm = kvm; |
525 | s->pics[0].elcr_mask = 0xf8; | 526 | s->pics[0].elcr_mask = 0xf8; |
526 | s->pics[1].elcr_mask = 0xde; | 527 | s->pics[1].elcr_mask = 0xde; |
diff --git a/arch/x86/kvm/irq.h b/arch/x86/kvm/irq.h index 0b71d480ebf1..34b15915754d 100644 --- a/arch/x86/kvm/irq.h +++ b/arch/x86/kvm/irq.h | |||
@@ -62,7 +62,7 @@ struct kvm_kpic_state { | |||
62 | }; | 62 | }; |
63 | 63 | ||
64 | struct kvm_pic { | 64 | struct kvm_pic { |
65 | spinlock_t lock; | 65 | raw_spinlock_t lock; |
66 | unsigned pending_acks; | 66 | unsigned pending_acks; |
67 | struct kvm *kvm; | 67 | struct kvm *kvm; |
68 | struct kvm_kpic_state pics[2]; /* 0 is master pic, 1 is slave pic */ | 68 | struct kvm_kpic_state pics[2]; /* 0 is master pic, 1 is slave pic */ |
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 86b739f8f173..f6ae4875d9d0 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
@@ -2542,18 +2542,18 @@ static int kvm_vm_ioctl_set_irqchip(struct kvm *kvm, struct kvm_irqchip *chip) | |||
2542 | r = 0; | 2542 | r = 0; |
2543 | switch (chip->chip_id) { | 2543 | switch (chip->chip_id) { |
2544 | case KVM_IRQCHIP_PIC_MASTER: | 2544 | case KVM_IRQCHIP_PIC_MASTER: |
2545 | spin_lock(&pic_irqchip(kvm)->lock); | 2545 | raw_spin_lock(&pic_irqchip(kvm)->lock); |
2546 | memcpy(&pic_irqchip(kvm)->pics[0], | 2546 | memcpy(&pic_irqchip(kvm)->pics[0], |
2547 | &chip->chip.pic, | 2547 | &chip->chip.pic, |
2548 | sizeof(struct kvm_pic_state)); | 2548 | sizeof(struct kvm_pic_state)); |
2549 | spin_unlock(&pic_irqchip(kvm)->lock); | 2549 | raw_spin_unlock(&pic_irqchip(kvm)->lock); |
2550 | break; | 2550 | break; |
2551 | case KVM_IRQCHIP_PIC_SLAVE: | 2551 | case KVM_IRQCHIP_PIC_SLAVE: |
2552 | spin_lock(&pic_irqchip(kvm)->lock); | 2552 | raw_spin_lock(&pic_irqchip(kvm)->lock); |
2553 | memcpy(&pic_irqchip(kvm)->pics[1], | 2553 | memcpy(&pic_irqchip(kvm)->pics[1], |
2554 | &chip->chip.pic, | 2554 | &chip->chip.pic, |
2555 | sizeof(struct kvm_pic_state)); | 2555 | sizeof(struct kvm_pic_state)); |
2556 | spin_unlock(&pic_irqchip(kvm)->lock); | 2556 | raw_spin_unlock(&pic_irqchip(kvm)->lock); |
2557 | break; | 2557 | break; |
2558 | case KVM_IRQCHIP_IOAPIC: | 2558 | case KVM_IRQCHIP_IOAPIC: |
2559 | r = kvm_set_ioapic(kvm, &chip->chip.ioapic); | 2559 | r = kvm_set_ioapic(kvm, &chip->chip.ioapic); |