Commit 068d93b1 authored by Ben Walker's avatar Ben Walker Committed by Konrad Sztyber
Browse files

util: Change spdk_ioviter to hold an array



Prepare for supporting N-way iteration. This is still strictly
2-way as of this patch, but reorganizes the data structure to prepare
for the upcoming change.

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


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 20370a5d
Loading
Loading
Loading
Loading
+10 −13
Original line number Diff line number Diff line
@@ -105,21 +105,18 @@ spdk_divide_round_up(uint64_t num, uint64_t divisor)
}

/**
 * An iovec iterator. Can be allocated on the stack.
 * A 2-way iovec iterator. Can be allocated on the stack.
 */
struct spdk_ioviter {
	struct iovec	*siov;
	size_t		siovcnt;

	struct iovec	*diov;
	size_t		diovcnt;

	size_t		sidx;
	size_t		didx;
	int		siov_len;
	uint8_t		*siov_base;
	int		diov_len;
	uint8_t		*diov_base;
	uint32_t	count;

	struct spdk_single_ioviter {
		struct iovec	*iov;
		size_t		iovcnt;
		size_t		idx;
		size_t		iov_len;
		uint8_t		*iov_base;
	} iters[2];
};

/**
+52 −39
Original line number Diff line number Diff line
@@ -32,18 +32,26 @@ spdk_ioviter_first(struct spdk_ioviter *iter,
		   struct iovec *diov, size_t diovcnt,
		   void **src, void **dst)
{
	iter->siov = siov;
	iter->siovcnt = siovcnt;
	struct spdk_single_ioviter *siter;
	struct spdk_single_ioviter *diter;

	iter->diov = diov;
	iter->diovcnt = diovcnt;
	iter->count = 2;

	iter->sidx = 0;
	iter->didx = 0;
	iter->siov_len = siov[0].iov_len;
	iter->siov_base = siov[0].iov_base;
	iter->diov_len = diov[0].iov_len;
	iter->diov_base = diov[0].iov_base;
	siter = &iter->iters[0];
	diter = &iter->iters[1];

	siter->iov = siov;
	siter->iovcnt = siovcnt;

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

	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;

	return spdk_ioviter_next(iter, src, dst);
}
@@ -52,56 +60,61 @@ size_t
spdk_ioviter_next(struct spdk_ioviter *iter, void **src, void **dst)
{
	size_t len = 0;
	struct spdk_single_ioviter *siter;
	struct spdk_single_ioviter *diter;

	siter = &iter->iters[0];
	diter = &iter->iters[1];

	if (iter->sidx == iter->siovcnt ||
	    iter->didx == iter->diovcnt ||
	    iter->siov_len == 0 ||
	    iter->diov_len == 0) {
	if (siter->idx == siter->iovcnt ||
	    diter->idx == diter->iovcnt ||
	    siter->iov_len == 0 ||
	    diter->iov_len == 0) {
		return 0;
	}

	*src = iter->siov_base;
	*dst = iter->diov_base;
	len = spdk_min(iter->siov_len, iter->diov_len);
	*src = siter->iov_base;
	*dst = diter->iov_base;
	len = spdk_min(siter->iov_len, diter->iov_len);

	if (iter->siov_len == iter->diov_len) {
	if (siter->iov_len == diter->iov_len) {
		/* Advance both iovs to the next element */
		iter->sidx++;
		if (iter->sidx == iter->siovcnt) {
		siter->idx++;
		if (siter->idx == siter->iovcnt) {
			return len;
		}

		iter->didx++;
		if (iter->didx == iter->diovcnt) {
		diter->idx++;
		if (diter->idx == diter->iovcnt) {
			return len;
		}

		iter->siov_len = iter->siov[iter->sidx].iov_len;
		iter->siov_base = iter->siov[iter->sidx].iov_base;
		iter->diov_len = iter->diov[iter->didx].iov_len;
		iter->diov_base = iter->diov[iter->didx].iov_base;
	} else if (iter->siov_len < iter->diov_len) {
		siter->iov_len = siter->iov[siter->idx].iov_len;
		siter->iov_base = siter->iov[siter->idx].iov_base;
		diter->iov_len = diter->iov[diter->idx].iov_len;
		diter->iov_base = diter->iov[diter->idx].iov_base;
	} else if (siter->iov_len < diter->iov_len) {
		/* Advance only the source to the next element */
		iter->sidx++;
		if (iter->sidx == iter->siovcnt) {
		siter->idx++;
		if (siter->idx == siter->iovcnt) {
			return len;
		}

		iter->diov_base += iter->siov_len;
		iter->diov_len -= iter->siov_len;
		iter->siov_len = iter->siov[iter->sidx].iov_len;
		iter->siov_base = iter->siov[iter->sidx].iov_base;
		diter->iov_base += siter->iov_len;
		diter->iov_len -= siter->iov_len;
		siter->iov_len = siter->iov[siter->idx].iov_len;
		siter->iov_base = siter->iov[siter->idx].iov_base;
	} else {
		/* Advance only the destination to the next element */
		iter->didx++;
		if (iter->didx == iter->diovcnt) {
		diter->idx++;
		if (diter->idx == diter->iovcnt) {
			return len;
		}

		iter->siov_base += iter->diov_len;
		iter->siov_len -= iter->diov_len;
		iter->diov_len = iter->diov[iter->didx].iov_len;
		iter->diov_base = iter->diov[iter->didx].iov_base;
		siter->iov_base += diter->iov_len;
		siter->iov_len -= diter->iov_len;
		diter->iov_len = diter->iov[diter->idx].iov_len;
		diter->iov_base = diter->iov[diter->idx].iov_base;
	}

	return len;