qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: minyard@acm.org
To: qemu-devel@nongnu.org
Cc: Corey Minyard <cminyard@mvista.com>
Subject: [Qemu-devel] [PATCH 04/16] qemu-char: Fix a race reporting opens and closes
Date: Tue, 18 Sep 2012 15:00:31 -0500	[thread overview]
Message-ID: <1347998443-20599-5-git-send-email-minyard@acm.org> (raw)
In-Reply-To: <1347998443-20599-1-git-send-email-minyard@acm.org>

From: Corey Minyard <cminyard@mvista.com>

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 <cminyard@mvista.com>
---
 qemu-char.c       |   18 ++++++++++++++++--
 spice-qemu-char.c |    7 +++++--
 2 files changed, 21 insertions(+), 4 deletions(-)

diff --git a/qemu-char.c b/qemu-char.c
index f6a671b..9e3ac40 100644
--- a/qemu-char.c
+++ b/qemu-char.c
@@ -111,10 +111,13 @@ 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) {
@@ -134,13 +137,24 @@ 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..d7516bd 100644
--- a/spice-qemu-char.c
+++ b/spice-qemu-char.c
@@ -93,8 +93,11 @@ 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

  parent reply	other threads:[~2012-09-18 20:01 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-09-18 20:00 [Qemu-devel] [PATCH 00/16 v4] Add an IPMI device to qemu minyard
2012-09-18 20:00 ` [Qemu-devel] [PATCH 01/16] vl: Move init_timer_alarm() earlier minyard
2012-09-18 20:00 ` [Qemu-devel] [PATCH 02/16] qemu-char: Allocate CharDriverState in qemu_chr_new_from_opts minyard
2012-09-18 20:00 ` [Qemu-devel] [PATCH 03/16] qemu-char: Allow a chardev to reconnect if disconnected minyard
2012-09-18 20:00 ` minyard [this message]
2012-09-18 20:00 ` [Qemu-devel] [PATCH 05/16] qemu-char: remove free of chr from win_stdio_close minyard
2012-09-18 20:00 ` [Qemu-devel] [PATCH 06/16] qemu-char: Close fd at end of file minyard
2012-09-18 20:00 ` [Qemu-devel] [PATCH 07/16] qom: release previous object when setting minyard
2012-09-18 20:00 ` [Qemu-devel] [PATCH 08/16] Add a base IPMI interface minyard
2012-09-18 20:00 ` [Qemu-devel] [PATCH 09/16] IPMI: Add a PC ISA type structure minyard
2012-09-18 20:00 ` [Qemu-devel] [PATCH 10/16] IPMI: Add a KCS low-level interface minyard
2012-09-18 20:00 ` [Qemu-devel] [PATCH 11/16] IPMI: Add a BT " minyard
2012-09-18 20:00 ` [Qemu-devel] [PATCH 12/16] IPMI: Add a local BMC simulation minyard
2012-09-18 20:00 ` [Qemu-devel] [PATCH 13/16] IPMI: Add an external connection simulation interface minyard
2013-04-02 11:32   ` Zang Hongyong
2013-04-03 13:43     ` Corey Minyard
2012-09-18 20:00 ` [Qemu-devel] [PATCH 14/16] IPMI: Add tests minyard
2012-09-18 20:00 ` [Qemu-devel] [PATCH 15/16] IPMI: Add documentation minyard
2012-09-18 20:00 ` [Qemu-devel] [PATCH 16/16] ipmi: Add migration capability to the IPMI device minyard
2012-10-04 21:29 ` [Qemu-devel] [PATCH 00/16 v4] Add an IPMI device to qemu Corey Minyard

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=1347998443-20599-5-git-send-email-minyard@acm.org \
    --to=minyard@acm.org \
    --cc=cminyard@mvista.com \
    --cc=qemu-devel@nongnu.org \
    /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;
as well as URLs for NNTP newsgroup(s).