[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCHv2 03/14] iov: add iov_cpy
From: |
Michael S. Tsirkin |
Subject: |
[Qemu-devel] [PATCHv2 03/14] iov: add iov_cpy |
Date: |
Tue, 25 Sep 2012 13:12:14 +0200 |
Add API to copy part of iovec safely.
Signed-off-by: Michael S. Tsirkin <address@hidden>
---
iov.c | 23 +++++++++++++++++++++++
iov.h | 9 +++++++++
2 files changed, 32 insertions(+)
diff --git a/iov.c b/iov.c
index c6a66f0..b7378bf 100644
--- a/iov.c
+++ b/iov.c
@@ -228,3 +228,26 @@ void iov_hexdump(const struct iovec *iov, const unsigned
int iov_cnt,
fprintf(fp, "\n");
}
}
+
+unsigned iov_copy(struct iovec *dst_iov, unsigned int dst_iov_cnt,
+ const struct iovec *iov, unsigned int iov_cnt,
+ size_t offset, size_t bytes)
+{
+ size_t len;
+ unsigned int i, j;
+ for (i = 0, j = 0; i < iov_cnt && j < dst_iov_cnt && bytes; i++) {
+ if (offset >= iov[i].iov_len) {
+ offset -= iov[i].iov_len;
+ continue;
+ }
+ len = MIN(bytes, iov[i].iov_len - offset);
+
+ dst_iov[j].iov_base = iov[i].iov_base + offset;
+ dst_iov[j].iov_len = len;
+ j++;
+ bytes -= len;
+ offset = 0;
+ }
+ assert(offset == 0);
+ return j;
+}
diff --git a/iov.h b/iov.h
index a73569f..34c8ec9 100644
--- a/iov.h
+++ b/iov.h
@@ -86,3 +86,12 @@ ssize_t iov_send_recv(int sockfd, struct iovec *iov,
unsigned iov_cnt,
*/
void iov_hexdump(const struct iovec *iov, const unsigned int iov_cnt,
FILE *fp, const char *prefix, size_t limit);
+
+/*
+ * Partial copy of vector from iov to dst_iov (data is not copied).
+ * dst_iov overlaps iov at a specified offset.
+ * size of dst_iov is at most bytes. dst vector count is returned.
+ */
+unsigned iov_copy(struct iovec *dst_iov, unsigned int dst_iov_cnt,
+ const struct iovec *iov, unsigned int iov_cnt,
+ size_t offset, size_t bytes);
--
MST
- [Qemu-devel] [PATCHv2 00/14] virtio-net: iovec handling cleanup, Michael S. Tsirkin, 2012/09/25
- [Qemu-devel] [PATCHv2 01/14] virtio-net: track host/guest header length, Michael S. Tsirkin, 2012/09/25
- [Qemu-devel] [PATCHv2 04/14] virtio-net: avoid sg copy, Michael S. Tsirkin, 2012/09/25
- [Qemu-devel] [PATCHv2 02/14] iov: add const annotation, Michael S. Tsirkin, 2012/09/25
- [Qemu-devel] [PATCHv2 03/14] iov: add iov_cpy,
Michael S. Tsirkin <=
- [Qemu-devel] [PATCHv2 06/14] virtio-net: refactor receive_hdr, Michael S. Tsirkin, 2012/09/25
- [Qemu-devel] [PATCHv2 05/14] virtio-net: use safe iov operations for rx, Michael S. Tsirkin, 2012/09/25
- [Qemu-devel] [PATCHv2 07/14] virtio-net: first s/g is always at start of buf, Michael S. Tsirkin, 2012/09/25
- [Qemu-devel] [PATCHv2 08/14] virtio-net: switch tx to safe iov functions, Michael S. Tsirkin, 2012/09/25
- [Qemu-devel] [PATCHv2 09/14] virtio-net: simplify rx code, Michael S. Tsirkin, 2012/09/25
- [Qemu-devel] [PATCHv2 12/14] virtio-net: minor code simplification, Michael S. Tsirkin, 2012/09/25
- [Qemu-devel] [PATCHv2 14/14] virtio-net: enable mrg buf header in tap on linux, Michael S. Tsirkin, 2012/09/25
- [Qemu-devel] [PATCHv2 10/14] virtio: don't mark unaccessed memory as dirty, Michael S. Tsirkin, 2012/09/25
- [Qemu-devel] [PATCHv2 11/14] virtio-net: fix used len for tx, Michael S. Tsirkin, 2012/09/25
- [Qemu-devel] [PATCHv2 13/14] virtio-net: test peer header support at init time, Michael S. Tsirkin, 2012/09/25