From 4a3bf3a94242f8d8e265c578d5e35677b60431c1 Mon Sep 17 00:00:00 2001 From: Konrad Sztyber Date: Tue, 21 Jan 2020 13:30:30 +0100 Subject: [PATCH] lib/ftl: use user's iovec instead of copying it There's no need to copy user's iovec, as it's bound to be valid until request's completion. Storing a pointer to user's iovec is both faster and simplifies the IO allocation path. Change-Id: Ia5b37fcbc230edac6f52989c8ef09655af8ec178 Signed-off-by: Konrad Sztyber Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/897 Tested-by: SPDK CI Jenkins Reviewed-by: Wojciech Malikowski Reviewed-by: Shuhei Matsumoto Reviewed-by: Maciej Szczepaniak Reviewed-by: Aleksey Marchuk Reviewed-by: Jim Harris --- lib/ftl/ftl_io.c | 9 ++++----- lib/ftl/ftl_io.h | 6 +++++- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/lib/ftl/ftl_io.c b/lib/ftl/ftl_io.c index 8a3552fe5..dafcc829c 100644 --- a/lib/ftl/ftl_io.c +++ b/lib/ftl/ftl_io.c @@ -294,6 +294,7 @@ ftl_io_init_internal(const struct ftl_io_init_opts *opts) io->rwb_batch = opts->rwb_batch; io->band = opts->band; io->md = opts->md; + io->iov = &io->iov_buf[0]; if (parent) { if (parent->flags & FTL_IO_VECTOR_LBA) { @@ -406,11 +407,9 @@ ftl_io_user_init(struct spdk_io_channel *_ioch, uint64_t lba, size_t num_blocks, ftl_io_init(io, dev, _ftl_user_cb, cb_ctx, 0, type); io->lba.single = lba; io->user_fn = cb_fn; - - if (ftl_io_init_iovec(io, iov, iov_cnt, num_blocks)) { - ftl_io_free(io); - return NULL; - } + io->iov = iov; + io->iov_cnt = iov_cnt; + io->num_blocks = num_blocks; ftl_trace_lba_io_init(io->dev, io); return io; diff --git a/lib/ftl/ftl_io.h b/lib/ftl/ftl_io.h index cb5778188..3b99fa35f 100644 --- a/lib/ftl/ftl_io.h +++ b/lib/ftl/ftl_io.h @@ -167,7 +167,11 @@ struct ftl_io { /* Number of blocks */ size_t num_blocks; - struct iovec iov[FTL_IO_MAX_IOVEC]; + /* IO vector pointer */ + struct iovec *iov; + + /* IO vector buffer for internal requests */ + struct iovec iov_buf[FTL_IO_MAX_IOVEC]; /* Metadata */ void *md;