From: Sasha Levin Date: Fri, 28 Oct 2011 09:01:54 +0000 (+0200) Subject: kvm tools: Handle only relevant events in epoll X-Git-Tag: next-20111101~5^2~6 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=0789f659c7f515916e65970e9256fd62f7459631;p=karo-tx-linux.git kvm tools: Handle only relevant events in epoll Handle only new incoming data for listener and stop fds, treat all other events as error events which close the socket. This fixes the bug where a 'kvm list' could have hanged because a close event in the listener fd have been treated as a new connection. Cc: Osier Yang Signed-off-by: Sasha Levin Signed-off-by: Pekka Enberg --- diff --git a/tools/kvm/kvm-ipc.c b/tools/kvm/kvm-ipc.c index 3131fe837539..40ab4572812e 100644 --- a/tools/kvm/kvm-ipc.c +++ b/tools/kvm/kvm-ipc.c @@ -112,7 +112,7 @@ static void *kvm_ipc__thread(void *param) if (nfds > 0) { int fd = event.data.fd; - if (fd == stop_fd) { + if (fd == stop_fd && event.events & EPOLLIN) { break; } else if (fd == server_fd) { int client; @@ -138,13 +138,13 @@ int kvm_ipc__start(int sock) epoll_fd = epoll_create(KVM_IPC_MAX_MSGS); - ev.events = EPOLLIN | EPOLLOUT | EPOLLPRI; + ev.events = EPOLLIN | EPOLLET; ev.data.fd = sock; if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, sock, &ev) < 0) die("Failed starting IPC thread"); stop_fd = eventfd(0, 0); - ev.events = EPOLLIN | EPOLLOUT | EPOLLRDHUP | EPOLLET; + ev.events = EPOLLIN | EPOLLET; ev.data.fd = stop_fd; if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, stop_fd, &ev) < 0) die("Failed adding stop event to epoll");