From: Jan Kiszka <jan.kiszka@siemens.com>
To: Avi Kivity <avi@redhat.com>, Marcelo Tosatti <mtosatti@redhat.com>
Cc: kvm <kvm@vger.kernel.org>,
Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>,
Anthony Liguori <aliguori@us.ibm.com>,
Kevin Wolf <kwolf@redhat.com>
Subject: [PATCH] qemu-kvm: Switch POSIX compat AIO implementation to upstream
Date: Tue, 20 Sep 2011 18:49:49 +0200 [thread overview]
Message-ID: <4E78C42D.5030207@siemens.com> (raw)
Upstream's version is about to be signal-free and will stop handling
SIGUSR2 specially. So it's time to adopt its implementation, ie. switch
from signalfd to a pipe.
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
This should help pulling upstream into qemu-kvm when "block: avoid
SIGUSR2" is merged. And will help merging further cleanups of this code
I'm working on.
posix-aio-compat.c | 73 ++++++++++++++++++++++-----------------------------
1 files changed, 32 insertions(+), 41 deletions(-)
diff --git a/posix-aio-compat.c b/posix-aio-compat.c
index d8ad9ef..d375b56 100644
--- a/posix-aio-compat.c
+++ b/posix-aio-compat.c
@@ -27,7 +27,6 @@
#include "qemu-common.h"
#include "trace.h"
#include "block_int.h"
-#include "compatfd.h"
#include "block/raw-posix-aio.h"
@@ -43,7 +42,6 @@ struct qemu_paiocb {
int aio_niov;
size_t aio_nbytes;
#define aio_ioctl_cmd aio_nbytes /* for QEMU_AIO_IOCTL */
- int ev_signo;
off_t aio_offset;
QTAILQ_ENTRY(qemu_paiocb) node;
@@ -54,7 +52,7 @@ struct qemu_paiocb {
};
typedef struct PosixAioState {
- int fd;
+ int rfd, wfd;
struct qemu_paiocb *first_aio;
} PosixAioState;
@@ -310,12 +308,10 @@ static ssize_t handle_aiocb_rw(struct qemu_paiocb *aiocb)
return nbytes;
}
+static void posix_aio_notify_event(void);
+
static void *aio_thread(void *unused)
{
- pid_t pid;
-
- pid = getpid();
-
mutex_lock(&lock);
pending_threads--;
mutex_unlock(&lock);
@@ -382,7 +378,7 @@ static void *aio_thread(void *unused)
aiocb->ret = ret;
mutex_unlock(&lock);
- if (kill(pid, aiocb->ev_signo)) die("kill failed");
+ posix_aio_notify_event();
}
cur_threads--;
@@ -524,29 +520,18 @@ static int posix_aio_process_queue(void *opaque)
static void posix_aio_read(void *opaque)
{
PosixAioState *s = opaque;
- union {
- struct qemu_signalfd_siginfo siginfo;
- char buf[128];
- } sig;
- size_t offset;
+ ssize_t len;
- /* try to read from signalfd, don't freak out if we can't read anything */
- offset = 0;
- while (offset < 128) {
- ssize_t len;
+ /* read all bytes from signal pipe */
+ for (;;) {
+ char bytes[16];
- len = read(s->fd, sig.buf + offset, 128 - offset);
+ len = read(s->rfd, bytes, sizeof(bytes));
if (len == -1 && errno == EINTR)
- continue;
- if (len == -1 && errno == EAGAIN) {
- /* there is no natural reason for this to happen,
- * so we'll spin hard until we get everything just
- * to be on the safe side. */
- if (offset > 0)
- continue;
- }
-
- offset += len;
+ continue; /* try again */
+ if (len == sizeof(bytes))
+ continue; /* more to read */
+ break;
}
posix_aio_process_queue(s);
@@ -560,6 +545,16 @@ static int posix_aio_flush(void *opaque)
static PosixAioState *posix_aio_state;
+static void posix_aio_notify_event(void)
+{
+ char byte = 0;
+ ssize_t ret;
+
+ ret = write(posix_aio_state->wfd, &byte, sizeof(byte));
+ if (ret < 0 && errno != EAGAIN)
+ die("write()");
+}
+
static void paio_remove(struct qemu_paiocb *acb)
{
struct qemu_paiocb **pacb;
@@ -621,7 +616,6 @@ BlockDriverAIOCB *paio_submit(BlockDriverState *bs, int fd,
return NULL;
acb->aio_type = type;
acb->aio_fildes = fd;
- acb->ev_signo = SIGUSR2;
if (qiov) {
acb->aio_iov = qiov->iov;
@@ -649,7 +643,6 @@ BlockDriverAIOCB *paio_ioctl(BlockDriverState *bs, int fd,
return NULL;
acb->aio_type = QEMU_AIO_IOCTL;
acb->aio_fildes = fd;
- acb->ev_signo = SIGUSR2;
acb->aio_offset = 0;
acb->aio_ioctl_buf = buf;
acb->aio_ioctl_cmd = req;
@@ -663,8 +656,8 @@ BlockDriverAIOCB *paio_ioctl(BlockDriverState *bs, int fd,
int paio_init(void)
{
- sigset_t mask;
PosixAioState *s;
+ int fds[2];
int ret;
if (posix_aio_state)
@@ -672,21 +665,19 @@ int paio_init(void)
s = g_malloc(sizeof(PosixAioState));
- /* Make sure to block AIO signal */
- sigemptyset(&mask);
- sigaddset(&mask, SIGUSR2);
- sigprocmask(SIG_BLOCK, &mask, NULL);
-
s->first_aio = NULL;
- s->fd = qemu_signalfd(&mask);
- if (s->fd == -1) {
- fprintf(stderr, "failed to create signalfd\n");
+ if (qemu_pipe(fds) == -1) {
+ fprintf(stderr, "failed to create pipe\n");
return -1;
}
- fcntl(s->fd, F_SETFL, O_NONBLOCK);
+ s->rfd = fds[0];
+ s->wfd = fds[1];
+
+ fcntl(s->rfd, F_SETFL, O_NONBLOCK);
+ fcntl(s->wfd, F_SETFL, O_NONBLOCK);
- qemu_aio_set_fd_handler(s->fd, posix_aio_read, NULL, posix_aio_flush,
+ qemu_aio_set_fd_handler(s->rfd, posix_aio_read, NULL, posix_aio_flush,
posix_aio_process_queue, s);
ret = pthread_attr_init(&attr);
--
1.7.3.4
next reply other threads:[~2011-09-20 16:49 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-09-20 16:49 Jan Kiszka [this message]
2011-09-21 8:06 ` [PATCH] qemu-kvm: Switch POSIX compat AIO implementation to upstream Stefan Hajnoczi
2011-09-26 17:23 ` Jan Kiszka
2011-09-26 17:24 ` Avi Kivity
2011-09-26 18:09 ` Anthony Liguori
2011-09-27 9:00 ` Avi Kivity
2011-09-27 13:56 ` [Qemu-devel] [PATCH] Use qemu_eventfd for POSIX AIO Jan Kiszka
2011-09-27 14:07 ` Anthony Liguori
2011-09-27 14:11 ` Avi Kivity
2011-09-27 14:19 ` Anthony Liguori
2011-09-27 14:22 ` Avi Kivity
2011-09-27 14:22 ` Jan Kiszka
2011-09-27 14:38 ` Anthony Liguori
2011-09-27 14:29 ` Jan Kiszka
2011-09-27 14:34 ` Avi Kivity
2011-09-27 14:36 ` Jan Kiszka
2011-09-27 14:42 ` Avi Kivity
2011-09-27 14:45 ` Jan Kiszka
2011-09-27 14:48 ` Avi Kivity
2011-09-27 14:50 ` Jan Kiszka
2011-09-27 14:54 ` Avi Kivity
2011-09-27 14:57 ` Anthony Liguori
2011-09-27 14:59 ` Jan Kiszka
2011-09-27 14:36 ` Anthony Liguori
2011-09-27 14:41 ` Paolo Bonzini
2011-09-21 8:16 ` [PATCH] qemu-kvm: Switch POSIX compat AIO implementation to upstream Kevin Wolf
2011-09-26 16:56 ` Avi Kivity
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=4E78C42D.5030207@siemens.com \
--to=jan.kiszka@siemens.com \
--cc=aliguori@us.ibm.com \
--cc=avi@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=kwolf@redhat.com \
--cc=mtosatti@redhat.com \
--cc=stefanha@linux.vnet.ibm.com \
/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.