[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Fix xenconsoled when sending lots of console data to a domU.
# HG changeset patch # User kaf24@xxxxxxxxxxxxxxxxxxxx # Node ID 7c994d80049c1a3003623b56c9667ca37fdd8b04 # Parent 9239f190736d85933bbe64eca0613c24c07617df Fix xenconsoled when sending lots of console data to a domU. Fixes bug #477. Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx> diff -r 9239f190736d -r 7c994d80049c tools/console/daemon/io.c --- a/tools/console/daemon/io.c Wed Mar 29 23:11:53 2006 +++ b/tools/console/daemon/io.c Thu Mar 30 10:38:56 2006 @@ -434,25 +434,36 @@ } } +static int ring_free_bytes(struct domain *dom) +{ + struct xencons_interface *intf = dom->interface; + XENCONS_RING_IDX cons, prod, space; + + cons = intf->in_cons; + prod = intf->in_prod; + mb(); + + space = prod - cons; + if (space > sizeof(intf->in)) + return 0; /* ring is screwed: ignore it */ + + return (sizeof(intf->in) - space); +} + static void handle_tty_read(struct domain *dom) { ssize_t len = 0; char msg[80]; int i; struct xencons_interface *intf = dom->interface; - XENCONS_RING_IDX cons, prod; - - cons = intf->in_cons; - prod = intf->in_prod; - mb(); - - if (sizeof(intf->in) > (prod - cons)) - len = sizeof(intf->in) - (prod - cons); + XENCONS_RING_IDX prod; + + len = ring_free_bytes(dom); + if (len == 0) + return; + if (len > sizeof(msg)) len = sizeof(msg); - - if (len == 0) - return; len = read(dom->tty_fd, msg, len); if (len < 1) { @@ -465,6 +476,7 @@ shutdown_domain(dom); } } else if (domain_is_valid(dom->domid)) { + prod = intf->in_prod; for (i = 0; i < len; i++) { intf->in[MASK_XENCONS_IDX(prod++, intf->in)] = msg[i]; @@ -514,7 +526,7 @@ (void)write_sync(dom->evtchn_fd, &v, sizeof(v)); } -static void handle_xs(int fd) +static void handle_xs(void) { char **vec; int domid; @@ -560,7 +572,7 @@ } if (d->tty_fd != -1) { - if (!d->is_dead) + if (!d->is_dead && ring_free_bytes(d)) FD_SET(d->tty_fd, &readfds); if (!buffer_empty(&d->buffer)) @@ -572,7 +584,7 @@ ret = select(max_fd + 1, &readfds, &writefds, 0, NULL); if (FD_ISSET(xs_fileno(xs), &readfds)) - handle_xs(xs_fileno(xs)); + handle_xs(); for (d = dom_head; d; d = n) { n = d->next; _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |