branch xen-unstable xen branch xen-unstable job test-amd64-amd64-xl test guest-localmigrate/x10 Tree: linux git://xenbits.xen.org/linux-pvops.git Tree: qemu git://xenbits.xen.org/staging/qemu-xen-unstable.git Tree: qemuu git://xenbits.xen.org/staging/qemu-upstream-unstable.git Tree: xen http://xenbits.xen.org/hg/staging/xen-unstable.hg *** Found and reproduced problem changeset *** Bug is in tree: xen http://xenbits.xen.org/hg/staging/xen-unstable.hg Bug introduced: 0b9dfd067b42 Bug not present: c3c683a439ae changeset: 26375:0b9dfd067b42 user: Wei Liu <wei.liu2@citrix.com> date: Fri Jan 11 12:22:30 2013 +0000 Switch from select() to poll() in xenconsoled''s IO loop In Linux select() typically supports up to 1024 file descriptors. This can be a problem when user tries to boot up many guests. Switching to poll() has minimum impact on existing code and has better scalibility. pollfd array is dynamically allocated / reallocated. If the array fails to expand, we just ignore the incoming fd. Signed-off-by: Wei Liu <wei.liu2@citrix.com> Acked-by: Ian Campbell <ian.campbell@citrix.com> Committed-by: Ian Campbell <ian.campbell@citrix.com> For bisection revision-tuple graph see: http://www.chiark.greenend.org.uk/~xensrcts/results/bisect.xen-unstable.test-amd64-amd64-xl.guest-localmigrate--x10.html Revision IDs in each graph node refer, respectively, to the Trees above. ---------------------------------------- Searching for failure / basis pass: 14891 fail [host=earwig] / 14856 [host=lace-bug] 14855 [host=potato-beetle] 14852 [host=leaf-beetle] 14848 [host=woodlouse] 14842 [host=field-cricket] 14840 [host=lake-frog] 14837 [host=fire-frog] 14836 [host=bush-cricket] 14832 [host=field-cricket] 14830 [host=gall-mite] 14828 [host=lake-frog] 14827 [host=itch-mite] 14826 [host=gall-mite] 14822 [host=potato-beetle] 14820 [host=field-cricket] 14819 [host=bush-cricket] 14817 [host=moss-bug] 14816 [host=lace-bug] 14815 [host=itch-mite] 14814 [host=lake-frog] 14813 [host=bush-cricket] 14812 [host=field-cricket] 14811 [host=potato-beetle] 14810 [host=woodlouse] 14807 ok. Failure / basis pass flights: 14891 / 14807 Tree: linux git://xenbits.xen.org/linux-pvops.git Tree: qemu git://xenbits.xen.org/staging/qemu-xen-unstable.git Tree: qemuu git://xenbits.xen.org/staging/qemu-upstream-unstable.git Tree: xen http://xenbits.xen.org/hg/staging/xen-unstable.hg Latest a938a246d34912423c560f475ccf1ce0c71d9d00 6a0cf3786f1964fdf5a17f88f26cb499f4e89c81 3752993df8af5cffa1b8219fe175d235597b4474 1e2195cb4410 Basis pass a938a246d34912423c560f475ccf1ce0c71d9d00 6a0cf3786f1964fdf5a17f88f26cb499f4e89c81 3752993df8af5cffa1b8219fe175d235597b4474 c4114a042410 Generating revisions with ./adhoc-revtuple-generator git://xenbits.xen.org/linux-pvops.git#a938a246d34912423c560f475ccf1ce0c71d9d00-a938a246d34912423c560f475ccf1ce0c71d9d00 git://xenbits.xen.org/staging/qemu-xen-unstable.git#6a0cf3786f1964fdf5a17f88f26cb499f4e89c81-6a0cf3786f1964fdf5a17f88f26cb499f4e89c81 git://xenbits.xen.org/staging/qemu-upstream-unstable.git#3752993df8af5cffa1b8219fe175d235597b4474-3752993df8af5cffa1b8219fe175d235597b4474 http://xenbits.xen.org/hg/staging/xen-unstable.hg#c4114a042410-1e2195cb4410 pulling from ssh://xen@xenbits.xen.org/HG/staging/xen-unstable.hg searching for changes no changes found pulling from ssh://xen@xenbits.xen.org/HG/staging/xen-unstable.hg searching for changes no changes found Loaded 114 nodes in revision graph Searching for test results: 14807 pass a938a246d34912423c560f475ccf1ce0c71d9d00 6a0cf3786f1964fdf5a17f88f26cb499f4e89c81 3752993df8af5cffa1b8219fe175d235597b4474 c4114a042410 14806 [host=leaf-beetle] 14811 [host=potato-beetle] 14810 [host=woodlouse] 14812 [host=field-cricket] 14813 [host=bush-cricket] 14814 [host=lake-frog] 14815 [host=itch-mite] 14816 [host=lace-bug] 14817 [host=moss-bug] 14819 [host=bush-cricket] 14820 [host=field-cricket] 14822 [host=potato-beetle] 14826 [host=gall-mite] 14827 [host=itch-mite] 14828 [host=lake-frog] 14852 [host=leaf-beetle] 14897 fail a938a246d34912423c560f475ccf1ce0c71d9d00 6a0cf3786f1964fdf5a17f88f26cb499f4e89c81 3752993df8af5cffa1b8219fe175d235597b4474 0b9dfd067b42 14855 [host=potato-beetle] 14830 [host=gall-mite] 14856 [host=lace-bug] 14832 [host=field-cricket] 14836 [host=bush-cricket] 14899 pass a938a246d34912423c560f475ccf1ce0c71d9d00 6a0cf3786f1964fdf5a17f88f26cb499f4e89c81 3752993df8af5cffa1b8219fe175d235597b4474 56daf05bcf69 14857 [] 14837 [host=fire-frog] 14869 fail a938a246d34912423c560f475ccf1ce0c71d9d00 6a0cf3786f1964fdf5a17f88f26cb499f4e89c81 3752993df8af5cffa1b8219fe175d235597b4474 32758c974bf8 14840 [host=lake-frog] 14889 pass a938a246d34912423c560f475ccf1ce0c71d9d00 6a0cf3786f1964fdf5a17f88f26cb499f4e89c81 3752993df8af5cffa1b8219fe175d235597b4474 c4114a042410 14842 [host=field-cricket] 14884 fail a938a246d34912423c560f475ccf1ce0c71d9d00 6a0cf3786f1964fdf5a17f88f26cb499f4e89c81 3752993df8af5cffa1b8219fe175d235597b4474 1e2195cb4410 14848 [host=woodlouse] 14900 pass a938a246d34912423c560f475ccf1ce0c71d9d00 6a0cf3786f1964fdf5a17f88f26cb499f4e89c81 3752993df8af5cffa1b8219fe175d235597b4474 c3c683a439ae 14890 fail a938a246d34912423c560f475ccf1ce0c71d9d00 6a0cf3786f1964fdf5a17f88f26cb499f4e89c81 3752993df8af5cffa1b8219fe175d235597b4474 1e2195cb4410 14892 pass a938a246d34912423c560f475ccf1ce0c71d9d00 6a0cf3786f1964fdf5a17f88f26cb499f4e89c81 3752993df8af5cffa1b8219fe175d235597b4474 0bc879ecb8b3 14877 fail a938a246d34912423c560f475ccf1ce0c71d9d00 6a0cf3786f1964fdf5a17f88f26cb499f4e89c81 3752993df8af5cffa1b8219fe175d235597b4474 1e2195cb4410 14901 fail a938a246d34912423c560f475ccf1ce0c71d9d00 6a0cf3786f1964fdf5a17f88f26cb499f4e89c81 3752993df8af5cffa1b8219fe175d235597b4474 0b9dfd067b42 14893 pass a938a246d34912423c560f475ccf1ce0c71d9d00 6a0cf3786f1964fdf5a17f88f26cb499f4e89c81 3752993df8af5cffa1b8219fe175d235597b4474 cabf395a6c84 14894 pass a938a246d34912423c560f475ccf1ce0c71d9d00 6a0cf3786f1964fdf5a17f88f26cb499f4e89c81 3752993df8af5cffa1b8219fe175d235597b4474 9a1610c1e564 14902 pass a938a246d34912423c560f475ccf1ce0c71d9d00 6a0cf3786f1964fdf5a17f88f26cb499f4e89c81 3752993df8af5cffa1b8219fe175d235597b4474 c3c683a439ae 14895 blocked a938a246d34912423c560f475ccf1ce0c71d9d00 6a0cf3786f1964fdf5a17f88f26cb499f4e89c81 3752993df8af5cffa1b8219fe175d235597b4474 b35e06c84bd0 14891 fail a938a246d34912423c560f475ccf1ce0c71d9d00 6a0cf3786f1964fdf5a17f88f26cb499f4e89c81 3752993df8af5cffa1b8219fe175d235597b4474 1e2195cb4410 14903 fail a938a246d34912423c560f475ccf1ce0c71d9d00 6a0cf3786f1964fdf5a17f88f26cb499f4e89c81 3752993df8af5cffa1b8219fe175d235597b4474 0b9dfd067b42 14904 pass a938a246d34912423c560f475ccf1ce0c71d9d00 6a0cf3786f1964fdf5a17f88f26cb499f4e89c81 3752993df8af5cffa1b8219fe175d235597b4474 c3c683a439ae 14905 fail a938a246d34912423c560f475ccf1ce0c71d9d00 6a0cf3786f1964fdf5a17f88f26cb499f4e89c81 3752993df8af5cffa1b8219fe175d235597b4474 0b9dfd067b42 Searching for interesting versions Result found: flight 14807 (pass), for basis pass Result found: flight 14877 (fail), for basis failure Repro found: flight 14889 (pass), for basis pass Repro found: flight 14890 (fail), for basis failure 0 revisions at a938a246d34912423c560f475ccf1ce0c71d9d00 6a0cf3786f1964fdf5a17f88f26cb499f4e89c81 3752993df8af5cffa1b8219fe175d235597b4474 c3c683a439ae No revisions left to test, checking graph state. Result found: flight 14900 (pass), for last pass Result found: flight 14901 (fail), for first failure Repro found: flight 14902 (pass), for last pass Repro found: flight 14903 (fail), for first failure Repro found: flight 14904 (pass), for last pass Repro found: flight 14905 (fail), for first failure *** Found and reproduced problem changeset *** Bug is in tree: xen http://xenbits.xen.org/hg/staging/xen-unstable.hg Bug introduced: 0b9dfd067b42 Bug not present: c3c683a439ae pulling from ssh://xen@xenbits.xen.org/HG/staging/xen-unstable.hg searching for changes no changes found changeset: 26375:0b9dfd067b42 user: Wei Liu <wei.liu2@citrix.com> date: Fri Jan 11 12:22:30 2013 +0000 Switch from select() to poll() in xenconsoled''s IO loop In Linux select() typically supports up to 1024 file descriptors. This can be a problem when user tries to boot up many guests. Switching to poll() has minimum impact on existing code and has better scalibility. pollfd array is dynamically allocated / reallocated. If the array fails to expand, we just ignore the incoming fd. Signed-off-by: Wei Liu <wei.liu2@citrix.com> Acked-by: Ian Campbell <ian.campbell@citrix.com> Committed-by: Ian Campbell <ian.campbell@citrix.com> Revision graph left in /home/xc_osstest/results/bisect.xen-unstable.test-amd64-amd64-xl.guest-localmigrate--x10.{dot,ps,png,html}. ---------------------------------------- 14905: tolerable ALL FAIL flight 14905 xen-unstable real-bisect [real] http://www.chiark.greenend.org.uk/~xensrcts/logs/14905/ Failures :-/ but no regressions. Tests which did not succeed, including tests which could not be run: test-amd64-amd64-xl 14 guest-localmigrate/x10 fail baseline untested jobs: test-amd64-amd64-xl fail ------------------------------------------------------------ sg-report-flight on woking.cam.xci-test.com logs: /home/xc_osstest/logs images: /home/xc_osstest/images Logs, config files, etc. are available at http://www.chiark.greenend.org.uk/~xensrcts/logs Test harness code can be found at http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary
On Sat, 2013-01-12 at 20:36 +0000, xen.org wrote:> http://www.chiark.greenend.org.uk/~xensrcts/logs/14905/ > > Failures :-/ but no regressions. > > Tests which did not succeed, > including tests which could not be run: > test-amd64-amd64-xl 14 guest-localmigrate/x10 fail baseline untested > > > jobs: > test-amd64-amd64-xl fail > > > ------------------------------------------------------------ > sg-report-flight on woking.cam.xci-test.com > logs: /home/xc_osstest/logs > images: /home/xc_osstest/images > > Logs, config files, etc. are available at > http://www.chiark.greenend.org.uk/~xensrcts/logs > > Test harness code can be found at > http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary >I reproduced the bug. Some pointers were not reset correctly in the original patch, so xenconsoled would segfault. After xenconsoled crashed, the guest was in r(unning) state. It was spin waiting to setup the console, but as xenconsoled was not there any more, so this operation hanged forever, thus causing the guest not responsive to ssh connection (or anything else). The new patch fixes this problem, also removes unused slave_pollfd from struct domain. Wei. --------------8<-------------------- From e3ca8ecc38612668474121e5334a2d8ea5c01c39 Mon Sep 17 00:00:00 2001 From: Wei Liu <wei.liu2@citrix.com> Date: Thu, 3 Jan 2013 16:54:31 +0000 Subject: [PATCH] Switch from select() to poll() in xenconsoled''s IO loop In Linux select() typically supports up to 1024 file descriptors. This can be a problem when user tries to boot up many guests. Switching to poll() has minimum impact on existing code and has better scalibility. pollfd array is dynamically allocated / reallocated. If the array fails to expand, we just ignore the incoming fd. Updated: reset *_pollfd after use. This fixes regression 14869. Also remove unused slave_pollfd in strcut domain. Signed-off-by: Wei Liu <wei.liu2@citrix.com> --- tools/console/daemon/io.c | 212 ++++++++++++++++++++++++++++++--------------- 1 file changed, 140 insertions(+), 72 deletions(-) diff --git a/tools/console/daemon/io.c b/tools/console/daemon/io.c index 48fe151..6b659d4 100644 --- a/tools/console/daemon/io.c +++ b/tools/console/daemon/io.c @@ -28,7 +28,7 @@ #include <stdlib.h> #include <errno.h> #include <string.h> -#include <sys/select.h> +#include <poll.h> #include <fcntl.h> #include <unistd.h> #include <termios.h> @@ -66,9 +66,12 @@ extern int discard_overflowed_data; static int log_time_hv_needts = 1; static int log_time_guest_needts = 1; static int log_hv_fd = -1; -static evtchn_port_or_error_t log_hv_evtchn = -1; -static xc_interface *xch; /* why does xenconsoled have two xc handles ? */ -static xc_evtchn *xce_handle = NULL; + +static struct pollfd *fds; +static unsigned int current_array_size; +static unsigned int nr_fds; + +#define ROUNDUP(_x,_w) (((unsigned long)(_x)+(1UL<<(_w))-1) & ~((1UL<<(_w))-1)) struct buffer { char *data; @@ -81,6 +84,7 @@ struct buffer { struct domain { int domid; int master_fd; + struct pollfd *master_pollfd; int slave_fd; int log_fd; bool is_dead; @@ -92,6 +96,7 @@ struct domain { evtchn_port_or_error_t local_port; evtchn_port_or_error_t remote_port; xc_evtchn *xce_handle; + struct pollfd *xce_pollfd; struct xencons_interface *interface; int event_count; long long next_period; @@ -769,6 +774,17 @@ static int ring_free_bytes(struct domain *dom) return (sizeof(intf->in) - space); } +static void domain_handle_broken_tty(struct domain *dom, int recreate) +{ + domain_close_tty(dom); + + if (recreate) { + domain_create_tty(dom); + } else { + shutdown_domain(dom); + } +} + static void handle_tty_read(struct domain *dom) { ssize_t len = 0; @@ -794,13 +810,7 @@ static void handle_tty_read(struct domain *dom) * keep the slave open for the duration. */ if (len < 0) { - domain_close_tty(dom); - - if (domain_is_valid(dom->domid)) { - domain_create_tty(dom); - } else { - shutdown_domain(dom); - } + domain_handle_broken_tty(dom, domain_is_valid(dom->domid)); } else if (domain_is_valid(dom->domid)) { prod = intf->in_prod; for (i = 0; i < len; i++) { @@ -828,14 +838,7 @@ static void handle_tty_write(struct domain *dom) if (len < 1) { dolog(LOG_DEBUG, "Write failed on domain %d: %zd, %d\n", dom->domid, len, errno); - - domain_close_tty(dom); - - if (domain_is_valid(dom->domid)) { - domain_create_tty(dom); - } else { - shutdown_domain(dom); - } + domain_handle_broken_tty(dom, domain_is_valid(dom->domid)); } else { buffer_advance(&dom->buffer, len); } @@ -883,7 +886,7 @@ static void handle_xs(void) free(vec); } -static void handle_hv_logs(void) +static void handle_hv_logs(xc_evtchn *xce_handle) { char buffer[1024*16]; char *bufptr = buffer; @@ -894,7 +897,7 @@ static void handle_hv_logs(void) if ((port = xc_evtchn_pending(xce_handle)) == -1) return; - if (xc_readconsolering(xch, bufptr, &size, 0, 1, &index) == 0 && size > 0) { + if (xc_readconsolering(xc, bufptr, &size, 0, 1, &index) == 0 && size > 0) { int logret; if (log_time_hv) logret = write_with_timestamp(log_hv_fd, buffer, size, @@ -928,18 +931,54 @@ static void handle_log_reload(void) } } +static struct pollfd *set_fds(int fd, short events) +{ + struct pollfd *ret; + if (current_array_size < nr_fds + 1) { + struct pollfd *new_fds = NULL; + unsigned long newsize; + + /* Round up to 2^8 boundary, in practice this just + * make newsize larger than current_array_size. + */ + newsize = ROUNDUP(nr_fds + 1, 8); + + new_fds = realloc(fds, sizeof(struct pollfd)*newsize); + if (!new_fds) + goto fail; + fds = new_fds; + + memset(&fds[0] + current_array_size, 0, + sizeof(struct pollfd) * (newsize-current_array_size)); + current_array_size = newsize; + } + + fds[nr_fds].fd = fd; + fds[nr_fds].events = events; + ret = &fds[nr_fds]; + nr_fds++; + + return ret; +fail: + dolog(LOG_ERR, "realloc failed, ignoring fd %d\n", fd); + return NULL; +} + +static void reset_fds(void) +{ + nr_fds = 0; + memset(fds, 0, sizeof(struct pollfd) * current_array_size); +} + void handle_io(void) { - fd_set readfds, writefds; int ret; + evtchn_port_or_error_t log_hv_evtchn = -1; + struct pollfd *xce_pollfd = NULL; + struct pollfd *xs_pollfd = NULL; + xc_evtchn *xce_handle = NULL; if (log_hv) { - xch = xc_interface_open(0,0,0); - if (!xch) { - dolog(LOG_ERR, "Failed to open xc handle: %d (%s)", - errno, strerror(errno)); - goto out; - } xce_handle = xc_evtchn_open(NULL, 0); if (xce_handle == NULL) { dolog(LOG_ERR, "Failed to open xce handle: %d (%s)", @@ -959,21 +998,17 @@ void handle_io(void) for (;;) { struct domain *d, *n; - int max_fd = -1; - struct timeval timeout; + int poll_timeout; /* timeout in milliseconds */ struct timespec ts; long long now, next_timeout = 0; - FD_ZERO(&readfds); - FD_ZERO(&writefds); + reset_fds(); - FD_SET(xs_fileno(xs), &readfds); - max_fd = MAX(xs_fileno(xs), max_fd); + xs_pollfd = set_fds(xs_fileno(xs), POLLIN|POLLPRI); - if (log_hv) { - FD_SET(xc_evtchn_fd(xce_handle), &readfds); - max_fd = MAX(xc_evtchn_fd(xce_handle), max_fd); - } + if (log_hv) + xce_pollfd = set_fds(xc_evtchn_fd(xce_handle), + POLLIN|POLLPRI); if (clock_gettime(CLOCK_MONOTONIC, &ts) < 0) return; @@ -982,10 +1017,12 @@ void handle_io(void) /* Re-calculate any event counter allowances & unblock domains with new allowance */ for (d = dom_head; d; d = d->next) { - /* Add 5ms of fuzz since select() often returns - a couple of ms sooner than requested. Without - the fuzz we typically do an extra spin in select() - with a 1/2 ms timeout every other iteration */ + /* CS 16257:955ee4fa1345 introduces a 5ms fuzz + * for select(), it is not clear poll() has + * similar behavior (returning a couple of ms + * sooner than requested) as well. Just leave + * the fuzz here. Remove it with a separate + * patch if necessary */ if ((now+5) > d->next_period) { d->next_period = now + RATE_LIMIT_PERIOD; if (d->event_count >= RATE_LIMIT_ALLOWANCE) { @@ -1006,75 +1043,107 @@ void handle_io(void) !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); + d->xce_pollfd = set_fds(evtchn_fd, + POLLIN|POLLPRI); } } if (d->master_fd != -1) { + short events = 0; if (!d->is_dead && ring_free_bytes(d)) - FD_SET(d->master_fd, &readfds); + events |= POLLIN; if (!buffer_empty(&d->buffer)) - FD_SET(d->master_fd, &writefds); - max_fd = MAX(d->master_fd, max_fd); + events |= POLLOUT; + + if (events) + d->master_pollfd + set_fds(d->master_fd, + events|POLLPRI); } } /* If any domain has been rate limited, we need to work - out what timeout to supply to select */ + out what timeout to supply to poll */ if (next_timeout) { long long duration = (next_timeout - now); if (duration <= 0) /* sanity check */ duration = 1; - timeout.tv_sec = duration / 1000; - timeout.tv_usec = ((duration - (timeout.tv_sec * 1000)) - * 1000); + poll_timeout = (int)duration; } - ret = select(max_fd + 1, &readfds, &writefds, 0, - next_timeout ? &timeout : NULL); + ret = poll(fds, nr_fds, next_timeout ? poll_timeout : -1); if (log_reload) { handle_log_reload(); log_reload = 0; } - /* Abort if select failed, except for EINTR cases + /* Abort if poll failed, except for EINTR cases which indicate a possible log reload */ if (ret == -1) { if (errno == EINTR) continue; - dolog(LOG_ERR, "Failure in select: %d (%s)", + dolog(LOG_ERR, "Failure in poll: %d (%s)", errno, strerror(errno)); break; } - if (log_hv && FD_ISSET(xc_evtchn_fd(xce_handle), &readfds)) - handle_hv_logs(); + if (log_hv && xce_pollfd) { + if (xce_pollfd->revents & ~(POLLIN|POLLOUT|POLLPRI)) { + dolog(LOG_ERR, + "Failure in poll xce_handle: %d (%s)", + errno, strerror(errno)); + break; + } else if (xce_pollfd->revents & POLLIN) + handle_hv_logs(xce_handle); + + xce_pollfd = NULL; + } if (ret <= 0) continue; - if (FD_ISSET(xs_fileno(xs), &readfds)) - handle_xs(); + if (xs_pollfd) { + if (xs_pollfd->revents & ~(POLLIN|POLLOUT|POLLPRI)) { + dolog(LOG_ERR, + "Failure in poll xs_handle: %d (%s)", + errno, strerror(errno)); + break; + } else if (xs_pollfd->revents & POLLIN) + handle_xs(); + + xs_pollfd = NULL; + } for (d = dom_head; d; d = n) { n = d->next; if (d->event_count < RATE_LIMIT_ALLOWANCE) { if (d->xce_handle != NULL && - FD_ISSET(xc_evtchn_fd(d->xce_handle), - &readfds)) - handle_ring_read(d); + d->xce_pollfd && + !(d->xce_pollfd->revents & + ~(POLLIN|POLLOUT|POLLPRI)) && + (d->xce_pollfd->revents & + POLLIN)) + handle_ring_read(d); } - if (d->master_fd != -1 && FD_ISSET(d->master_fd, - &readfds)) - handle_tty_read(d); + if (d->master_fd != -1 && d->master_pollfd) { + if (d->master_pollfd->revents & + ~(POLLIN|POLLOUT|POLLPRI)) + domain_handle_broken_tty(d, + domain_is_valid(d->domid)); + else { + if (d->master_pollfd->revents & + POLLIN) + handle_tty_read(d); + if (d->master_pollfd->revents & + POLLOUT) + handle_tty_write(d); + } + } - if (d->master_fd != -1 && FD_ISSET(d->master_fd, - &writefds)) - handle_tty_write(d); + d->xce_pollfd = d->master_pollfd = NULL; if (d->last_seen != enum_pass) shutdown_domain(d); @@ -1084,15 +1153,14 @@ void handle_io(void) } } + free(fds); + current_array_size = 0; + out: if (log_hv_fd != -1) { close(log_hv_fd); log_hv_fd = -1; } - if (xch) { - xc_interface_close(xch); - xch = 0; - } if (xce_handle != NULL) { xc_evtchn_close(xce_handle); xce_handle = NULL; -- 1.7.10.4
Ian Campbell
2013-Jan-17 13:53 UTC
Re: [xen-unstable bisection] complete test-amd64-amd64-xl
On Mon, 2013-01-14 at 14:08 +0000, Wei Liu wrote: [...]> Subject: [PATCH] Switch from select() to poll() in xenconsoled''s IO loop > > In Linux select() typically supports up to 1024 file descriptors. This can be > a problem when user tries to boot up many guests. Switching to poll() has > minimum impact on existing code and has better scalibility. > > pollfd array is dynamically allocated / reallocated. If the array fails to > expand, we just ignore the incoming fd. > > Updated: reset *_pollfd after use. > > This fixes regression 14869. > > Also remove unused slave_pollfd in strcut domain. > > Signed-off-by: Wei Liu <wei.liu2@citrix.com>Acked + applied.