Signed-off-by: Fam Zheng <f...@redhat.com> --- aio-posix.c | 3 ++- aio-win32.c | 3 ++- async.c | 42 ++++++++++++++++++++++++++++++++++++++++++ include/block/aio.h | 30 ++++++++++++++++++++++++++++++ 4 files changed, 76 insertions(+), 2 deletions(-)
diff --git a/aio-posix.c b/aio-posix.c index d25fcfc..a261892 100644 --- a/aio-posix.c +++ b/aio-posix.c @@ -261,7 +261,8 @@ bool aio_poll(AioContext *ctx, bool blocking) /* fill pollfds */ QLIST_FOREACH(node, &ctx->aio_handlers, node) { - if (!node->deleted && node->pfd.events) { + if (!node->deleted && node->pfd.events + && !aio_type_disabled(ctx, node->type)) { add_pollfd(node); } } diff --git a/aio-win32.c b/aio-win32.c index f5ecf57..66cff60 100644 --- a/aio-win32.c +++ b/aio-win32.c @@ -309,7 +309,8 @@ bool aio_poll(AioContext *ctx, bool blocking) /* fill fd sets */ count = 0; QLIST_FOREACH(node, &ctx->aio_handlers, node) { - if (!node->deleted && node->io_notify) { + if (!node->deleted && node->io_notify + && !aio_type_disabled(ctx, node->type)) { events[count++] = event_notifier_get_handle(node->e); } } diff --git a/async.c b/async.c index 244bf79..855b9d5 100644 --- a/async.c +++ b/async.c @@ -361,3 +361,45 @@ void aio_context_release(AioContext *ctx) { rfifolock_unlock(&ctx->lock); } + +bool aio_type_disabled(AioContext *ctx, int type) +{ + int i = 1; + int n = 0; + + while (type) { + bool b = type & 0x1; + type >>= 1; + n++; + i <<= 1; + if (!b) { + continue; + } + if (ctx->client_disable_counters[n]) { + return true; + } + } + return false; +} + +void aio_disable_enable_clients(AioContext *ctx, int clients_mask, + bool is_disable) +{ + int i = 1; + int n = 0; + aio_context_acquire(ctx); + + while (clients_mask) { + bool b = clients_mask & 0x1; + clients_mask >>= 1; + n++; + i <<= 1; + if (!b) { + continue; + } + if (ctx->client_disable_counters[n]) { + return true; + } + } + aio_context_release(ctx); +} diff --git a/include/block/aio.h b/include/block/aio.h index 60e796b..b687152 100644 --- a/include/block/aio.h +++ b/include/block/aio.h @@ -122,6 +122,8 @@ struct AioContext { /* TimerLists for calling timers - one per clock type */ QEMUTimerListGroup tlg; + + int client_disable_counters[sizeof(int)]; }; /** @@ -379,4 +381,32 @@ static inline void aio_timer_init(AioContext *ctx, */ int64_t aio_compute_timeout(AioContext *ctx); +void aio_disable_enable_clients(AioContext *ctx, int clients_mask, + bool is_disable); +/** + * aio_disable_clients: + * @ctx: the aio context + * + * Disable the furthur processing by aio_poll(ctx) of clients. This function is + * thread safe as it acquires/releases AioContext. + */ +static inline void aio_disable_clients(AioContext *ctx, int clients_mask) +{ + aio_disable_enable_clients(ctx, clients_mask, true); +} + +/** + * aio_enable_clients: + * @ctx: the aio context + * + * Enable the processing of the clients. This function is thread safe as it + * acquires/releases AioContext. + */ +static inline void aio_enable_clients(AioContext *ctx, int clients_mask) +{ + aio_disable_enable_clients(ctx, clients_mask, false); +} + +bool aio_type_disabled(AioContext *ctx, int type); + #endif -- 2.5.3