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:
parent
8661ded761
commit
a954d2bf30
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user