util: add spdk_iovmove()

It's the same as spdk_iovcpy(), but the dst/src buffers can overlap.

Signed-off-by: Konrad Sztyber <konrad.sztyber@intel.com>
Change-Id: I6daa0a846d7d1deac2c01d1a1be09171fa8bf796
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/15747
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Aleksey Marchuk <alexeymar@nvidia.com>
This commit is contained in:
Konrad Sztyber 2022-11-30 17:52:33 +01:00 committed by Tomasz Zawadzki
parent 940be80363
commit 33b12a4411
3 changed files with 26 additions and 0 deletions

View File

@ -108,6 +108,13 @@ spdk_divide_round_up(uint64_t num, uint64_t divisor)
*/
size_t spdk_iovcpy(struct iovec *siov, size_t siovcnt, struct iovec *diov, size_t diovcnt);
/**
* Same as spdk_iovcpy(), but the src/dst buffers might overlap.
*
* \return The number of bytes copied.
*/
size_t spdk_iovmove(struct iovec *siov, size_t siovcnt, struct iovec *diov, size_t diovcnt);
/**
* An iovec iterator. Can be allocated on the stack.
*/

View File

@ -104,6 +104,24 @@ spdk_iovcpy(struct iovec *siov, size_t siovcnt, struct iovec *diov, size_t diovc
return total_sz;
}
size_t
spdk_iovmove(struct iovec *siov, size_t siovcnt, struct iovec *diov, size_t diovcnt)
{
struct spdk_ioviter iter;
size_t len, total_sz;
void *src, *dst;
total_sz = 0;
for (len = spdk_ioviter_first(&iter, siov, siovcnt, diov, diovcnt, &src, &dst);
len != 0;
len = spdk_ioviter_next(&iter, &src, &dst)) {
memmove(dst, src, len);
total_sz += len;
}
return total_sz;
}
void
spdk_copy_iovs_to_buf(void *buf, size_t buf_len, struct iovec *iovs, int iovcnt)
{

View File

@ -131,6 +131,7 @@
spdk_u32log2;
spdk_u64log2;
spdk_iovcpy;
spdk_iovmove;
spdk_ioviter_first;
spdk_ioviter_next;
spdk_copy_iovs_to_buf;