Commit 088e78d3 authored by Ben Walker's avatar Ben Walker Committed by Konrad Sztyber
Browse files

util: spdk_ioviter now supports full n-way iteration



Change-Id: I093fcf99d71bcbdbda752d6d771cecef7fc8a074
Signed-off-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/18067


Reviewed-by: default avatarArtur Paszkiewicz <artur.paszkiewicz@intel.com>
Reviewed-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
parent 26546437
Loading
Loading
Loading
Loading
+22 −0
Original line number Diff line number Diff line
@@ -133,6 +133,16 @@ size_t spdk_ioviter_first(struct spdk_ioviter *iter,
			  struct iovec *diov, size_t diovcnt,
			  void **src, void **dst);

/**
 * Initialize and move to the first common segment of the N given
 * iovecs. See spdk_ioviter_nextv().
 */
size_t spdk_ioviter_firstv(struct spdk_ioviter *iter,
			   uint32_t count,
			   struct iovec **iov,
			   size_t *iovcnt,
			   void **out);

/**
 * Move to the next segment in the iterator.
 *
@@ -145,6 +155,18 @@ size_t spdk_ioviter_first(struct spdk_ioviter *iter,
 */
size_t spdk_ioviter_next(struct spdk_ioviter *iter, void **src, void **dst);

/**
 * Move to the next segment in the iterator.
 *
 * This will iterate through the segments of the iovecs in the iterator
 * and return the individual segments, one by one. For example, if the
 * set consists one iovec of one element of length 4k and another iovec
 * of 4 elements each of length 1k, this function will return
 * 4 1k pairs of buffers, and then return 0 bytes to indicate
 * the iteration is complete on the fifth call.
 */
size_t spdk_ioviter_nextv(struct spdk_ioviter *iter, void **out);

/**
 * Operate like memset across an iovec.
 */
+55 −21
Original line number Diff line number Diff line
@@ -32,32 +32,69 @@ spdk_ioviter_first(struct spdk_ioviter *iter,
		   struct iovec *diov, size_t diovcnt,
		   void **src, void **dst)
{
	struct spdk_single_ioviter *siter;
	struct spdk_single_ioviter *diter;
	struct iovec *iovs[2];
	size_t iovcnts[2];
	void *out[2];
	size_t len;

	iovs[0] = siov;
	iovcnts[0] = siovcnt;

	iovs[1] = diov;
	iovcnts[1] = diovcnt;

	iter->count = 2;
	len = spdk_ioviter_firstv(iter, 2, iovs, iovcnts, out);

	siter = &iter->iters[0];
	diter = &iter->iters[1];
	if (len > 0) {
		*src = out[0];
		*dst = out[1];
	}

	return len;
}

	siter->iov = siov;
	siter->iovcnt = siovcnt;
size_t
spdk_ioviter_firstv(struct spdk_ioviter *iter,
		    uint32_t count,
		    struct iovec **iov,
		    size_t *iovcnt,
		    void **out)
{
	struct spdk_single_ioviter *it;
	uint32_t i;

	diter->iov = diov;
	diter->iovcnt = diovcnt;
	iter->count = count;

	siter->idx = 0;
	diter->idx = 0;
	siter->iov_len = siov[0].iov_len;
	siter->iov_base = siov[0].iov_base;
	diter->iov_len = diov[0].iov_len;
	diter->iov_base = diov[0].iov_base;
	for (i = 0; i < count; i++) {
		it = &iter->iters[i];
		it->iov = iov[i];
		it->iovcnt = iovcnt[i];
		it->idx = 0;
		it->iov_len = iov[i][0].iov_len;
		it->iov_base = iov[i][0].iov_base;
	}

	return spdk_ioviter_next(iter, src, dst);
	return spdk_ioviter_nextv(iter, out);
}

size_t
spdk_ioviter_next(struct spdk_ioviter *iter, void **src, void **dst)
{
	void *out[2];
	size_t len;

	len = spdk_ioviter_nextv(iter, out);

	if (len > 0) {
		*src = out[0];
		*dst = out[1];
	}

	return len;
}

size_t
spdk_ioviter_nextv(struct spdk_ioviter *iter, void **out)
{
	struct spdk_single_ioviter *it;
	size_t len;
@@ -72,16 +109,13 @@ spdk_ioviter_next(struct spdk_ioviter *iter, void **src, void **dst)
			return 0;
		}

		len = spdk_min(len, iter->iters[i].iov_len);
		len = spdk_min(len, it->iov_len);
	}

	*src = iter->iters[0].iov_base;
	*dst = iter->iters[1].iov_base;

	for (i = 0; i < iter->count; i++) {
		it = &iter->iters[i];

		assert(it->iov_len >= len);
		out[i] = it->iov_base;

		if (it->iov_len == len) {
			/* Advance to next element */
+2 −0
Original line number Diff line number Diff line
@@ -135,6 +135,8 @@
	spdk_iovmove;
	spdk_ioviter_first;
	spdk_ioviter_next;
	spdk_ioviter_firstv;
	spdk_ioviter_nextv;
	spdk_iov_memset;
	spdk_iov_one;
	spdk_iov_xfer_init;