From: Marcelo Tosatti <mtosatti@redhat.com>
To: Avi Kivity <avi@qumranet.com>, Anthony Liguori <aliguori@us.ibm.com>
Cc: kvm-devel <kvm-devel@lists.sourceforge.net>
Subject: [patch 05/13] QEMU: add a mutex to protect IRQ chip data structures
Date: Thu, 17 Apr 2008 17:10:26 -0300 [thread overview]
Message-ID: <20080417203026.576197920@localhost.localdomain> (raw)
In-Reply-To: 20080417201021.515148882@localhost.localdomain
[-- Attachment #1: qemu-irq-lock --]
[-- Type: text/plain, Size: 6922 bytes --]
Subject says it all.
With KVM in-kernel irqchip this is unused.
Index: kvm-userspace.io/qemu/hw/apic.c
===================================================================
--- kvm-userspace.io.orig/qemu/hw/apic.c
+++ kvm-userspace.io/qemu/hw/apic.c
@@ -478,6 +478,8 @@ int apic_get_interrupt(CPUState *env)
APICState *s = env->apic_state;
int intno;
+ assert_is_locked(&irq_mutex);
+
/* if the APIC is installed or enabled, we let the 8259 handle the
IRQs */
if (!s)
@@ -597,6 +599,8 @@ static uint32_t apic_mem_readl(void *opa
return 0;
s = env->apic_state;
+ qemu_mutex_lock(&irq_mutex);
+
index = (addr >> 4) & 0xff;
switch(index) {
case 0x02: /* id */
@@ -659,6 +663,7 @@ static uint32_t apic_mem_readl(void *opa
val = 0;
break;
}
+ qemu_mutex_unlock(&irq_mutex);
#ifdef DEBUG_APIC
printf("APIC read: %08x = %08x\n", (uint32_t)addr, val);
#endif
@@ -676,6 +681,8 @@ static void apic_mem_writel(void *opaque
return;
s = env->apic_state;
+ qemu_mutex_lock(&irq_mutex);
+
#ifdef DEBUG_APIC
printf("APIC write: %08x = %08x\n", (uint32_t)addr, val);
#endif
@@ -748,6 +755,8 @@ static void apic_mem_writel(void *opaque
s->esr |= ESR_ILLEGAL_ADDRESS;
break;
}
+
+ qemu_mutex_unlock(&irq_mutex);
}
#ifdef KVM_CAP_IRQCHIP
@@ -995,6 +1004,8 @@ static void ioapic_service(IOAPICState *
uint8_t polarity;
uint32_t deliver_bitmask[MAX_APIC_WORDS];
+ assert_is_locked(&irq_mutex);
+
for (i = 0; i < IOAPIC_NUM_PINS; i++) {
mask = 1 << i;
if (s->irr & mask) {
@@ -1087,9 +1098,12 @@ static void ioapic_mem_writel(void *opaq
IOAPICState *s = opaque;
int index;
+ qemu_mutex_lock(&irq_mutex);
+
addr &= 0xff;
if (addr == 0x00) {
s->ioregsel = val;
+ qemu_mutex_unlock(&irq_mutex);
return;
} else if (addr == 0x10) {
#ifdef DEBUG_IOAPIC
@@ -1113,6 +1127,7 @@ static void ioapic_mem_writel(void *opaq
s->ioredtbl[index] |= val;
}
ioapic_service(s);
+ qemu_mutex_unlock(&irq_mutex);
}
}
}
Index: kvm-userspace.io/qemu/hw/i8259.c
===================================================================
--- kvm-userspace.io.orig/qemu/hw/i8259.c
+++ kvm-userspace.io/qemu/hw/i8259.c
@@ -78,6 +78,7 @@ static uint64_t irq_count[16];
static inline void pic_set_irq1(PicState *s, int irq, int level)
{
int mask;
+ assert_is_locked(&irq_mutex);
mask = 1 << irq;
if (s->elcr & mask) {
/* level triggered */
@@ -118,6 +119,8 @@ static int pic_get_irq(PicState *s)
{
int mask, cur_priority, priority;
+ assert_is_locked(&irq_mutex);
+
mask = s->irr & ~s->imr;
priority = get_priority(s, mask);
if (priority == 8)
@@ -189,6 +192,7 @@ static void i8259_set_irq(void *opaque,
if (kvm_set_irq(irq, level))
return;
#endif
+ qemu_mutex_lock(&irq_mutex);
#if defined(DEBUG_PIC) || defined(DEBUG_IRQ_COUNT)
if (level != irq_level[irq]) {
#if defined(DEBUG_PIC)
@@ -211,6 +215,7 @@ static void i8259_set_irq(void *opaque,
if (s->alt_irq_func)
s->alt_irq_func(s->alt_irq_opaque, irq, level);
pic_update_irq(s);
+ qemu_mutex_unlock(&irq_mutex);
}
/* acknowledge interrupt 'irq' */
@@ -309,6 +314,7 @@ static void pic_ioport_write(void *opaqu
PicState *s = opaque;
int priority, cmd, irq;
+ qemu_mutex_lock(&irq_mutex);
#ifdef DEBUG_PIC
printf("pic_write: addr=0x%02x val=0x%02x\n", addr, val);
#endif
@@ -394,6 +400,7 @@ static void pic_ioport_write(void *opaqu
break;
}
}
+ qemu_mutex_unlock(&irq_mutex);
}
static uint32_t pic_poll_read (PicState *s, uint32_t addr1)
@@ -424,6 +431,7 @@ static uint32_t pic_ioport_read(void *op
unsigned int addr;
int ret;
+ qemu_mutex_lock(&irq_mutex);
addr = addr1;
addr &= 1;
if (s->poll) {
@@ -439,6 +447,7 @@ static uint32_t pic_ioport_read(void *op
ret = s->imr;
}
}
+ qemu_mutex_unlock(&irq_mutex);
#ifdef DEBUG_PIC
printf("pic_read: addr=0x%02x val=0x%02x\n", addr1, ret);
#endif
@@ -451,11 +460,13 @@ uint32_t pic_intack_read(PicState2 *s)
{
int ret;
+ qemu_mutex_lock(&irq_mutex);
ret = pic_poll_read(&s->pics[0], 0x00);
if (ret == 2)
ret = pic_poll_read(&s->pics[1], 0x80) + 8;
/* Prepare for ISR read */
s->pics[0].read_reg_select = 1;
+ qemu_mutex_unlock(&irq_mutex);
return ret;
}
Index: kvm-userspace.io/qemu/hw/pc.c
===================================================================
--- kvm-userspace.io.orig/qemu/hw/pc.c
+++ kvm-userspace.io/qemu/hw/pc.c
@@ -53,6 +53,8 @@ static PITState *pit;
static IOAPICState *ioapic;
static PCIDevice *i440fx_state;
+qemu_mutex_t irq_mutex;
+
static void ioport80_write(void *opaque, uint32_t addr, uint32_t data)
{
}
@@ -99,24 +101,30 @@ int cpu_get_pic_interrupt(CPUState *env)
{
int intno;
+ qemu_mutex_lock(&irq_mutex);
intno = apic_get_interrupt(env);
if (intno >= 0) {
/* set irq request if a PIC irq is still pending */
/* XXX: improve that */
pic_update_irq(isa_pic);
- return intno;
+ goto out;
}
/* read the irq from the PIC */
- if (!apic_accept_pic_intr(env))
- return -1;
+ if (!apic_accept_pic_intr(env)) {
+ intno = -1;
+ goto out;
+ }
intno = pic_read_irq(isa_pic);
+out:
+ qemu_mutex_unlock(&irq_mutex);
return intno;
}
static void pic_irq_request(void *opaque, int irq, int level)
{
CPUState *env = opaque;
+ assert_is_locked(&irq_mutex);
if (level && apic_accept_pic_intr(env))
cpu_interrupt(env, CPU_INTERRUPT_HARD);
}
@@ -783,6 +791,8 @@ static void pc_init1(ram_addr_t ram_size
BlockDriverState *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
BlockDriverState *fd[MAX_FD];
+ qemu_mutex_init(&irq_mutex);
+
if (ram_size >= 0xe0000000 ) {
above_4g_mem_size = ram_size - 0xe0000000;
ram_size = 0xe0000000;
Index: kvm-userspace.io/qemu/hw/pc.h
===================================================================
--- kvm-userspace.io.orig/qemu/hw/pc.h
+++ kvm-userspace.io/qemu/hw/pc.h
@@ -2,6 +2,8 @@
#define HW_PC_H
/* PC-style peripherals (also used by other machines). */
+extern qemu_mutex_t irq_mutex;
+
/* serial.c */
SerialState *serial_init(int base, qemu_irq irq, CharDriverState *chr);
--
-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference
Don't miss this year's exciting event. There's still time to save $100.
Use priority code J8TL2D2.
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
next prev parent reply other threads:[~2008-04-17 20:10 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-04-17 20:10 [patch 00/13] RFC: split the global mutex Marcelo Tosatti
2008-04-17 20:10 ` [patch 01/13] QEMU: get rid of global cpu_single_env Marcelo Tosatti
2008-04-17 20:10 ` [patch 02/13] QEMU: introduce QEMUDevice Marcelo Tosatti
2008-04-17 20:10 ` [patch 03/13] QEMU: make esp.c build conditional to SPARC target Marcelo Tosatti
2008-04-17 20:10 ` [patch 04/13] QEMU: plug QEMUDevice pt1 / ioport awareness Marcelo Tosatti
2008-04-17 20:10 ` Marcelo Tosatti [this message]
2008-04-17 20:10 ` [patch 06/13] QEMU: plug QEMUDevice pt2 / iomem awareness Marcelo Tosatti
2008-04-17 20:10 ` [patch 07/13] QEMU: grab device lock for ioport/iomem processing Marcelo Tosatti
2008-04-17 20:10 ` [patch 08/13] QEMU: character device locking Marcelo Tosatti
2008-04-17 20:10 ` [patch 09/13] QEMU: network " Marcelo Tosatti
2008-04-17 20:10 ` [patch 10/13] QEMU: get rid of aiocb cache Marcelo Tosatti
2008-04-17 20:10 ` [patch 11/13] QEMU: block device locking Marcelo Tosatti
2008-04-17 20:10 ` [patch 12/13] QEMU: scsi-disk reentrancy fix Marcelo Tosatti
2008-04-17 20:10 ` [patch 13/13] QEMU/KVM: get rid of global lock Marcelo Tosatti
2008-04-20 11:16 ` [patch 00/13] RFC: split the global mutex Avi Kivity
2008-04-21 0:00 ` Marcelo Tosatti
2008-04-21 6:10 ` Avi Kivity
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20080417203026.576197920@localhost.localdomain \
--to=mtosatti@redhat.com \
--cc=aliguori@us.ibm.com \
--cc=avi@qumranet.com \
--cc=kvm-devel@lists.sourceforge.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox