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

lib/ftl: use pre-allocated iov buffer



Keep an array of iovecs tied to each IO. Internal IOs can have
iov_cnt > 1 without having to allocate additional memory. User's iovec
can now be modified too (e.g. when splitting the request).

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


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: default avatarDarek Stojaczyk <dariusz.stojaczyk@intel.com>
parent feb2c6be
Loading
Loading
Loading
Loading
+2 −5
Original line number Diff line number Diff line
@@ -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;
	}

+5 −12
Original line number Diff line number Diff line
@@ -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);

+2 −7
Original line number Diff line number Diff line
@@ -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;
+1 −1
Original line number Diff line number Diff line
@@ -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);
}
+1 −1
Original line number Diff line number Diff line
@@ -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;
}