From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:38645) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TWvQ5-0006j9-N4 for qemu-devel@nongnu.org; Fri, 09 Nov 2012 15:43:18 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TWvQ4-0005lE-Iv for qemu-devel@nongnu.org; Fri, 09 Nov 2012 15:43:17 -0500 Received: from fe01x03-cgp.akado.ru ([77.232.31.164]:61264 helo=akado.ru) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TWvQ4-0005kl-5K for qemu-devel@nongnu.org; Fri, 09 Nov 2012 15:43:16 -0500 Date: Sat, 10 Nov 2012 00:43:05 +0400 (MSK) From: malc Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Subject: [Qemu-devel] [PATCH] Revert "aio: clean up now-unused functions" List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Anthony Liguori Breaks (at least) SB16. Apparently doesn't do what commit message says it does. This reverts commit 22bfa75eafc21522afbb265091faa9cc0649e9fb. --- async.c | 23 ++++++++++++++++------- oslib-posix.c | 31 +++++++++++++++++++++++++++++++ qemu-aio.h | 1 + qemu-common.h | 1 + 4 files changed, 49 insertions(+), 7 deletions(-) diff --git a/async.c b/async.c index 04f9dcb..564526f 100644 --- a/async.c +++ b/async.c @@ -117,20 +117,16 @@ void qemu_bh_delete(QEMUBH *bh) bh->deleted = 1; } -static gboolean -aio_ctx_prepare(GSource *source, gint *timeout) +void aio_bh_update_timeout(AioContext *ctx, uint32_t *timeout) { - AioContext *ctx = (AioContext *) source; QEMUBH *bh; - bool scheduled = false; for (bh = ctx->first_bh; bh; bh = bh->next) { if (!bh->deleted && bh->scheduled) { - scheduled = true; if (bh->idle) { /* idle bottom halves will be polled at least * every 10ms */ - *timeout = 10; + *timeout = MIN(10, *timeout); } else { /* non-idle bottom halves will be executed * immediately */ @@ -139,8 +135,21 @@ aio_ctx_prepare(GSource *source, gint *timeout) } } } +} + +static gboolean +aio_ctx_prepare(GSource *source, gint *timeout) +{ + AioContext *ctx = (AioContext *) source; + uint32_t wait = -1; + aio_bh_update_timeout(ctx, &wait); + + if (wait != -1) { + *timeout = MIN(*timeout, wait); + return wait == 0; + } - return scheduled; + return false; } static gboolean diff --git a/oslib-posix.c b/oslib-posix.c index 9db9c3d..dbeb627 100644 --- a/oslib-posix.c +++ b/oslib-posix.c @@ -61,6 +61,9 @@ static int running_on_valgrind = -1; #ifdef CONFIG_LINUX #include #endif +#ifdef CONFIG_EVENTFD +#include +#endif int qemu_get_thread_id(void) { @@ -180,6 +183,34 @@ int qemu_pipe(int pipefd[2]) return ret; } +/* + * Creates an eventfd that looks like a pipe and has EFD_CLOEXEC set. + */ +int qemu_eventfd(int fds[2]) +{ +#ifdef CONFIG_EVENTFD + int ret; + + ret = eventfd(0, 0); + if (ret >= 0) { + fds[0] = ret; + fds[1] = dup(ret); + if (fds[1] == -1) { + close(ret); + return -1; + } + qemu_set_cloexec(ret); + qemu_set_cloexec(fds[1]); + return 0; + } + if (errno != ENOSYS) { + return -1; + } +#endif + + return qemu_pipe(fds); +} + int qemu_utimens(const char *path, const struct timespec *times) { struct timeval tv[2], tv_now; diff --git a/qemu-aio.h b/qemu-aio.h index 1b7eb6e..2354617 100644 --- a/qemu-aio.h +++ b/qemu-aio.h @@ -125,6 +125,7 @@ void aio_notify(AioContext *ctx); * These are internal functions used by the QEMU main loop. */ int aio_bh_poll(AioContext *ctx); +void aio_bh_update_timeout(AioContext *ctx, uint32_t *timeout); /** * qemu_bh_schedule: Schedule a bottom half. diff --git a/qemu-common.h b/qemu-common.h index ac9985c..5059a97 100644 --- a/qemu-common.h +++ b/qemu-common.h @@ -218,6 +218,7 @@ ssize_t qemu_recv_full(int fd, void *buf, size_t count, int flags) QEMU_WARN_UNUSED_RESULT; #ifndef _WIN32 +int qemu_eventfd(int pipefd[2]); int qemu_pipe(int pipefd[2]); #endif -- 1.7.8.1.385.gec330