Skip to content

Commit

Permalink
aio: fix qemu_bh_schedule() bh->ctx race condition
Browse files Browse the repository at this point in the history
qemu_bh_schedule() is supposed to be thread-safe at least the first time
it is called.  Unfortunately this is not quite true:

  bh->scheduled = 1;
  aio_notify(bh->ctx);

Since another thread may run the BH callback once it has been scheduled,
there is a race condition if the callback frees the BH before
aio_notify(bh->ctx) has a chance to run.

Reported-by: Stefan Priebe <s.priebe@profihost.ag>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Tested-by: Stefan Priebe <s.priebe@profihost.ag>
(cherry picked from commit 924fe12)
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
  • Loading branch information
stefanhaRH authored and mdroth committed Jul 3, 2014
1 parent 5019106 commit 4041945
Showing 1 changed file with 10 additions and 4 deletions.
14 changes: 10 additions & 4 deletions async.c
Expand Up @@ -117,15 +117,21 @@ void qemu_bh_schedule_idle(QEMUBH *bh)

void qemu_bh_schedule(QEMUBH *bh)
{
AioContext *ctx;

if (bh->scheduled)
return;
ctx = bh->ctx;
bh->idle = 0;
/* Make sure that idle & any writes needed by the callback are done
* before the locations are read in the aio_bh_poll.
/* Make sure that:
* 1. idle & any writes needed by the callback are done before the
* locations are read in the aio_bh_poll.
* 2. ctx is loaded before scheduled is set and the callback has a chance
* to execute.
*/
smp_wmb();
smp_mb();
bh->scheduled = 1;
aio_notify(bh->ctx);
aio_notify(ctx);
}


Expand Down

0 comments on commit 4041945

Please sign in to comment.