aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tools/console/daemon/io.c18
-rw-r--r--tools/console/daemon/main.c13
2 files changed, 25 insertions, 6 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) {
diff --git a/tools/console/daemon/main.c b/tools/console/daemon/main.c
index c66642ff46..c1529d0ac2 100644
--- a/tools/console/daemon/main.c
+++ b/tools/console/daemon/main.c
@@ -38,6 +38,7 @@ int log_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",