Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3afc9621 authored by Jason Wang's avatar Jason Wang Committed by Michael S. Tsirkin
Browse files

macvtap: zerocopy: fix offset calculation when building skb



This patch fixes the offset calculation when building skb:

- offset1 were used as skb data offset not vector offset
- reset offset to zero only when we advance to next vector

Signed-off-by: default avatarJason Wang <jasowang@redhat.com>
Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
parent 64d09888
Loading
Loading
Loading
Loading
+7 −6
Original line number Diff line number Diff line
@@ -505,10 +505,11 @@ static int zerocopy_sg_from_iovec(struct sk_buff *skb, const struct iovec *from,
		if (copy > size) {
			++from;
			--count;
		}
			offset = 0;
		} else
			offset += size;
		copy -= size;
		offset1 += size;
		offset = 0;
	}

	if (len == offset1)
@@ -519,13 +520,13 @@ static int zerocopy_sg_from_iovec(struct sk_buff *skb, const struct iovec *from,
		int num_pages;
		unsigned long base;

		len = from->iov_len - offset1;
		len = from->iov_len - offset;
		if (!len) {
			offset1 = 0;
			offset = 0;
			++from;
			continue;
		}
		base = (unsigned long)from->iov_base + offset1;
		base = (unsigned long)from->iov_base + offset;
		size = ((base & ~PAGE_MASK) + len + ~PAGE_MASK) >> PAGE_SHIFT;
		num_pages = get_user_pages_fast(base, size, 0, &page[i]);
		if ((num_pages != size) ||
@@ -546,7 +547,7 @@ static int zerocopy_sg_from_iovec(struct sk_buff *skb, const struct iovec *from,
			len -= size;
			i++;
		}
		offset1 = 0;
		offset = 0;
		++from;
	}
	return 0;