peterdelevoryas / rpms / qemu

Forked from rpms/qemu 2 years ago
Clone

Blame 0106-char-Throttle-when-host-connection-is-down.patch

22d63f
From c2ddb156db52808a89d91edf5bb1449f226d3ecd Mon Sep 17 00:00:00 2001
22d63f
Message-Id: <c2ddb156db52808a89d91edf5bb1449f226d3ecd.1354903384.git.crobinso@redhat.com>
22d63f
In-Reply-To: <9f0944a25bc1094fa7a74ac9df14e184e2c5c82d.1354903384.git.crobinso@redhat.com>
22d63f
References: <9f0944a25bc1094fa7a74ac9df14e184e2c5c82d.1354903384.git.crobinso@redhat.com>
22d63f
From: Amit Shah <amit.shah@redhat.com>
22d63f
Date: Mon, 21 Mar 2011 22:05:10 +0100
22d63f
Subject: [PATCH] char: Throttle when host connection is down#
22d63f
22d63f
When the host-side connection goes down, throttle the virtio-serial bus
22d63f
and later unthrottle when a connection gets established.  This helps
22d63f
prevent any lost IO (guest->host) while the host connection was down.
22d63f
22d63f
Bugzilla: 621484
22d63f
22d63f
This commit actually helps the bug mentioned above as no writes will now
22d63f
get lost because of the throttling done here.  With just the patches
22d63f
sent earlier for that bug, one write will end up getting lost in the
22d63f
worst case (host d/c, guest write, host connect).
22d63f
22d63f
Signed-off-by: Amit Shah <amit.shah@redhat.com>
22d63f
Signed-off-by: Cole Robinson <crobinso@redhat.com>
22d63f
---
22d63f
 qemu-char.c | 14 ++++++++++++++
22d63f
 1 file changed, 14 insertions(+)
22d63f
22d63f
diff --git a/qemu-char.c b/qemu-char.c
22d63f
index e7cd42a..5c71f0c 100644
22d63f
--- a/qemu-char.c
22d63f
+++ b/qemu-char.c
22d63f
@@ -140,6 +140,9 @@ static void qemu_chr_fire_open_event(void *opaque)
22d63f
 {
22d63f
     CharDriverState *s = opaque;
22d63f
     qemu_chr_be_event(s, CHR_EVENT_OPENED);
22d63f
+    if (s->write_blocked) {
22d63f
+        char_write_unblocked(s);
22d63f
+    }
22d63f
     qemu_free_timer(s->open_timer);
22d63f
     s->open_timer = NULL;
22d63f
 }
22d63f
@@ -2249,6 +2252,17 @@ static int tcp_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
22d63f
         ret = send_all(chr, s->fd, buf, len);
22d63f
         if (ret == -1 && errno == EPIPE) {
22d63f
             tcp_closed(chr);
22d63f
+
22d63f
+            if (chr->chr_enable_write_fd_handler && chr->chr_write_unblocked) {
22d63f
+                /*
22d63f
+                 * Since we haven't written out anything, let's say
22d63f
+                 * we're throttled.  This will prevent any output from
22d63f
+                 * the guest getting lost if host-side chardev goes
22d63f
+                 * down.  Unthrottle when we re-connect.
22d63f
+                 */
22d63f
+                chr->write_blocked = true;
22d63f
+                return 0;
22d63f
+            }
22d63f
         }
22d63f
         return ret;
22d63f
     } else {
22d63f
-- 
22d63f
1.8.0
22d63f