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 /arch/x86/kvm/i8259.c | |
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>
Diffstat (limited to 'arch/x86/kvm/i8259.c')
-rw-r--r-- | arch/x86/kvm/i8259.c | 31 |
1 files changed, 16 insertions, 15 deletions
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; |