qemu-block
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-block] [PATCH 05/12] aio: introduce aio_{disable, enable}_clients


From: Fam Zheng
Subject: [Qemu-block] [PATCH 05/12] aio: introduce aio_{disable, enable}_clients
Date: Fri, 9 Oct 2015 13:45:19 +0800

Signed-off-by: Fam Zheng <address@hidden>
---
 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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]