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: Konrad Sztyber <konrad.sztyber@intel.com> Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/455518 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Ben Walker <benjamin.walker@intel.com> Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com> Reviewed-by: Wojciech Malikowski <wojciech.malikowski@intel.com> Reviewed-by: Darek Stojaczyk <dariusz.stojaczyk@intel.com>
This commit is contained in:
parent
5470a0584f
commit
b52a5a45d8
@ -1013,7 +1013,6 @@ _ftl_write_nv_cache(void *ctx)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ftl_submit_nv_cache(child);
|
ftl_submit_nv_cache(child);
|
||||||
ftl_io_advance(io, num_lbks);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ftl_io_done(io)) {
|
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);
|
ftl_trace_submission(dev, io, wptr->ppa, lbk_cnt);
|
||||||
|
|
||||||
/* Update parent iovec */
|
|
||||||
ftl_io_advance(io, lbk_cnt);
|
|
||||||
|
|
||||||
ftl_wptr_advance(wptr, lbk_cnt);
|
ftl_wptr_advance(wptr, lbk_cnt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -104,28 +104,30 @@ void
|
|||||||
ftl_io_advance(struct ftl_io *io, size_t lbk_cnt)
|
ftl_io_advance(struct ftl_io *io, size_t lbk_cnt)
|
||||||
{
|
{
|
||||||
struct iovec *iov = ftl_io_iovec(io);
|
struct iovec *iov = ftl_io_iovec(io);
|
||||||
size_t iov_lbks;
|
size_t iov_lbks, lbk_left = lbk_cnt;
|
||||||
|
|
||||||
io->pos += lbk_cnt;
|
io->pos += lbk_cnt;
|
||||||
|
|
||||||
if (io->iov_cnt == 0) {
|
if (io->iov_cnt != 0) {
|
||||||
return;
|
while (lbk_left > 0) {
|
||||||
}
|
|
||||||
|
|
||||||
while (lbk_cnt > 0) {
|
|
||||||
assert(io->iov_pos < io->iov_cnt);
|
assert(io->iov_pos < io->iov_cnt);
|
||||||
iov_lbks = iov[io->iov_pos].iov_len / PAGE_SIZE;
|
iov_lbks = iov[io->iov_pos].iov_len / PAGE_SIZE;
|
||||||
|
|
||||||
if (io->iov_off + lbk_cnt < iov_lbks) {
|
if (io->iov_off + lbk_left < iov_lbks) {
|
||||||
io->iov_off += lbk_cnt;
|
io->iov_off += lbk_left;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(iov_lbks > io->iov_off);
|
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_off = 0;
|
||||||
io->iov_pos++;
|
io->iov_pos++;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (io->parent) {
|
||||||
|
ftl_io_advance(io->parent, lbk_cnt);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t
|
size_t
|
||||||
|
Loading…
Reference in New Issue
Block a user