aboutsummaryrefslogtreecommitdiffstats
path: root/tools/console/daemon/io.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/console/daemon/io.c')
-rw-r--r--tools/console/daemon/io.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/tools/console/daemon/io.c b/tools/console/daemon/io.c
index 5d4d7877bb..66db0f89cb 100644
--- a/tools/console/daemon/io.c
+++ b/tools/console/daemon/io.c
@@ -63,6 +63,7 @@ extern int log_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)
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 *buffer, size_t len)
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) {