@@ -465,7 +465,7 @@ static int
vduse_queue_read_indirect_desc(VduseDev *dev, struct vring_desc *desc,
uint64_t addr, size_t len)
{
- struct vring_desc *ori_desc;
+ uint8_t *src_cursor, *dst_cursor;
uint64_t read_len;
if (len > (VIRTQUEUE_MAX_SIZE * sizeof(struct vring_desc))) {
@@ -476,17 +476,18 @@ vduse_queue_read_indirect_desc(VduseDev *dev, struct vring_desc *desc,
return -1;
}
+ dst_cursor = (uint8_t *) desc;
while (len) {
read_len = len;
- ori_desc = iova_to_va(dev, &read_len, addr);
- if (!ori_desc) {
+ src_cursor = iova_to_va(dev, &read_len, addr);
+ if (!src_cursor) {
return -1;
}
- memcpy(desc, ori_desc, read_len);
+ memcpy(dst_cursor, src_cursor, read_len);
len -= read_len;
addr += read_len;
- desc += read_len;
+ dst_cursor += read_len;
}
return 0;
When zero-copy usage of indirect descriptors buffer table isn't possible, library gather scattered memory chunks in a local copy. This commit fixes the issue with pointer arithmetic for the local copy buffer. Signed-off-by: Temir Zharaspayev <masscry@gmail.com> --- subprojects/libvduse/libvduse.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)