diff options
-rw-r--r-- | drivers/net/macvtap.c | 23 | ||||
-rw-r--r-- | drivers/net/tun.c | 23 | ||||
-rw-r--r-- | include/linux/socket.h | 2 | ||||
-rw-r--r-- | net/core/iovec.c | 24 |
4 files changed, 26 insertions, 46 deletions
diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c index a98fb0ed6aef..dfec20df17ba 100644 --- a/drivers/net/macvtap.c +++ b/drivers/net/macvtap.c | |||
@@ -698,29 +698,6 @@ static int macvtap_skb_to_vnet_hdr(const struct sk_buff *skb, | |||
698 | return 0; | 698 | return 0; |
699 | } | 699 | } |
700 | 700 | ||
701 | static unsigned long iov_pages(const struct iovec *iv, int offset, | ||
702 | unsigned long nr_segs) | ||
703 | { | ||
704 | unsigned long seg, base; | ||
705 | int pages = 0, len, size; | ||
706 | |||
707 | while (nr_segs && (offset >= iv->iov_len)) { | ||
708 | offset -= iv->iov_len; | ||
709 | ++iv; | ||
710 | --nr_segs; | ||
711 | } | ||
712 | |||
713 | for (seg = 0; seg < nr_segs; seg++) { | ||
714 | base = (unsigned long)iv[seg].iov_base + offset; | ||
715 | len = iv[seg].iov_len - offset; | ||
716 | size = ((base & ~PAGE_MASK) + len + ~PAGE_MASK) >> PAGE_SHIFT; | ||
717 | pages += size; | ||
718 | offset = 0; | ||
719 | } | ||
720 | |||
721 | return pages; | ||
722 | } | ||
723 | |||
724 | /* Get packet from user space buffer */ | 701 | /* Get packet from user space buffer */ |
725 | static ssize_t macvtap_get_user(struct macvtap_queue *q, struct msghdr *m, | 702 | static ssize_t macvtap_get_user(struct macvtap_queue *q, struct msghdr *m, |
726 | const struct iovec *iv, unsigned long total_len, | 703 | const struct iovec *iv, unsigned long total_len, |
diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 5dce262f538e..18527ef0cc75 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c | |||
@@ -1041,29 +1041,6 @@ static int zerocopy_sg_from_iovec(struct sk_buff *skb, const struct iovec *from, | |||
1041 | return 0; | 1041 | return 0; |
1042 | } | 1042 | } |
1043 | 1043 | ||
1044 | static unsigned long iov_pages(const struct iovec *iv, int offset, | ||
1045 | unsigned long nr_segs) | ||
1046 | { | ||
1047 | unsigned long seg, base; | ||
1048 | int pages = 0, len, size; | ||
1049 | |||
1050 | while (nr_segs && (offset >= iv->iov_len)) { | ||
1051 | offset -= iv->iov_len; | ||
1052 | ++iv; | ||
1053 | --nr_segs; | ||
1054 | } | ||
1055 | |||
1056 | for (seg = 0; seg < nr_segs; seg++) { | ||
1057 | base = (unsigned long)iv[seg].iov_base + offset; | ||
1058 | len = iv[seg].iov_len - offset; | ||
1059 | size = ((base & ~PAGE_MASK) + len + ~PAGE_MASK) >> PAGE_SHIFT; | ||
1060 | pages += size; | ||
1061 | offset = 0; | ||
1062 | } | ||
1063 | |||
1064 | return pages; | ||
1065 | } | ||
1066 | |||
1067 | /* Get packet from user space buffer */ | 1044 | /* Get packet from user space buffer */ |
1068 | static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile, | 1045 | static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile, |
1069 | void *msg_control, const struct iovec *iv, | 1046 | void *msg_control, const struct iovec *iv, |
diff --git a/include/linux/socket.h b/include/linux/socket.h index 230c04bda3e2..445ef7519dc2 100644 --- a/include/linux/socket.h +++ b/include/linux/socket.h | |||
@@ -313,6 +313,8 @@ extern int csum_partial_copy_fromiovecend(unsigned char *kdata, | |||
313 | struct iovec *iov, | 313 | struct iovec *iov, |
314 | int offset, | 314 | int offset, |
315 | unsigned int len, __wsum *csump); | 315 | unsigned int len, __wsum *csump); |
316 | extern unsigned long iov_pages(const struct iovec *iov, int offset, | ||
317 | unsigned long nr_segs); | ||
316 | 318 | ||
317 | extern int verify_iovec(struct msghdr *m, struct iovec *iov, struct sockaddr_storage *address, int mode); | 319 | extern int verify_iovec(struct msghdr *m, struct iovec *iov, struct sockaddr_storage *address, int mode); |
318 | extern int memcpy_toiovecend(const struct iovec *v, unsigned char *kdata, | 320 | extern int memcpy_toiovecend(const struct iovec *v, unsigned char *kdata, |
diff --git a/net/core/iovec.c b/net/core/iovec.c index de178e462682..b77eeecc0011 100644 --- a/net/core/iovec.c +++ b/net/core/iovec.c | |||
@@ -212,3 +212,27 @@ out_fault: | |||
212 | goto out; | 212 | goto out; |
213 | } | 213 | } |
214 | EXPORT_SYMBOL(csum_partial_copy_fromiovecend); | 214 | EXPORT_SYMBOL(csum_partial_copy_fromiovecend); |
215 | |||
216 | unsigned long iov_pages(const struct iovec *iov, int offset, | ||
217 | unsigned long nr_segs) | ||
218 | { | ||
219 | unsigned long seg, base; | ||
220 | int pages = 0, len, size; | ||
221 | |||
222 | while (nr_segs && (offset >= iov->iov_len)) { | ||
223 | offset -= iov->iov_len; | ||
224 | ++iov; | ||
225 | --nr_segs; | ||
226 | } | ||
227 | |||
228 | for (seg = 0; seg < nr_segs; seg++) { | ||
229 | base = (unsigned long)iov[seg].iov_base + offset; | ||
230 | len = iov[seg].iov_len - offset; | ||
231 | size = ((base & ~PAGE_MASK) + len + ~PAGE_MASK) >> PAGE_SHIFT; | ||
232 | pages += size; | ||
233 | offset = 0; | ||
234 | } | ||
235 | |||
236 | return pages; | ||
237 | } | ||
238 | EXPORT_SYMBOL(iov_pages); | ||