block: get rid of bdrv_io_unplugged_begin/end
bdrv_io_plug and bdrv_io_unplug are only called (via their BlockBackend equivalents) after starting asynchronous I/O. bdrv_drain is not going to be called while they are running, because---even if a coroutine runs for some reason---it will only drain in the next iteration of the event loop through bdrv_co_yield_to_drain. So this mechanism is unnecessary, get rid of it. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Message-id: 20161129113334.605-1-pbonzini@redhat.com Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
2ccede18bd
commit
8f90b5e91d
41
block/io.c
41
block/io.c
|
@ -228,9 +228,7 @@ void bdrv_drained_begin(BlockDriverState *bs)
|
||||||
bdrv_parent_drained_begin(bs);
|
bdrv_parent_drained_begin(bs);
|
||||||
}
|
}
|
||||||
|
|
||||||
bdrv_io_unplugged_begin(bs);
|
|
||||||
bdrv_drain_recurse(bs);
|
bdrv_drain_recurse(bs);
|
||||||
bdrv_io_unplugged_end(bs);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void bdrv_drained_end(BlockDriverState *bs)
|
void bdrv_drained_end(BlockDriverState *bs)
|
||||||
|
@ -302,7 +300,6 @@ void bdrv_drain_all_begin(void)
|
||||||
|
|
||||||
aio_context_acquire(aio_context);
|
aio_context_acquire(aio_context);
|
||||||
bdrv_parent_drained_begin(bs);
|
bdrv_parent_drained_begin(bs);
|
||||||
bdrv_io_unplugged_begin(bs);
|
|
||||||
aio_disable_external(aio_context);
|
aio_disable_external(aio_context);
|
||||||
aio_context_release(aio_context);
|
aio_context_release(aio_context);
|
||||||
|
|
||||||
|
@ -347,7 +344,6 @@ void bdrv_drain_all_end(void)
|
||||||
|
|
||||||
aio_context_acquire(aio_context);
|
aio_context_acquire(aio_context);
|
||||||
aio_enable_external(aio_context);
|
aio_enable_external(aio_context);
|
||||||
bdrv_io_unplugged_end(bs);
|
|
||||||
bdrv_parent_drained_end(bs);
|
bdrv_parent_drained_end(bs);
|
||||||
aio_context_release(aio_context);
|
aio_context_release(aio_context);
|
||||||
}
|
}
|
||||||
|
@ -2650,7 +2646,7 @@ void bdrv_io_plug(BlockDriverState *bs)
|
||||||
bdrv_io_plug(child->bs);
|
bdrv_io_plug(child->bs);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bs->io_plugged++ == 0 && bs->io_plug_disabled == 0) {
|
if (bs->io_plugged++ == 0) {
|
||||||
BlockDriver *drv = bs->drv;
|
BlockDriver *drv = bs->drv;
|
||||||
if (drv && drv->bdrv_io_plug) {
|
if (drv && drv->bdrv_io_plug) {
|
||||||
drv->bdrv_io_plug(bs);
|
drv->bdrv_io_plug(bs);
|
||||||
|
@ -2663,7 +2659,7 @@ void bdrv_io_unplug(BlockDriverState *bs)
|
||||||
BdrvChild *child;
|
BdrvChild *child;
|
||||||
|
|
||||||
assert(bs->io_plugged);
|
assert(bs->io_plugged);
|
||||||
if (--bs->io_plugged == 0 && bs->io_plug_disabled == 0) {
|
if (--bs->io_plugged == 0) {
|
||||||
BlockDriver *drv = bs->drv;
|
BlockDriver *drv = bs->drv;
|
||||||
if (drv && drv->bdrv_io_unplug) {
|
if (drv && drv->bdrv_io_unplug) {
|
||||||
drv->bdrv_io_unplug(bs);
|
drv->bdrv_io_unplug(bs);
|
||||||
|
@ -2674,36 +2670,3 @@ void bdrv_io_unplug(BlockDriverState *bs)
|
||||||
bdrv_io_unplug(child->bs);
|
bdrv_io_unplug(child->bs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void bdrv_io_unplugged_begin(BlockDriverState *bs)
|
|
||||||
{
|
|
||||||
BdrvChild *child;
|
|
||||||
|
|
||||||
if (bs->io_plug_disabled++ == 0 && bs->io_plugged > 0) {
|
|
||||||
BlockDriver *drv = bs->drv;
|
|
||||||
if (drv && drv->bdrv_io_unplug) {
|
|
||||||
drv->bdrv_io_unplug(bs);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QLIST_FOREACH(child, &bs->children, next) {
|
|
||||||
bdrv_io_unplugged_begin(child->bs);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void bdrv_io_unplugged_end(BlockDriverState *bs)
|
|
||||||
{
|
|
||||||
BdrvChild *child;
|
|
||||||
|
|
||||||
assert(bs->io_plug_disabled);
|
|
||||||
QLIST_FOREACH(child, &bs->children, next) {
|
|
||||||
bdrv_io_unplugged_end(child->bs);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (--bs->io_plug_disabled == 0 && bs->io_plugged > 0) {
|
|
||||||
BlockDriver *drv = bs->drv;
|
|
||||||
if (drv && drv->bdrv_io_plug) {
|
|
||||||
drv->bdrv_io_plug(bs);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -526,8 +526,6 @@ int bdrv_probe_geometry(BlockDriverState *bs, HDGeometry *geo);
|
||||||
|
|
||||||
void bdrv_io_plug(BlockDriverState *bs);
|
void bdrv_io_plug(BlockDriverState *bs);
|
||||||
void bdrv_io_unplug(BlockDriverState *bs);
|
void bdrv_io_unplug(BlockDriverState *bs);
|
||||||
void bdrv_io_unplugged_begin(BlockDriverState *bs);
|
|
||||||
void bdrv_io_unplugged_end(BlockDriverState *bs);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* bdrv_drained_begin:
|
* bdrv_drained_begin:
|
||||||
|
|
|
@ -526,9 +526,8 @@ struct BlockDriverState {
|
||||||
uint64_t write_threshold_offset;
|
uint64_t write_threshold_offset;
|
||||||
NotifierWithReturn write_threshold_notifier;
|
NotifierWithReturn write_threshold_notifier;
|
||||||
|
|
||||||
/* counters for nested bdrv_io_plug and bdrv_io_unplugged_begin */
|
/* counter for nested bdrv_io_plug */
|
||||||
unsigned io_plugged;
|
unsigned io_plugged;
|
||||||
unsigned io_plug_disabled;
|
|
||||||
|
|
||||||
int quiesce_counter;
|
int quiesce_counter;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue