]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
kvm tools: Handle only relevant events in epoll
authorSasha Levin <levinsasha928@gmail.com>
Fri, 28 Oct 2011 09:01:54 +0000 (11:01 +0200)
committerPekka Enberg <penberg@kernel.org>
Sun, 30 Oct 2011 07:20:17 +0000 (09:20 +0200)
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>
tools/kvm/kvm-ipc.c

index 3131fe8375391c828484ef309853606e9344babe..40ab4572812e61c3ee84fc9565bd2c25e87ccb8e 100644 (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");