]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
macvtap: zerocopy: fix offset calculation when building skb
authorJason Wang <jasowang@redhat.com>
Wed, 2 May 2012 03:41:30 +0000 (11:41 +0800)
committerBen Hutchings <ben@decadent.org.uk>
Wed, 25 Jul 2012 03:11:02 +0000 (04:11 +0100)
commit 3afc9621f15701c557e60f61eba9242bac2771dd upstream.

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: Jason Wang <jasowang@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
drivers/net/macvtap.c

index 1b7082d08f334b8d1d0ab7f350bb2de5a3d41c5c..45050085c8ce0439d58e46dafa77a7348c92a75e 100644 (file)
@@ -504,10 +504,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)
@@ -518,13 +519,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) ||
@@ -545,7 +546,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;