From c757d4b7060db6bca08e5bb7d9fb03a613eae7b1 Mon Sep 17 00:00:00 2001 From: Jim Harris Date: Fri, 24 Mar 2023 23:36:17 +0000 Subject: [PATCH] bdev: reset status immediately to PENDING for nomem_io queue Reset the status for a bdev_io that fails with NOMEM status back to PENDING immediately when it is put on the nomem_io list, instead of waiting until it gets submitted again. This helps keep the bdev_io states consistent, so that if we need to complete these IO for abort reasons later, that we aren't completing IO that already have a non-PENDING state. Signed-off-by: Jim Harris Change-Id: I9532095141209ed6f7af362b52c689da62e755ce Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/17335 Reviewed-by: Shuhei Matsumoto Tested-by: SPDK CI Jenkins Reviewed-by: Ben Walker Community-CI: Mellanox Build Bot --- lib/bdev/bdev.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/bdev/bdev.c b/lib/bdev/bdev.c index b18737d0b..23d0192d2 100644 --- a/lib/bdev/bdev.c +++ b/lib/bdev/bdev.c @@ -1321,11 +1321,15 @@ bdev_ch_retry_io(struct spdk_bdev_channel *bdev_ch) TAILQ_REMOVE(&shared_resource->nomem_io, bdev_io, internal.link); bdev_io->internal.ch->io_outstanding++; shared_resource->io_outstanding++; - bdev_io->internal.status = SPDK_BDEV_IO_STATUS_PENDING; bdev_io->internal.error.nvme.cdw0 = 0; bdev_io->num_retries++; bdev_submit_request(bdev, spdk_bdev_io_get_io_channel(bdev_io), bdev_io); - if (bdev_io->internal.status == SPDK_BDEV_IO_STATUS_NOMEM) { + if (bdev_io == TAILQ_FIRST(&shared_resource->nomem_io)) { + /* This IO completed again with NOMEM status, so break the loop and + * don't try anymore. Note that a bdev_io that fails with NOMEM + * always gets requeued at the front of the list, to maintain + * ordering. + */ break; } } @@ -1348,6 +1352,7 @@ _bdev_io_handle_no_mem(struct spdk_bdev_io *bdev_io) struct spdk_bdev_shared_resource *shared_resource = bdev_ch->shared_resource; if (spdk_unlikely(bdev_io->internal.status == SPDK_BDEV_IO_STATUS_NOMEM)) { + bdev_io->internal.status = SPDK_BDEV_IO_STATUS_PENDING; TAILQ_INSERT_HEAD(&shared_resource->nomem_io, bdev_io, internal.link); /* * Wait for some of the outstanding I/O to complete before we