From 33b12a4411443b89ea715f2c37c458ab8df2223c Mon Sep 17 00:00:00 2001 From: Konrad Sztyber Date: Wed, 30 Nov 2022 17:52:33 +0100 Subject: [PATCH] util: add spdk_iovmove() It's the same as spdk_iovcpy(), but the dst/src buffers can overlap. Signed-off-by: Konrad Sztyber Change-Id: I6daa0a846d7d1deac2c01d1a1be09171fa8bf796 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/15747 Tested-by: SPDK CI Jenkins Reviewed-by: Ben Walker Reviewed-by: Jim Harris Reviewed-by: Aleksey Marchuk --- include/spdk/util.h | 7 +++++++ lib/util/iov.c | 18 ++++++++++++++++++ lib/util/spdk_util.map | 1 + 3 files changed, 26 insertions(+) diff --git a/include/spdk/util.h b/include/spdk/util.h index 5a7a6dfac..9de149ad2 100644 --- a/include/spdk/util.h +++ b/include/spdk/util.h @@ -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. */ diff --git a/lib/util/iov.c b/lib/util/iov.c index 4f693cb46..0d3d28280 100644 --- a/lib/util/iov.c +++ b/lib/util/iov.c @@ -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) { diff --git a/lib/util/spdk_util.map b/lib/util/spdk_util.map index b73ff7722..f5af89460 100644 --- a/lib/util/spdk_util.map +++ b/lib/util/spdk_util.map @@ -131,6 +131,7 @@ spdk_u32log2; spdk_u64log2; spdk_iovcpy; + spdk_iovmove; spdk_ioviter_first; spdk_ioviter_next; spdk_copy_iovs_to_buf;