block/blkio: convert to blk_io_plug_call() API
Stop using the .bdrv_co_io_plug() API because it is not multi-queue block layer friendly. Use the new blk_io_plug_call() API to batch I/O submission instead. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Stefano Garzarella <sgarzare@redhat.com> Acked-by: Kevin Wolf <kwolf@redhat.com> Message-id: 20230530180959.1108766-4-stefanha@redhat.com Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
f2e590002b
commit
28ff7b4dfb
@ -17,6 +17,7 @@
|
||||
#include "qemu/error-report.h"
|
||||
#include "qapi/qmp/qdict.h"
|
||||
#include "qemu/module.h"
|
||||
#include "sysemu/block-backend.h"
|
||||
#include "exec/memory.h" /* for ram_block_discard_disable() */
|
||||
|
||||
#include "block/block-io.h"
|
||||
@ -320,16 +321,30 @@ static void blkio_detach_aio_context(BlockDriverState *bs)
|
||||
NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
/* Call with s->blkio_lock held to submit I/O after enqueuing a new request */
|
||||
static void blkio_submit_io(BlockDriverState *bs)
|
||||
/*
|
||||
* Called by blk_io_unplug() or immediately if not plugged. Called without
|
||||
* blkio_lock.
|
||||
*/
|
||||
static void blkio_unplug_fn(void *opaque)
|
||||
{
|
||||
if (qatomic_read(&bs->io_plugged) == 0) {
|
||||
BDRVBlkioState *s = bs->opaque;
|
||||
BDRVBlkioState *s = opaque;
|
||||
|
||||
WITH_QEMU_LOCK_GUARD(&s->blkio_lock) {
|
||||
blkioq_do_io(s->blkioq, NULL, 0, 0, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Schedule I/O submission after enqueuing a new request. Called without
|
||||
* blkio_lock.
|
||||
*/
|
||||
static void blkio_submit_io(BlockDriverState *bs)
|
||||
{
|
||||
BDRVBlkioState *s = bs->opaque;
|
||||
|
||||
blk_io_plug_call(blkio_unplug_fn, s);
|
||||
}
|
||||
|
||||
static int coroutine_fn
|
||||
blkio_co_pdiscard(BlockDriverState *bs, int64_t offset, int64_t bytes)
|
||||
{
|
||||
@ -340,9 +355,9 @@ blkio_co_pdiscard(BlockDriverState *bs, int64_t offset, int64_t bytes)
|
||||
|
||||
WITH_QEMU_LOCK_GUARD(&s->blkio_lock) {
|
||||
blkioq_discard(s->blkioq, offset, bytes, &cod, 0);
|
||||
blkio_submit_io(bs);
|
||||
}
|
||||
|
||||
blkio_submit_io(bs);
|
||||
qemu_coroutine_yield();
|
||||
return cod.ret;
|
||||
}
|
||||
@ -373,9 +388,9 @@ blkio_co_preadv(BlockDriverState *bs, int64_t offset, int64_t bytes,
|
||||
|
||||
WITH_QEMU_LOCK_GUARD(&s->blkio_lock) {
|
||||
blkioq_readv(s->blkioq, offset, iov, iovcnt, &cod, 0);
|
||||
blkio_submit_io(bs);
|
||||
}
|
||||
|
||||
blkio_submit_io(bs);
|
||||
qemu_coroutine_yield();
|
||||
|
||||
if (use_bounce_buffer) {
|
||||
@ -418,9 +433,9 @@ static int coroutine_fn blkio_co_pwritev(BlockDriverState *bs, int64_t offset,
|
||||
|
||||
WITH_QEMU_LOCK_GUARD(&s->blkio_lock) {
|
||||
blkioq_writev(s->blkioq, offset, iov, iovcnt, &cod, blkio_flags);
|
||||
blkio_submit_io(bs);
|
||||
}
|
||||
|
||||
blkio_submit_io(bs);
|
||||
qemu_coroutine_yield();
|
||||
|
||||
if (use_bounce_buffer) {
|
||||
@ -439,9 +454,9 @@ static int coroutine_fn blkio_co_flush(BlockDriverState *bs)
|
||||
|
||||
WITH_QEMU_LOCK_GUARD(&s->blkio_lock) {
|
||||
blkioq_flush(s->blkioq, &cod, 0);
|
||||
blkio_submit_io(bs);
|
||||
}
|
||||
|
||||
blkio_submit_io(bs);
|
||||
qemu_coroutine_yield();
|
||||
return cod.ret;
|
||||
}
|
||||
@ -467,22 +482,13 @@ static int coroutine_fn blkio_co_pwrite_zeroes(BlockDriverState *bs,
|
||||
|
||||
WITH_QEMU_LOCK_GUARD(&s->blkio_lock) {
|
||||
blkioq_write_zeroes(s->blkioq, offset, bytes, &cod, blkio_flags);
|
||||
blkio_submit_io(bs);
|
||||
}
|
||||
|
||||
blkio_submit_io(bs);
|
||||
qemu_coroutine_yield();
|
||||
return cod.ret;
|
||||
}
|
||||
|
||||
static void coroutine_fn blkio_co_io_unplug(BlockDriverState *bs)
|
||||
{
|
||||
BDRVBlkioState *s = bs->opaque;
|
||||
|
||||
WITH_QEMU_LOCK_GUARD(&s->blkio_lock) {
|
||||
blkio_submit_io(bs);
|
||||
}
|
||||
}
|
||||
|
||||
typedef enum {
|
||||
BMRR_OK,
|
||||
BMRR_SKIP,
|
||||
@ -1004,7 +1010,6 @@ static void blkio_refresh_limits(BlockDriverState *bs, Error **errp)
|
||||
.bdrv_co_pwritev = blkio_co_pwritev, \
|
||||
.bdrv_co_flush_to_disk = blkio_co_flush, \
|
||||
.bdrv_co_pwrite_zeroes = blkio_co_pwrite_zeroes, \
|
||||
.bdrv_co_io_unplug = blkio_co_io_unplug, \
|
||||
.bdrv_refresh_limits = blkio_refresh_limits, \
|
||||
.bdrv_register_buf = blkio_register_buf, \
|
||||
.bdrv_unregister_buf = blkio_unregister_buf, \
|
||||
|
Loading…
Reference in New Issue
Block a user