aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/macvtap.c23
-rw-r--r--drivers/net/tun.c23
-rw-r--r--include/linux/socket.h2
-rw-r--r--net/core/iovec.c24
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
701static 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 */
725static ssize_t macvtap_get_user(struct macvtap_queue *q, struct msghdr *m, 702static 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
1044static 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 */
1068static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile, 1045static 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);
316extern unsigned long iov_pages(const struct iovec *iov, int offset,
317 unsigned long nr_segs);
316 318
317extern int verify_iovec(struct msghdr *m, struct iovec *iov, struct sockaddr_storage *address, int mode); 319extern int verify_iovec(struct msghdr *m, struct iovec *iov, struct sockaddr_storage *address, int mode);
318extern int memcpy_toiovecend(const struct iovec *v, unsigned char *kdata, 320extern 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}
214EXPORT_SYMBOL(csum_partial_copy_fromiovecend); 214EXPORT_SYMBOL(csum_partial_copy_fromiovecend);
215
216unsigned 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}
238EXPORT_SYMBOL(iov_pages);