From f8399d4539aeee11fbc370bb2e5cc99ffd91fb3d Mon Sep 17 00:00:00 2001 From: Wojciech Malikowski Date: Mon, 25 Mar 2019 11:02:16 -0400 Subject: [PATCH] lib/ftl: Update internal IO position in one place Change-Id: Ie925659e8ffca1fb8aaa1252118bc670b3b274fd Signed-off-by: Wojciech Malikowski Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/449015 Tested-by: SPDK CI Jenkins Reviewed-by: Konrad Sztyber Reviewed-by: Jim Harris Reviewed-by: Shuhei Matsumoto --- lib/ftl/ftl_core.c | 24 +++++++++--------------- lib/ftl/ftl_core.h | 2 +- lib/ftl/ftl_io.c | 2 ++ 3 files changed, 12 insertions(+), 16 deletions(-) diff --git a/lib/ftl/ftl_core.c b/lib/ftl/ftl_core.c index 9d6bf5e60..8766a959a 100644 --- a/lib/ftl/ftl_core.c +++ b/lib/ftl/ftl_core.c @@ -707,12 +707,11 @@ ftl_submit_read(struct ftl_io *io, ftl_next_ppa_fn next_ppa, { struct spdk_ftl_dev *dev = io->dev; struct ftl_ppa ppa; - size_t lbk = 0; int rc = 0, lbk_cnt; - while (lbk < io->lbk_cnt) { + while (io->pos < io->lbk_cnt) { /* We might hit the cache here, if so, skip the read */ - lbk_cnt = rc = next_ppa(io, &ppa, lbk, ctx); + lbk_cnt = rc = next_ppa(io, &ppa, io->pos, ctx); /* We might need to retry the read from scratch (e.g. */ /* because write was under way and completed before */ @@ -724,7 +723,6 @@ ftl_submit_read(struct ftl_io *io, ftl_next_ppa_fn next_ppa, /* We don't have to schedule the read, as it was read from cache */ if (ftl_read_canceled(rc)) { ftl_io_update_iovec(io, 1); - lbk++; continue; } @@ -735,10 +733,8 @@ ftl_submit_read(struct ftl_io *io, ftl_next_ppa_fn next_ppa, ftl_io_iovec_addr(io), ftl_ppa_addr_pack(io->dev, ppa), lbk_cnt, ftl_io_cmpl_cb, io, 0); - if (rc) { io->status = rc; - if (rc != -ENOMEM) { SPDK_ERRLOG("spdk_nvme_ns_cmd_read failed with status: %d\n", rc); } @@ -747,7 +743,6 @@ ftl_submit_read(struct ftl_io *io, ftl_next_ppa_fn next_ppa, ftl_io_update_iovec(io, lbk_cnt); ftl_io_inc_req(io); - lbk += lbk_cnt; } /* If we didn't have to read anything from the device, */ @@ -988,18 +983,18 @@ ftl_submit_write(struct ftl_wptr *wptr, struct ftl_io *io) struct spdk_ftl_dev *dev = io->dev; struct iovec *iov = ftl_io_iovec(io); int rc = 0; - size_t i; + size_t i, lbk_cnt; for (i = 0; i < io->iov_cnt; ++i) { + lbk_cnt = iov[i].iov_len / PAGE_SIZE; assert(iov[i].iov_len > 0); - assert(iov[i].iov_len / PAGE_SIZE == dev->xfer_size); + assert(lbk_cnt == dev->xfer_size); ftl_trace_submission(dev, io, wptr->ppa, iov[i].iov_len / PAGE_SIZE); rc = spdk_nvme_ns_cmd_write_with_md(dev->ns, ftl_get_write_qpair(dev), iov[i].iov_base, ftl_io_get_md(io), ftl_ppa_addr_pack(dev, wptr->ppa), - iov[i].iov_len / PAGE_SIZE, - ftl_io_cmpl_cb, io, 0, 0, 0); + lbk_cnt, ftl_io_cmpl_cb, io, 0, 0, 0); if (rc) { SPDK_ERRLOG("spdk_nvme_ns_cmd_write failed with status:%d, ppa:%lu\n", rc, wptr->ppa.ppa); @@ -1007,9 +1002,9 @@ ftl_submit_write(struct ftl_wptr *wptr, struct ftl_io *io) break; } - io->pos = iov[i].iov_len / PAGE_SIZE; + ftl_io_update_iovec(io, lbk_cnt); ftl_io_inc_req(io); - ftl_wptr_advance(wptr, iov[i].iov_len / PAGE_SIZE); + ftl_wptr_advance(wptr, lbk_cnt); } if (ftl_io_done(io)) { @@ -1169,7 +1164,7 @@ ftl_rwb_fill(struct ftl_io *io) int flags = ftl_rwb_flags_from_io(io); uint64_t lba; - for (; io->pos < io->lbk_cnt; ++io->pos) { + while (io->pos < io->lbk_cnt) { lba = ftl_io_current_lba(io); if (lba == FTL_LBA_INVALID) { ftl_io_update_iovec(io, 1); @@ -1333,7 +1328,6 @@ ftl_io_write(struct ftl_io *io) return 0; } - static int _spdk_ftl_write(struct ftl_io *io) { diff --git a/lib/ftl/ftl_core.h b/lib/ftl/ftl_core.h index f0f1eb912..2ce5faecd 100644 --- a/lib/ftl/ftl_core.h +++ b/lib/ftl/ftl_core.h @@ -198,7 +198,7 @@ struct spdk_ftl_dev { /* Current user write limit */ int limit; - /* Inflight io operations */ + /* Inflight IO operations */ uint32_t num_inflight; /* Manages data relocation */ diff --git a/lib/ftl/ftl_io.c b/lib/ftl/ftl_io.c index 10bdf2065..bfed8374c 100644 --- a/lib/ftl/ftl_io.c +++ b/lib/ftl/ftl_io.c @@ -97,6 +97,8 @@ ftl_io_update_iovec(struct ftl_io *io, size_t lbk_cnt) struct iovec *iov = ftl_io_iovec(io); size_t iov_lbks; + io->pos += lbk_cnt; + while (lbk_cnt > 0) { assert(io->iov_pos < io->iov_cnt); iov_lbks = iov[io->iov_pos].iov_len / PAGE_SIZE;