From: Sasha Levin Date: Tue, 25 Oct 2011 11:30:53 +0000 (+0200) Subject: kvm tools: Add method to stop ipc thread X-Git-Tag: next-20111101~5^2~18 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=e60f56fab1c61a46fd160ab34dcc96193bc7f5cf;p=karo-tx-linux.git kvm tools: Add method to stop ipc thread Stop the ipc thread when shutting down the hypervisor. This solves a bug where the .sock files weren't removed upon shutdown. Reported-by: Osier Yang Signed-off-by: Sasha Levin Signed-off-by: Pekka Enberg --- diff --git a/tools/kvm/include/kvm/kvm-ipc.h b/tools/kvm/include/kvm/kvm-ipc.h index c93205277257..731767fbff68 100644 --- a/tools/kvm/include/kvm/kvm-ipc.h +++ b/tools/kvm/include/kvm/kvm-ipc.h @@ -22,5 +22,6 @@ enum { int kvm_ipc__register_handler(u32 type, void (*cb)(int fd, u32 type, u32 len, u8 *msg)); int kvm_ipc__handle(int fd, struct kvm_ipc_msg *msg); int kvm_ipc__start(int sock); +int kvm_ipc__stop(void); #endif diff --git a/tools/kvm/kvm-ipc.c b/tools/kvm/kvm-ipc.c index f05e92687e24..3131fe837539 100644 --- a/tools/kvm/kvm-ipc.c +++ b/tools/kvm/kvm-ipc.c @@ -7,12 +7,14 @@ #include #include #include +#include #define KVM_IPC_MAX_MSGS 16 static void (*msgs[KVM_IPC_MAX_MSGS])(int fd, u32 type, u32 len, u8 *msg); static DECLARE_RWSEM(msgs_rwlock); -static int epoll_fd, server_fd; +static int epoll_fd, server_fd, stop_fd; +static pthread_t thread; int kvm_ipc__register_handler(u32 type, void (*cb)(int fd, u32 type, u32 len, u8 *msg)) { @@ -110,7 +112,9 @@ static void *kvm_ipc__thread(void *param) if (nfds > 0) { int fd = event.data.fd; - if (fd == server_fd) { + if (fd == stop_fd) { + break; + } else if (fd == server_fd) { int client; client = kvm_ipc__new_conn(fd); @@ -128,7 +132,6 @@ static void *kvm_ipc__thread(void *param) int kvm_ipc__start(int sock) { - pthread_t thread; struct epoll_event ev; server_fd = sock; @@ -140,8 +143,29 @@ int kvm_ipc__start(int 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.data.fd = stop_fd; + if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, stop_fd, &ev) < 0) + die("Failed adding stop event to epoll"); + if (pthread_create(&thread, NULL, kvm_ipc__thread, NULL) != 0) die("Failed starting IPC thread"); return 0; } + +int kvm_ipc__stop(void) +{ + u64 val = 1; + int ret; + + ret = write(stop_fd, &val, sizeof(val)); + if (ret < 0) + return ret; + + close(server_fd); + close(epoll_fd); + + return ret; +} diff --git a/tools/kvm/kvm.c b/tools/kvm/kvm.c index 40ae6a5cf5a9..8d6b5e1f0402 100644 --- a/tools/kvm/kvm.c +++ b/tools/kvm/kvm.c @@ -237,6 +237,7 @@ void kvm__delete(struct kvm *kvm) kvm__stop_timer(kvm); munmap(kvm->ram_start, kvm->ram_size); + kvm_ipc__stop(); kvm__remove_socket(kvm->name); free(kvm); }