From: Osier Yang <jyang@redhat.com>
To: Sasha Levin <levinsasha928@gmail.com>
Cc: penberg@cs.helsinki.fi, kvm@vger.kernel.org, mingo@elte.hu,
asias.hejun@gmail.com, gorcunov@gmail.com
Subject: Re: [PATCH] kvm tools: Add method to stop ipc thread
Date: Tue, 25 Oct 2011 19:08:01 +0800 [thread overview]
Message-ID: <4EA69891.6030002@redhat.com> (raw)
In-Reply-To: <1319539236-874-1-git-send-email-levinsasha928@gmail.com>
于 2011年10月25日 18:40, Sasha Levin 写道:
> Stop the ipc thread when shutting down the hypervisor.
>
> This solves a bug where the .sock files weren't removed upon shutdown.
I tested the patch, the socket is still there. (I'm testing with
"--sdl", and
shutdown the vm window). And the guest starting succeeded even if
a socket with the name same as the specified guest name exists, which
means I can start two guests with same socket, which is not right.
>
> Signed-off-by: Sasha Levin <levinsasha928@gmail.com>
> ---
> tools/kvm/include/kvm/kvm-ipc.h | 1 +
> tools/kvm/kvm-ipc.c | 33 +++++++++++++++++++++++++++++----
> tools/kvm/kvm.c | 1 +
> 3 files changed, 31 insertions(+), 4 deletions(-)
>
> diff --git a/tools/kvm/include/kvm/kvm-ipc.h b/tools/kvm/include/kvm/kvm-ipc.h
> index c932052..731767f 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 f05e926..65209e1 100644
> --- a/tools/kvm/kvm-ipc.c
> +++ b/tools/kvm/kvm-ipc.c
> @@ -7,12 +7,14 @@
> #include <sys/un.h>
> #include <sys/types.h>
> #include <sys/socket.h>
> +#include <sys/eventfd.h>
>
> #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))
> {
> @@ -109,8 +111,11 @@ static void *kvm_ipc__thread(void *param)
> nfds = epoll_wait(epoll_fd, &event, 1, -1);
> if (nfds > 0) {
> int fd = event.data.fd;
> -
> - if (fd == server_fd) {
> + printf("bleh\n");
> + if (fd == stop_fd) {
> + printf("Got stop signal\n");
> + break;
> + } else if (fd == server_fd) {
> int client;
>
> client = kvm_ipc__new_conn(fd);
> @@ -128,7 +133,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 +144,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 40ae6a5..8d6b5e1 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);
> }
next prev parent reply other threads:[~2011-10-25 11:08 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-10-25 10:40 [PATCH] kvm tools: Add method to stop ipc thread Sasha Levin
2011-10-25 10:42 ` Pekka Enberg
2011-10-25 11:27 ` Sasha Levin
2011-10-25 11:08 ` Osier Yang [this message]
2011-10-25 11:38 ` Sasha Levin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4EA69891.6030002@redhat.com \
--to=jyang@redhat.com \
--cc=asias.hejun@gmail.com \
--cc=gorcunov@gmail.com \
--cc=kvm@vger.kernel.org \
--cc=levinsasha928@gmail.com \
--cc=mingo@elte.hu \
--cc=penberg@cs.helsinki.fi \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.