bdev/delay: Abort I/O delayed to complete

This addition enables us to test the new abort I/O feature on top of
any bdev which supports I/O type ABORT.

Add the abort I/O handler vbdev_delay_abort() into vbdev_delay_submit_request().

vbdev_delay_abort() aborts the target I/O if it is delayed to complete,
or calls spdk_bdev_abort() otherwise.

Signed-off-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Change-Id: I191143357b95eeb56ada708d2d7ce30cf772bdcf
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/2602
Reviewed-by: Aleksey Marchuk <alexeymar@mellanox.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Community-CI: Broadcom CI
Community-CI: Mellanox Build Bot
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
This commit is contained in:
Shuhei Matsumoto 2020-05-26 08:13:41 +09:00 committed by Tomasz Zawadzki
parent 8661ded761
commit a954d2bf30

View File

@ -343,6 +343,42 @@ vbdev_delay_reset_channel(struct spdk_io_channel_iter *i)
spdk_for_each_channel_continue(i, 0);
}
static bool
abort_delayed_io(void *_head, struct spdk_bdev_io *bio_to_abort)
{
STAILQ_HEAD(, delay_bdev_io) *head = _head;
struct delay_bdev_io *io_ctx_to_abort = (struct delay_bdev_io *)bio_to_abort->driver_ctx;
struct delay_bdev_io *io_ctx;
STAILQ_FOREACH(io_ctx, head, link) {
if (io_ctx == io_ctx_to_abort) {
STAILQ_REMOVE(head, io_ctx_to_abort, delay_bdev_io, link);
spdk_bdev_io_complete(bio_to_abort, SPDK_BDEV_IO_STATUS_ABORTED);
return true;
}
}
return false;
}
static int
vbdev_delay_abort(struct vbdev_delay *delay_node, struct delay_io_channel *delay_ch,
struct spdk_bdev_io *bdev_io)
{
struct spdk_bdev_io *bio_to_abort = bdev_io->u.abort.bio_to_abort;
if (abort_delayed_io(&delay_ch->avg_read_io, bio_to_abort) ||
abort_delayed_io(&delay_ch->avg_write_io, bio_to_abort) ||
abort_delayed_io(&delay_ch->p99_read_io, bio_to_abort) ||
abort_delayed_io(&delay_ch->p99_write_io, bio_to_abort)) {
spdk_bdev_io_complete(bdev_io, SPDK_BDEV_IO_STATUS_SUCCESS);
return 0;
}
return spdk_bdev_abort(delay_node->base_desc, delay_ch->base_ch, bio_to_abort,
_delay_complete_io, bdev_io);
}
static void
vbdev_delay_submit_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io)
{
@ -395,6 +431,9 @@ vbdev_delay_submit_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev
spdk_for_each_channel(delay_node, vbdev_delay_reset_channel, bdev_io,
vbdev_delay_reset_dev);
break;
case SPDK_BDEV_IO_TYPE_ABORT:
rc = vbdev_delay_abort(delay_node, delay_ch, bdev_io);
break;
default:
SPDK_ERRLOG("delay: unknown I/O type %d\n", bdev_io->type);
spdk_bdev_io_complete(bdev_io, SPDK_BDEV_IO_STATUS_FAILED);