[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] unnecessary removal of guest console characters
Hi all,currently when max_capacity is set in xenconsoled and the buffer if completely filled then some characters in the buffer are discarded (even though the rate limitation makes this unlikely to happen). A better way to handle this scenario would be to stop reading from the ring until the buffer has some free space. I am attaching a simple patch that does exactly this. Best Regards, Stefano Stabellini Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> diff -r 082d3886fded tools/console/daemon/io.c --- a/tools/console/daemon/io.c Fri Apr 11 09:14:03 2008 +0100 +++ b/tools/console/daemon/io.c Fri Apr 11 14:12:51 2008 +0100 @@ -200,21 +200,6 @@ static void buffer_append(struct domain "on domain %d: %d (%s)\n", dom->domid, errno, strerror(errno)); } - - if (buffer->max_capacity && - buffer->size > buffer->max_capacity) { - /* Discard the middle of the data. */ - - size_t over = buffer->size - buffer->max_capacity; - char *maxpos = buffer->data + buffer->max_capacity; - - memmove(maxpos - over, maxpos, over); - buffer->data = realloc(buffer->data, buffer->max_capacity); - buffer->size = buffer->capacity = buffer->max_capacity; - - if (buffer->consumed > buffer->max_capacity - over) - buffer->consumed = buffer->max_capacity - over; - } } static bool buffer_empty(struct buffer *buffer) @@ -228,6 +213,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 +995,12 @@ 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 (!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) { _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |