diff --git a/lib/ftl/ftl_core.c b/lib/ftl/ftl_core.c index 476746751..e2d05cc28 100644 --- a/lib/ftl/ftl_core.c +++ b/lib/ftl/ftl_core.c @@ -48,9 +48,6 @@ #include "ftl_debug.h" #include "ftl_reloc.h" -/* Max number of iovecs */ -#define FTL_MAX_IOV 1024 - struct ftl_wptr { /* Owner device */ struct spdk_ftl_dev *dev; @@ -1615,7 +1612,7 @@ spdk_ftl_write(struct spdk_ftl_dev *dev, struct spdk_io_channel *ch, uint64_t lb { struct ftl_io *io; - if (iov_cnt == 0 || iov_cnt > FTL_MAX_IOV) { + if (iov_cnt == 0 || iov_cnt > FTL_IO_MAX_IOVEC) { return -EINVAL; } @@ -1667,7 +1664,7 @@ spdk_ftl_read(struct spdk_ftl_dev *dev, struct spdk_io_channel *ch, uint64_t lba { struct ftl_io *io; - if (iov_cnt == 0 || iov_cnt > FTL_MAX_IOV) { + if (iov_cnt == 0 || iov_cnt > FTL_IO_MAX_IOVEC) { return -EINVAL; } diff --git a/lib/ftl/ftl_io.c b/lib/ftl/ftl_io.c index cff86b830..1cd32be64 100644 --- a/lib/ftl/ftl_io.c +++ b/lib/ftl/ftl_io.c @@ -75,11 +75,7 @@ ftl_io_dec_req(struct ftl_io *io) struct iovec * ftl_io_iovec(struct ftl_io *io) { - if (io->iov_cnt > 1) { - return io->iov.vector; - } else { - return &io->iov.single; - } + return &io->iov[0]; } uint64_t @@ -166,8 +162,8 @@ ftl_io_init_iovec(struct ftl_io *io, void *buf, size_t lbk_cnt) io->lbk_cnt = lbk_cnt; io->iov_cnt = 1; - io->iov.single.iov_base = buf; - io->iov.single.iov_len = lbk_cnt * PAGE_SIZE; + io->iov[0].iov_base = buf; + io->iov[0].iov_len = lbk_cnt * PAGE_SIZE; } void @@ -292,11 +288,8 @@ ftl_io_user_init(struct spdk_io_channel *_ioch, uint64_t lba, size_t lbk_cnt, st io->lbk_cnt = lbk_cnt; io->iov_cnt = iov_cnt; - if (iov_cnt > 1) { - io->iov.vector = iov; - } else { - io->iov.single = *iov; - } + assert(iov_cnt < FTL_IO_MAX_IOVEC); + memcpy(io->iov, iov, iov_cnt * sizeof(*iov)); ftl_trace_lba_io_init(io->dev, io); diff --git a/lib/ftl/ftl_io.h b/lib/ftl/ftl_io.h index c9c2451a6..25ec1ce38 100644 --- a/lib/ftl/ftl_io.h +++ b/lib/ftl/ftl_io.h @@ -161,13 +161,8 @@ struct ftl_io { /* Number of lbks */ size_t lbk_cnt; - union { - /* IO vector table */ - struct iovec *vector; - - /* Single iovec */ - struct iovec single; - } iov; +#define FTL_IO_MAX_IOVEC 64 + struct iovec iov[FTL_IO_MAX_IOVEC]; /* Metadata */ void *md; diff --git a/lib/ftl/ftl_reloc.c b/lib/ftl/ftl_reloc.c index 2f159c9be..c696d714c 100644 --- a/lib/ftl/ftl_reloc.c +++ b/lib/ftl/ftl_reloc.c @@ -213,7 +213,7 @@ ftl_reloc_prep(struct ftl_band_reloc *breloc) static void ftl_reloc_free_io(struct ftl_band_reloc *breloc, struct ftl_io *io) { - spdk_dma_free(io->iov.single.iov_base); + spdk_dma_free(io->iov[0].iov_base); free(io->lba.vector); spdk_ring_enqueue(breloc->free_queue, (void **)&io, 1); } diff --git a/test/unit/lib/ftl/ftl_reloc.c/ftl_reloc_ut.c b/test/unit/lib/ftl/ftl_reloc.c/ftl_reloc_ut.c index 9e082463a..7e69d2748 100644 --- a/test/unit/lib/ftl/ftl_reloc.c/ftl_reloc_ut.c +++ b/test/unit/lib/ftl/ftl_reloc.c/ftl_reloc_ut.c @@ -154,7 +154,7 @@ ftl_io_init_internal(const struct ftl_io_init_opts *opts) io->cb.fn = opts->fn; io->cb.ctx = io; io->lbk_cnt = opts->lbk_cnt; - io->iov.single.iov_base = opts->data; + io->iov[0].iov_base = opts->data; return io; }