Commit b52a5a45 authored by Konrad Sztyber's avatar Konrad Sztyber Committed by Darek Stojaczyk
Browse files

lib/ftl: automatically advance parent's IO position



Advance parent's IO position when children positions are advanced.
There's no need to call ftl_io_advance twice for the same request
anymore.

Change-Id: I1f7f04a3a83575b11e7bf0b13c0c8f3bf98b5522
Signed-off-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/455518


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: default avatarWojciech Malikowski <wojciech.malikowski@intel.com>
Reviewed-by: default avatarDarek Stojaczyk <dariusz.stojaczyk@intel.com>
parent 5470a058
Loading
Loading
Loading
Loading
+0 −5
Original line number Diff line number Diff line
@@ -1013,7 +1013,6 @@ _ftl_write_nv_cache(void *ctx)
		}

		ftl_submit_nv_cache(child);
		ftl_io_advance(io, num_lbks);
	}

	if (ftl_io_done(io)) {
@@ -1265,10 +1264,6 @@ ftl_submit_write(struct ftl_wptr *wptr, struct ftl_io *io)
		}

		ftl_trace_submission(dev, io, wptr->ppa, lbk_cnt);

		/* Update parent iovec */
		ftl_io_advance(io, lbk_cnt);

		ftl_wptr_advance(wptr, lbk_cnt);
	}

+16 −14
Original line number Diff line number Diff line
@@ -104,30 +104,32 @@ void
ftl_io_advance(struct ftl_io *io, size_t lbk_cnt)
{
	struct iovec *iov = ftl_io_iovec(io);
	size_t iov_lbks;
	size_t iov_lbks, lbk_left = lbk_cnt;

	io->pos += lbk_cnt;

	if (io->iov_cnt == 0) {
		return;
	}

	while (lbk_cnt > 0) {
	if (io->iov_cnt != 0) {
		while (lbk_left > 0) {
			assert(io->iov_pos < io->iov_cnt);
			iov_lbks = iov[io->iov_pos].iov_len / PAGE_SIZE;

		if (io->iov_off + lbk_cnt < iov_lbks) {
			io->iov_off += lbk_cnt;
			if (io->iov_off + lbk_left < iov_lbks) {
				io->iov_off += lbk_left;
				break;
			}

			assert(iov_lbks > io->iov_off);
		lbk_cnt -= (iov_lbks - io->iov_off);
			lbk_left -= (iov_lbks - io->iov_off);
			io->iov_off = 0;
			io->iov_pos++;
		}
	}

	if (io->parent) {
		ftl_io_advance(io->parent, lbk_cnt);
	}
}

size_t
ftl_iovec_num_lbks(struct iovec *iov, size_t iov_cnt)
{