[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 06/16] qemu-char: Fix a race reporting opens and clo
From: |
minyard |
Subject: |
[Qemu-devel] [PATCH 06/16] qemu-char: Fix a race reporting opens and closes |
Date: |
Sun, 15 Jul 2012 15:25:01 -0500 |
From: Corey Minyard <address@hidden>
When an open event is reported, it is done through a bh. But close
events are reported immediately. So if an open event is in the bh
and a close occurs, an extraneous open happens, which can confuse a
user.
To fix this, this patch sets the "opened" flag immediately instead
of in the bh handler and checks to make sure the opened flag is
set before reporting an open event.
This also modifies the spice code to call qemu_chr_generic_open
to report an open, to keep things consistent.
Signed-off-by: Corey Minyard <address@hidden>
---
qemu-char.c | 17 +++++++++++++++--
spice-qemu-char.c | 6 ++++--
2 files changed, 19 insertions(+), 4 deletions(-)
diff --git a/qemu-char.c b/qemu-char.c
index 76d4deb..3d4302d 100644
--- a/qemu-char.c
+++ b/qemu-char.c
@@ -111,9 +111,12 @@ void qemu_chr_be_event(CharDriverState *s, int event)
/* Keep track if the char device is open */
switch (event) {
case CHR_EVENT_OPENED:
+ /*
+ * See the comment in qemu_chr_generic_open_bh() for why
+ * 's->opened = 1' is not here.
+ */
if (s->recon_timer)
qemu_del_timer(s->recon_timer);
- s->opened = 1;
break;
case CHR_EVENT_CLOSED:
if (s->recon_timer)
@@ -132,13 +135,23 @@ void qemu_chr_be_event(CharDriverState *s, int event)
static void qemu_chr_generic_open_bh(void *opaque)
{
CharDriverState *s = opaque;
- qemu_chr_be_event(s, CHR_EVENT_OPENED);
+ /*
+ * Since the "close" event doesn't go through a bh, there is a
+ * possible race condition if a close comes in after an open, but
+ * the open is in the bh queue. So we double-check here, and we
+ * set opened in qemu_chr_generic_open() instead of
+ * qemu_chr_be_event().
+ */
+ if (s->opened)
+ qemu_chr_be_event(s, CHR_EVENT_OPENED);
qemu_bh_delete(s->bh);
s->bh = NULL;
}
void qemu_chr_generic_open(CharDriverState *s)
{
+ /* See the comment in qemu_chr_generic_open_bh() for why this is here */
+ s->opened = 1;
if (s->bh == NULL) {
s->bh = qemu_bh_new(qemu_chr_generic_open_bh, s);
qemu_bh_schedule(s->bh);
diff --git a/spice-qemu-char.c b/spice-qemu-char.c
index 2fb8a10..7c6d989 100644
--- a/spice-qemu-char.c
+++ b/spice-qemu-char.c
@@ -93,8 +93,10 @@ static void vmc_state(SpiceCharDeviceInstance *sin, int
connected)
return;
}
- qemu_chr_be_event(scd->chr,
- connected ? CHR_EVENT_OPENED : CHR_EVENT_CLOSED);
+ if (connected)
+ qemu_chr_generic_open(scd->chr);
+ else
+ qemu_chr_be_event(scd->chr, CHR_EVENT_CLOSED);
}
static SpiceCharDeviceInterface vmc_interface = {
--
1.7.4.1
- [Qemu-devel] [PATCH 10/16] qom: release previous object when setting, (continued)
- [Qemu-devel] [PATCH 10/16] qom: release previous object when setting, minyard, 2012/07/15
- [Qemu-devel] [PATCH 07/16] qemu-char: remove free of chr from win_stdio_close, minyard, 2012/07/15
- [Qemu-devel] [PATCH 15/16] IPMI: Add a local BMC simulation, minyard, 2012/07/15
- [Qemu-devel] [PATCH 02/16] pc: move SMBIOS setup to after device init, minyard, 2012/07/15
- [Qemu-devel] [PATCH 03/16] vl: Move init_timer_alarm() earlier, minyard, 2012/07/15
- [Qemu-devel] [PATCH 14/16] IPMI: Add a BT low-level interface, minyard, 2012/07/15
- [Qemu-devel] [PATCH 16/16] IPMI: Add an external connection simulation interface, minyard, 2012/07/15
- [Qemu-devel] [PATCH 05/16] qemu-char: Allow a chardev to reconnect if disconnected, minyard, 2012/07/15
- [Qemu-devel] [PATCH 06/16] qemu-char: Fix a race reporting opens and closes,
minyard <=
- [Qemu-devel] [PATCH 04/16] qemu-char: Allocate CharDriverState in qemu_chr_new_from_opts, minyard, 2012/07/15
- [Qemu-devel] [PATCH 11/16] Add a base IPMI interface, minyard, 2012/07/15
- [Qemu-devel] [PATCH 09/16] qdev: Add a pre-firmware init capability, minyard, 2012/07/15
- [Qemu-devel] [PATCH 08/16] qemu-char: Close fd at end of file, minyard, 2012/07/15
- [Qemu-devel] [PATCH 12/16] IPMI: Add a PC ISA type structure, minyard, 2012/07/15
- [Qemu-devel] [PATCH 13/16] IPMI: Add a KCS low-level interface, minyard, 2012/07/15
- Re: [Qemu-devel] [PATCH 01/16] smbios: Add a function to directly add an entry, Corey Minyard, 2012/07/15
- Re: [Qemu-devel] [PATCH 01/16] smbios: Add a function to directly add an entry, Eric Blake, 2012/07/16