WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] [xen-unstable] console: Provide option to stall the inte

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] console: Provide option to stall the inter-domain console ring rather
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Tue, 22 Apr 2008 07:10:48 -0700
Delivery-date: Tue, 22 Apr 2008 07:43:21 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1208856895 -3600
# Node ID 78d0a147216f120b6bfffb137ace905ee469b417
# Parent  5e3baace443f0481a4129deb0de017aa72092815
console: Provide option to stall the inter-domain console ring rather
than discard characters in the console daemon buffers.

New option: -o, --overflow-data=discard|keep

This option changes the behaviour when dealing with data that overflow
the max capacity of the buffer. If overflow-data is set to discard
(the default), the current behaviour is used: we discard some data in
the middle of the buffer.

If overflow-data is set to keep, we stop listening to the ring until
we free some space in the buffer. This can cause the ring to fill up
and the guest kernel internal buffer to fill up as well. When this
happens the guest kernel stops reading characters from the console
device so the application generating data hangs. When xenconsoled
resumes reading from the ring, the guest kernel will be able to resume
reading from the console device as well. At that point the guest
application will be allowed to continue.

The risk of making this behaviour the default is that existing kernel
drivers may assume they can rely on timely ring updates by the console
daemon and thus themselves block on the ring being emptied.

Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
---
 tools/console/daemon/io.c   |   18 ++++++++++++++----
 tools/console/daemon/main.c |   13 +++++++++++--
 2 files changed, 25 insertions(+), 6 deletions(-)

diff -r 5e3baace443f -r 78d0a147216f tools/console/daemon/io.c
--- a/tools/console/daemon/io.c Tue Apr 22 10:29:32 2008 +0100
+++ b/tools/console/daemon/io.c Tue Apr 22 10:34:55 2008 +0100
@@ -63,6 +63,7 @@ extern int log_time_hv;
 extern int log_time_hv;
 extern int log_time_guest;
 extern char *log_dir;
+extern int discard_overflowed_data;
 
 static int log_time_hv_needts = 1;
 static int log_time_guest_needts = 1;
@@ -201,7 +202,7 @@ static void buffer_append(struct domain 
                              dom->domid, errno, strerror(errno));
        }
 
-       if (buffer->max_capacity &&
+       if (discard_overflowed_data && buffer->max_capacity &&
            buffer->size > buffer->max_capacity) {
                /* Discard the middle of the data. */
 
@@ -228,6 +229,11 @@ static void buffer_advance(struct buffer
        if (buffer->consumed == buffer->size) {
                buffer->consumed = 0;
                buffer->size = 0;
+               if (buffer->max_capacity &&
+                   buffer->capacity > buffer->max_capacity) {
+                       buffer->data = realloc(buffer->data, 
buffer->max_capacity);
+                       buffer->capacity = buffer->max_capacity;
+               }
        }
 }
 
@@ -1005,9 +1011,13 @@ void handle_io(void)
                                    d->next_period < next_timeout)
                                        next_timeout = d->next_period;
                        } else if (d->xce_handle != -1) {
-                               int evtchn_fd = xc_evtchn_fd(d->xce_handle);
-                               FD_SET(evtchn_fd, &readfds);
-                               max_fd = MAX(evtchn_fd, max_fd);
+                               if (discard_overflowed_data ||
+                                   !d->buffer.max_capacity ||
+                                   d->buffer.size < d->buffer.max_capacity) {
+                                       int evtchn_fd = 
xc_evtchn_fd(d->xce_handle);
+                                       FD_SET(evtchn_fd, &readfds);
+                                       max_fd = MAX(evtchn_fd, max_fd);
+                               }
                        }
 
                        if (d->master_fd != -1) {
diff -r 5e3baace443f -r 78d0a147216f tools/console/daemon/main.c
--- a/tools/console/daemon/main.c       Tue Apr 22 10:29:32 2008 +0100
+++ b/tools/console/daemon/main.c       Tue Apr 22 10:34:55 2008 +0100
@@ -38,6 +38,7 @@ int log_time_hv = 0;
 int log_time_hv = 0;
 int log_time_guest = 0;
 char *log_dir = NULL;
+int discard_overflowed_data = 1;
 
 static void handle_hup(int sig)
 {
@@ -46,7 +47,7 @@ static void handle_hup(int sig)
 
 static void usage(char *name)
 {
-       printf("Usage: %s [-h] [-V] [-v] [-i] [--log=none|guest|hv|all] 
[--log-dir=DIR] [--pid-file=PATH] [-t, --timestamp=none|guest|hv|all]\n", name);
+       printf("Usage: %s [-h] [-V] [-v] [-i] [--log=none|guest|hv|all] 
[--log-dir=DIR] [--pid-file=PATH] [-t, --timestamp=none|guest|hv|all] [-o, 
--overflow-data=discard|keep]\n", name);
 }
 
 static void version(char *name)
@@ -56,7 +57,7 @@ static void version(char *name)
 
 int main(int argc, char **argv)
 {
-       const char *sopts = "hVvit:";
+       const char *sopts = "hVvit:o:";
        struct option lopts[] = {
                { "help", 0, 0, 'h' },
                { "version", 0, 0, 'V' },
@@ -66,6 +67,7 @@ int main(int argc, char **argv)
                { "log-dir", 1, 0, 'r' },
                { "pid-file", 1, 0, 'p' },
                { "timestamp", 1, 0, 't' },
+               { "overflow-data", 1, 0, 'o'},
                { 0 },
        };
        bool is_interactive = false;
@@ -119,6 +121,13 @@ int main(int argc, char **argv)
                                log_time_hv = 0;
                        }
                        break;
+               case 'o':
+                       if (!strcmp(optarg, "keep")) {
+                               discard_overflowed_data = 0;
+                       } else if (!strcmp(optarg, "discard")) {
+                               discard_overflowed_data = 1;
+                       }
+                       break;
                case '?':
                        fprintf(stderr,
                                "Try `%s --help' for more information\n",

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] console: Provide option to stall the inter-domain console ring rather, Xen patchbot-unstable <=