On 04/05/2017 08:39, Fam Zheng wrote: > On Thu, 04/20 14:00, Paolo Bonzini wrote: >> Signed-off-by: Paolo Bonzini <pbonz...@redhat.com> >> --- >> block/io.c | 3 ++- >> block/nfs.c | 4 +++- >> block/sheepdog.c | 3 ++- >> include/block/block.h | 5 +++-- >> include/block/block_int.h | 4 ++-- >> 5 files changed, 12 insertions(+), 7 deletions(-) >> >> diff --git a/block/io.c b/block/io.c >> index 869322a..3b2ede9 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. */ > > Why not add a barrier here so that callers don't need to worry about that?
Barriers are relatively expensive, and the common case is dataplane7:block/io.c-void bdrv_dec_in_flight(BlockDriverState *bs) dataplane7:block/io.c-{ dataplane7:block/io.c- atomic_dec(&bs->in_flight); dataplane7:block/io.c: bdrv_wakeup(bs); dataplane7:block/io.c-} Paolo >> + if (atomic_read(&bs->wakeup)) { >> aio_bh_schedule_oneshot(qemu_get_aio_context(), dummy_bh_cb, NULL); >> } >> } > > Fam >