diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/macvtap.c | 12 |
1 files changed, 5 insertions, 7 deletions
diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c index 7c3f84acfdfb..3da557830937 100644 --- a/drivers/net/macvtap.c +++ b/drivers/net/macvtap.c | |||
@@ -453,7 +453,6 @@ static int zerocopy_sg_from_iovec(struct sk_buff *skb, const struct iovec *from, | |||
453 | int copy = skb_headlen(skb); | 453 | int copy = skb_headlen(skb); |
454 | int size, offset1 = 0; | 454 | int size, offset1 = 0; |
455 | int i = 0; | 455 | int i = 0; |
456 | skb_frag_t *f; | ||
457 | 456 | ||
458 | /* Skip over from offset */ | 457 | /* Skip over from offset */ |
459 | while (count && (offset >= from->iov_len)) { | 458 | while (count && (offset >= from->iov_len)) { |
@@ -503,14 +502,13 @@ static int zerocopy_sg_from_iovec(struct sk_buff *skb, const struct iovec *from, | |||
503 | skb->truesize += len; | 502 | skb->truesize += len; |
504 | atomic_add(len, &skb->sk->sk_wmem_alloc); | 503 | atomic_add(len, &skb->sk->sk_wmem_alloc); |
505 | while (len) { | 504 | while (len) { |
506 | __skb_fill_page_desc( | 505 | int off = base & ~PAGE_MASK; |
507 | skb, i, page[i], | 506 | int size = min_t(int, len, PAGE_SIZE - off); |
508 | base & ~PAGE_MASK, | 507 | __skb_fill_page_desc(skb, i, page[i], off, size); |
509 | min_t(int, len, PAGE_SIZE - f->page_offset)); | ||
510 | skb_shinfo(skb)->nr_frags++; | 508 | skb_shinfo(skb)->nr_frags++; |
511 | /* increase sk_wmem_alloc */ | 509 | /* increase sk_wmem_alloc */ |
512 | base += f->size; | 510 | base += size; |
513 | len -= f->size; | 511 | len -= size; |
514 | i++; | 512 | i++; |
515 | } | 513 | } |
516 | offset1 = 0; | 514 | offset1 = 0; |