]> Git Repo - qemu.git/commit
util/async: use atomic_mb_set in qemu_bh_cancel
authorSergio Lopez <[email protected]>
Wed, 8 Nov 2017 06:34:47 +0000 (07:34 +0100)
committerStefan Hajnoczi <[email protected]>
Wed, 8 Nov 2017 19:09:15 +0000 (19:09 +0000)
commitef6dada8b44e1e7c4bec5c1115903af9af415b50
tree90e95fefb6b087a11000f17713a9d87c925bf20e
parentfb0c43f34eed8b18678c6e1f481d8564b35c99ed
util/async: use atomic_mb_set in qemu_bh_cancel

Commit b7a745d added a qemu_bh_cancel call to the completion function
as an optimization to prevent it from unnecessarily rescheduling itself.

This completion function is scheduled from worker_thread, after setting
the state of a ThreadPoolElement to THREAD_DONE.

This was considered to be safe, as the completion function restarts the
loop just after the call to qemu_bh_cancel. But, as this loop lacks a HW
memory barrier, the read of req->state may actually happen _before_ the
call, seeing it still as THREAD_QUEUED, and ending the completion
function without having processed a pending TPE linked at pool->head:

         worker thread             |            I/O thread
------------------------------------------------------------------------
                                   | speculatively read req->state
req->state = THREAD_DONE;          |
qemu_bh_schedule(p->completion_bh) |
  bh->scheduled = 1;               |
                                   | qemu_bh_cancel(p->completion_bh)
                                   |   bh->scheduled = 0;
                                   | if (req->state == THREAD_DONE)
                                   |   // sees THREAD_QUEUED

The source of the misunderstanding was that qemu_bh_cancel is now being
used by the _consumer_ rather than the producer, and therefore now needs
to have acquire semantics just like e.g. aio_bh_poll.

In some situations, if there are no other independent requests in the
same aio context that could eventually trigger the scheduling of the
completion function, the omitted TPE and all operations pending on it
will get stuck forever.

[Added Sergio's updated wording about the HW memory barrier.
--Stefan]

Signed-off-by: Sergio Lopez <[email protected]>
Message-id: 20171108063447[email protected]
Signed-off-by: Stefan Hajnoczi <[email protected]>
util/async.c
This page took 0.025809 seconds and 4 git commands to generate.