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 <jyang@redhat.com>
Signed-off-by: Sasha Levin <levinsasha928@gmail.com>
Signed-off-by: Pekka Enberg <penberg@kernel.org>
This commit is contained in:
Sasha Levin
2011-10-28 11:01:54 +02:00
committed by Will Deacon
parent 14bba8a09c
commit 47f72b90da
+3 -3
View File
@@ -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");