All of lore.kernel.org
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: qemu-devel@nongnu.org
Cc: famz@redhat.com, stefanha@redhat.com, qemu-block@nongnu.org
Subject: [Qemu-devel] [PATCH 05/18] block: access wakeup with atomic ops
Date: Thu, 11 May 2017 16:41:55 +0200	[thread overview]
Message-ID: <20170511144208.24075-6-pbonzini@redhat.com> (raw)
In-Reply-To: <20170511144208.24075-1-pbonzini@redhat.com>

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
        v1->v2: add comment [Fam]

 block/io.c                | 3 ++-
 block/nfs.c               | 4 +++-
 block/sheepdog.c          | 3 ++-
 include/block/block.h     | 5 +++--
 include/block/block_int.h | 7 +++++--
 5 files changed, 15 insertions(+), 7 deletions(-)

diff --git a/block/io.c b/block/io.c
index 28d2de6d93..dcb2b72f91 100644
--- a/block/io.c
+++ b/block/io.c
@@ -501,7 +501,8 @@ static void dummy_bh_cb(void *opaque)
 
 void bdrv_wakeup(BlockDriverState *bs)
 {
-    if (bs->wakeup) {
+    /* The barrier (or an atomic op) is in the caller.  */
+    if (atomic_read(&bs->wakeup)) {
         aio_bh_schedule_oneshot(qemu_get_aio_context(), dummy_bh_cb, NULL);
     }
 }
diff --git a/block/nfs.c b/block/nfs.c
index 6541dec1fc..ec75c6c4ca 100644
--- a/block/nfs.c
+++ b/block/nfs.c
@@ -736,7 +736,9 @@ nfs_get_allocated_file_size_cb(int ret, struct nfs_context *nfs, void *data,
     if (task->ret < 0) {
         error_report("NFS Error: %s", nfs_get_error(nfs));
     }
-    task->complete = 1;
+
+    /* Set task->complete before reading bs->wakeup.  */
+    atomic_mb_set(&task->complete, 1);
     bdrv_wakeup(task->bs);
 }
 
diff --git a/block/sheepdog.c b/block/sheepdog.c
index b2a5998188..dad998a2c7 100644
--- a/block/sheepdog.c
+++ b/block/sheepdog.c
@@ -704,7 +704,8 @@ out:
 
     srco->co = NULL;
     srco->ret = ret;
-    srco->finished = true;
+    /* Set srco->finished before reading bs->wakeup.  */
+    atomic_mb_set(&srco->finished, true);
     if (srco->bs) {
         bdrv_wakeup(srco->bs);
     }
diff --git a/include/block/block.h b/include/block/block.h
index 144df0ddfb..bad445acd8 100644
--- a/include/block/block.h
+++ b/include/block/block.h
@@ -398,7 +398,8 @@ void bdrv_drain_all(void);
          * block_job_defer_to_main_loop for how to do it). \
          */                                                \
         assert(!bs_->wakeup);                              \
-        bs_->wakeup = true;                                \
+        /* Set bs->wakeup before evaluating cond.  */      \
+        atomic_mb_set(&bs_->wakeup, true);                 \
         while (busy_) {                                    \
             if ((cond)) {                                  \
                 waited_ = busy_ = true;                    \
@@ -410,7 +411,7 @@ void bdrv_drain_all(void);
                 waited_ |= busy_;                          \
             }                                              \
         }                                                  \
-        bs_->wakeup = false;                               \
+        atomic_set(&bs_->wakeup, false);                   \
     }                                                      \
     waited_; })
 
diff --git a/include/block/block_int.h b/include/block/block_int.h
index 8db83c2b2d..0799098060 100644
--- a/include/block/block_int.h
+++ b/include/block/block_int.h
@@ -590,8 +590,6 @@ struct BlockDriverState {
     /* Callback before write request is processed */
     NotifierWithReturnList before_write_notifiers;
 
-    bool wakeup;
-
     /* Offset after the highest byte written to */
     uint64_t wr_highest_offset;
 
@@ -622,6 +620,11 @@ struct BlockDriverState {
     unsigned int in_flight;
     unsigned int serialising_in_flight;
 
+    /* Internal to BDRV_POLL_WHILE and bdrv_wakeup.  Accessed with atomic
+     * ops.
+     */
+    bool wakeup;
+
     /* do we need to tell the quest if we have a volatile write cache? */
     int enable_write_cache;
 
-- 
2.12.2

  parent reply	other threads:[~2017-05-11 14:42 UTC|newest]

Thread overview: 50+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-05-11 14:41 [Qemu-devel] [PATCH v2 00/18] Block layer thread safety, part 1 Paolo Bonzini
2017-05-11 14:41 ` [Qemu-devel] [PATCH 01/18] block: access copy_on_read with atomic ops Paolo Bonzini
2017-05-16 13:34   ` Stefan Hajnoczi
2017-05-11 14:41 ` [Qemu-devel] [PATCH 02/18] block: access quiesce_counter " Paolo Bonzini
2017-05-12  7:56   ` [Qemu-devel] [Qemu-block] " Alberto Garcia
2017-05-11 14:41 ` [Qemu-devel] [PATCH 03/18] block: access io_limits_disabled " Paolo Bonzini
2017-05-18 12:25   ` [Qemu-devel] [Qemu-block] " Alberto Garcia
2017-05-11 14:41 ` [Qemu-devel] [PATCH 04/18] block: access serialising_in_flight " Paolo Bonzini
2017-05-11 14:41 ` Paolo Bonzini [this message]
2017-05-16 13:48   ` [Qemu-devel] [PATCH 05/18] block: access wakeup " Stefan Hajnoczi
2017-05-11 14:41 ` [Qemu-devel] [PATCH 06/18] block: access io_plugged " Paolo Bonzini
2017-05-11 16:10   ` Eric Blake
2017-05-11 14:41 ` [Qemu-devel] [PATCH 07/18] throttle-groups: only start one coroutine from drained_begin Paolo Bonzini
2017-05-16 13:54   ` Stefan Hajnoczi
2017-05-17 21:50   ` [Qemu-devel] [Qemu-block] " Alberto Garcia
2017-05-11 14:41 ` [Qemu-devel] [PATCH 08/18] throttle-groups: do not use qemu_co_enter_next Paolo Bonzini
2017-05-16 14:44   ` Stefan Hajnoczi
2017-05-18 11:56   ` [Qemu-devel] [Qemu-block] " Alberto Garcia
2017-05-11 14:41 ` [Qemu-devel] [PATCH 09/18] throttle-groups: protect throttled requests with a CoMutex Paolo Bonzini
2017-05-16 14:47   ` Stefan Hajnoczi
2017-05-18 12:06   ` [Qemu-devel] [Qemu-block] " Alberto Garcia
2017-05-18 12:08     ` Paolo Bonzini
2017-05-18 12:19       ` Alberto Garcia
2017-05-11 14:42 ` [Qemu-devel] [PATCH 10/18] util: add stats64 module Paolo Bonzini
2017-05-16 14:47   ` Stefan Hajnoczi
2017-05-11 14:42 ` [Qemu-devel] [PATCH 11/18] block: use Stat64 for wr_highest_offset Paolo Bonzini
2017-05-11 14:42 ` [Qemu-devel] [PATCH 12/18] block: access write_gen with atomics Paolo Bonzini
2017-05-11 14:42 ` [Qemu-devel] [PATCH 13/18] block: protect tracked_requests and flush_queue with reqs_lock Paolo Bonzini
2017-05-16 14:50   ` Stefan Hajnoczi
2017-05-11 14:42 ` [Qemu-devel] [PATCH 14/18] block: introduce dirty_bitmap_mutex Paolo Bonzini
2017-05-16 14:55   ` Stefan Hajnoczi
2017-05-11 14:42 ` [Qemu-devel] [PATCH 15/18] migration/block: reset dirty bitmap before reading Paolo Bonzini
2017-05-16 15:03   ` Stefan Hajnoczi
2017-05-11 14:42 ` [Qemu-devel] [PATCH 16/18] block: protect modification of dirty bitmaps with a mutex Paolo Bonzini
2017-05-16 15:05   ` Stefan Hajnoczi
2017-05-11 14:42 ` [Qemu-devel] [PATCH 17/18] block: introduce block_account_one_io Paolo Bonzini
2017-05-16 15:07   ` Stefan Hajnoczi
2017-05-18 12:09   ` [Qemu-devel] [Qemu-block] " Alberto Garcia
2017-05-25  7:28   ` [Qemu-devel] " Fam Zheng
2017-05-11 14:42 ` [Qemu-devel] [PATCH 18/18] block: make accounting thread-safe Paolo Bonzini
2017-05-16 15:08   ` Stefan Hajnoczi
2017-05-18 12:16   ` [Qemu-devel] [Qemu-block] " Alberto Garcia
2017-05-11 18:21 ` [Qemu-devel] [PATCH v2 00/18] Block layer thread safety, part 1 no-reply
2017-05-11 19:24 ` no-reply
2017-05-16 15:08 ` Stefan Hajnoczi
2017-05-24  8:32 ` Paolo Bonzini
2017-05-25  7:40   ` Fam Zheng
2017-05-25  9:14     ` [Qemu-devel] [Qemu-block] " Paolo Bonzini
2017-05-25 16:17     ` [Qemu-devel] " Paolo Bonzini
2017-05-25 16:32 [Qemu-devel] [PATCH v3 " Paolo Bonzini
2017-05-25 16:32 ` [Qemu-devel] [PATCH 05/18] block: access wakeup with atomic ops Paolo Bonzini

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=20170511144208.24075-6-pbonzini@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=famz@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@redhat.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.