[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] Switch to poll in xenconsoled's io loop.
On Thu, 2013-01-03 at 18:22 +0000, Mats Petersson wrote: > On 03/01/13 17:14, Wei Liu wrote: > > The original implementation utilies select(). 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. > > > > Up to 8192 file descriptors are supported in the current implementation. > > > > Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx> > > --- > > tools/console/daemon/io.c | 90 > > +++++++++++++++++++++++++-------------------- > > 1 file changed, 50 insertions(+), 40 deletions(-) > > > > diff --git a/tools/console/daemon/io.c b/tools/console/daemon/io.c > > index 48fe151..4e3c55c 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> > > @@ -930,7 +930,6 @@ static void handle_log_reload(void) > > > > void handle_io(void) > > { > > - fd_set readfds, writefds; > > int ret; > > > > if (log_hv) { > > @@ -959,21 +958,33 @@ 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); > > - > > - FD_SET(xs_fileno(xs), &readfds); > > - max_fd = MAX(xs_fileno(xs), max_fd); > > - > > - if (log_hv) { > > - FD_SET(xc_evtchn_fd(xce_handle), &readfds); > > - max_fd = MAX(xc_evtchn_fd(xce_handle), max_fd); > > - } > > +#define MAX_POLL_FDS 8192 > > + static struct pollfd fds[MAX_POLL_FDS]; > > + static struct pollfd *fd_to_pollfd[MAX_POLL_FDS]; > > + int nr_fds; > > +#define SET_FDS(_fd, _events) do { \ > > + if (_fd >= MAX_POLL_FDS) \ > > + break; \ > > + fds[nr_fds].fd = (_fd); \ > > + fds[nr_fds].events = (_events); \ > > + fd_to_pollfd[(_fd)] = &fds[nr_fds]; \ > > + nr_fds++; \ > > + } while (0) > > +#define FD_REVENTS(_fd) (((_fd) < MAX_POLL_FDS && fd_to_pollfd[(_fd)]) ? \ > > + fd_to_pollfd[(_fd)]->revents : 0) > > + > > + nr_fds = 0; > > + memset(fds, 0, sizeof(fds)); > > + memset(fd_to_pollfd, 0, sizeof(fd_to_pollfd)); > > + > > + SET_FDS(xs_fileno(xs), POLLIN); > > + > > + if (log_hv) > > + SET_FDS(xc_evtchn_fd(xce_handle), POLLIN); > > > Would it not make sense to use dynamically allocated memory instead - > that way, when we run out of 8192, there is nothing to change. Writing a new version to use dynamically allocated memory. Wei. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |