Commit 834eddf2 authored by Peter Maydell's avatar Peter Maydell
Browse files

Merge remote-tracking branch 'remotes/stefanha/tags/block-pull-request' into staging



# gpg: Signature made Mon 12 Mar 2018 16:01:16 GMT
# gpg:                using RSA key 9CA4ABB381AB73C8
# gpg: Good signature from "Stefan Hajnoczi <stefanha@redhat.com>"
# gpg:                 aka "Stefan Hajnoczi <stefanha@gmail.com>"
# Primary key fingerprint: 8695 A8BF D3F9 7CDA AC35  775A 9CA4 ABB3 81AB 73C8

* remotes/stefanha/tags/block-pull-request:
  block: make BDRV_POLL_WHILE() re-entrancy safe

Signed-off-by: default avatarPeter Maydell <peter.maydell@linaro.org>
parents 73988d52 7376eda7
Loading
Loading
Loading
Loading
+30 −31
Original line number Diff line number Diff line
@@ -50,8 +50,8 @@
 *   }
 */
typedef struct {
    /* Is the main loop waiting for a kick?  Accessed with atomic ops. */
    bool need_kick;
    /* Number of waiting AIO_WAIT_WHILE() callers. Accessed with atomic ops. */
    unsigned num_waiters;
} AioWait;

/**
@@ -84,9 +84,8 @@ typedef struct {
    } else {                                                       \
        assert(qemu_get_current_aio_context() ==                   \
               qemu_get_aio_context());                            \
        assert(!wait_->need_kick);                          \
        /* Set wait_->need_kick before evaluating cond.  */ \
        atomic_mb_set(&wait_->need_kick, true);             \
        /* Increment wait_->num_waiters before evaluating cond. */ \
        atomic_inc(&wait_->num_waiters);                           \
        while (busy_) {                                            \
            if ((cond)) {                                          \
                waited_ = busy_ = true;                            \
@@ -98,7 +97,7 @@ typedef struct {
                waited_ |= busy_;                                  \
            }                                                      \
        }                                                          \
        atomic_set(&wait_->need_kick, false);               \
        atomic_dec(&wait_->num_waiters);                           \
    }                                                              \
    waited_; })

+1 −1
Original line number Diff line number Diff line
@@ -34,7 +34,7 @@ static void dummy_bh_cb(void *opaque)
void aio_wait_kick(AioWait *wait)
{
    /* The barrier (or an atomic op) is in the caller.  */
    if (atomic_read(&wait->need_kick)) {
    if (atomic_read(&wait->num_waiters)) {
        aio_bh_schedule_oneshot(qemu_get_aio_context(), dummy_bh_cb, NULL);
    }
}