Skip to content

Commit 6d0d419

Browse files
dhowellsbrauner
authored andcommitted
iov_iter, net: Move csum_and_copy_to/from_iter() to net/
Move csum_and_copy_to/from_iter() to net code now that the iteration framework can be #included. Signed-off-by: David Howells <[email protected]> Link: https://lore.kernel.org/r/[email protected] cc: Alexander Viro <[email protected]> cc: Jens Axboe <[email protected]> cc: Christoph Hellwig <[email protected]> cc: Christian Brauner <[email protected]> cc: Matthew Wilcox <[email protected]> cc: Linus Torvalds <[email protected]> cc: David Laight <[email protected]> cc: "David S. Miller" <[email protected]> cc: Eric Dumazet <[email protected]> cc: Jakub Kicinski <[email protected]> cc: Paolo Abeni <[email protected]> cc: [email protected] cc: [email protected] cc: [email protected] cc: [email protected] Signed-off-by: Christian Brauner <[email protected]>
1 parent c9eec08 commit 6d0d419

File tree

5 files changed

+107
-108
lines changed

5 files changed

+107
-108
lines changed

include/linux/skbuff.h

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3679,6 +3679,31 @@ static inline int __must_check skb_put_padto(struct sk_buff *skb, unsigned int l
36793679
return __skb_put_padto(skb, len, true);
36803680
}
36813681

3682+
static inline __wsum csum_and_memcpy(void *to, const void *from, size_t len,
3683+
__wsum sum, size_t off)
3684+
{
3685+
__wsum next = csum_partial_copy_nocheck(from, to, len);
3686+
return csum_block_add(sum, next, off);
3687+
}
3688+
3689+
struct csum_state {
3690+
__wsum csum;
3691+
size_t off;
3692+
};
3693+
3694+
size_t csum_and_copy_from_iter(void *addr, size_t bytes, __wsum *csum, struct iov_iter *i);
3695+
3696+
static __always_inline __must_check
3697+
bool csum_and_copy_from_iter_full(void *addr, size_t bytes,
3698+
__wsum *csum, struct iov_iter *i)
3699+
{
3700+
size_t copied = csum_and_copy_from_iter(addr, bytes, csum, i);
3701+
if (likely(copied == bytes))
3702+
return true;
3703+
iov_iter_revert(i, copied);
3704+
return false;
3705+
}
3706+
36823707
static inline int skb_add_data(struct sk_buff *skb,
36833708
struct iov_iter *from, int copy)
36843709
{

include/linux/uio.h

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -338,24 +338,6 @@ iov_iter_npages_cap(struct iov_iter *i, int maxpages, size_t max_bytes)
338338
return npages;
339339
}
340340

341-
struct csum_state {
342-
__wsum csum;
343-
size_t off;
344-
};
345-
346-
size_t csum_and_copy_to_iter(const void *addr, size_t bytes, void *csstate, struct iov_iter *i);
347-
size_t csum_and_copy_from_iter(void *addr, size_t bytes, __wsum *csum, struct iov_iter *i);
348-
349-
static __always_inline __must_check
350-
bool csum_and_copy_from_iter_full(void *addr, size_t bytes,
351-
__wsum *csum, struct iov_iter *i)
352-
{
353-
size_t copied = csum_and_copy_from_iter(addr, bytes, csum, i);
354-
if (likely(copied == bytes))
355-
return true;
356-
iov_iter_revert(i, copied);
357-
return false;
358-
}
359341
size_t hash_and_copy_to_iter(const void *addr, size_t bytes, void *hashp,
360342
struct iov_iter *i);
361343

lib/iov_iter.c

Lines changed: 0 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
#include <linux/vmalloc.h>
1111
#include <linux/splice.h>
1212
#include <linux/compat.h>
13-
#include <net/checksum.h>
1413
#include <linux/scatterlist.h>
1514
#include <linux/instrumented.h>
1615
#include <linux/iov_iter.h>
@@ -179,13 +178,6 @@ void iov_iter_init(struct iov_iter *i, unsigned int direction,
179178
}
180179
EXPORT_SYMBOL(iov_iter_init);
181180

182-
static __wsum csum_and_memcpy(void *to, const void *from, size_t len,
183-
__wsum sum, size_t off)
184-
{
185-
__wsum next = csum_partial_copy_nocheck(from, to, len);
186-
return csum_block_add(sum, next, off);
187-
}
188-
189181
size_t _copy_to_iter(const void *addr, size_t bytes, struct iov_iter *i)
190182
{
191183
if (WARN_ON_ONCE(i->data_source))
@@ -1097,87 +1089,6 @@ ssize_t iov_iter_get_pages_alloc2(struct iov_iter *i,
10971089
}
10981090
EXPORT_SYMBOL(iov_iter_get_pages_alloc2);
10991091

1100-
static __always_inline
1101-
size_t copy_from_user_iter_csum(void __user *iter_from, size_t progress,
1102-
size_t len, void *to, void *priv2)
1103-
{
1104-
__wsum next, *csum = priv2;
1105-
1106-
next = csum_and_copy_from_user(iter_from, to + progress, len);
1107-
*csum = csum_block_add(*csum, next, progress);
1108-
return next ? 0 : len;
1109-
}
1110-
1111-
static __always_inline
1112-
size_t memcpy_from_iter_csum(void *iter_from, size_t progress,
1113-
size_t len, void *to, void *priv2)
1114-
{
1115-
__wsum *csum = priv2;
1116-
1117-
*csum = csum_and_memcpy(to + progress, iter_from, len, *csum, progress);
1118-
return 0;
1119-
}
1120-
1121-
size_t csum_and_copy_from_iter(void *addr, size_t bytes, __wsum *csum,
1122-
struct iov_iter *i)
1123-
{
1124-
if (WARN_ON_ONCE(!i->data_source))
1125-
return 0;
1126-
return iterate_and_advance2(i, bytes, addr, csum,
1127-
copy_from_user_iter_csum,
1128-
memcpy_from_iter_csum);
1129-
}
1130-
EXPORT_SYMBOL(csum_and_copy_from_iter);
1131-
1132-
static __always_inline
1133-
size_t copy_to_user_iter_csum(void __user *iter_to, size_t progress,
1134-
size_t len, void *from, void *priv2)
1135-
{
1136-
__wsum next, *csum = priv2;
1137-
1138-
next = csum_and_copy_to_user(from + progress, iter_to, len);
1139-
*csum = csum_block_add(*csum, next, progress);
1140-
return next ? 0 : len;
1141-
}
1142-
1143-
static __always_inline
1144-
size_t memcpy_to_iter_csum(void *iter_to, size_t progress,
1145-
size_t len, void *from, void *priv2)
1146-
{
1147-
__wsum *csum = priv2;
1148-
1149-
*csum = csum_and_memcpy(iter_to, from + progress, len, *csum, progress);
1150-
return 0;
1151-
}
1152-
1153-
size_t csum_and_copy_to_iter(const void *addr, size_t bytes, void *_csstate,
1154-
struct iov_iter *i)
1155-
{
1156-
struct csum_state *csstate = _csstate;
1157-
__wsum sum;
1158-
1159-
if (WARN_ON_ONCE(i->data_source))
1160-
return 0;
1161-
if (unlikely(iov_iter_is_discard(i))) {
1162-
// can't use csum_memcpy() for that one - data is not copied
1163-
csstate->csum = csum_block_add(csstate->csum,
1164-
csum_partial(addr, bytes, 0),
1165-
csstate->off);
1166-
csstate->off += bytes;
1167-
return bytes;
1168-
}
1169-
1170-
sum = csum_shift(csstate->csum, csstate->off);
1171-
1172-
bytes = iterate_and_advance2(i, bytes, (void *)addr, &sum,
1173-
copy_to_user_iter_csum,
1174-
memcpy_to_iter_csum);
1175-
csstate->csum = csum_shift(sum, csstate->off);
1176-
csstate->off += bytes;
1177-
return bytes;
1178-
}
1179-
EXPORT_SYMBOL(csum_and_copy_to_iter);
1180-
11811092
size_t hash_and_copy_to_iter(const void *addr, size_t bytes, void *hashp,
11821093
struct iov_iter *i)
11831094
{

net/core/datagram.c

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
#include <linux/spinlock.h>
5151
#include <linux/slab.h>
5252
#include <linux/pagemap.h>
53-
#include <linux/uio.h>
53+
#include <linux/iov_iter.h>
5454
#include <linux/indirect_call_wrapper.h>
5555

5656
#include <net/protocol.h>
@@ -716,6 +716,54 @@ int zerocopy_sg_from_iter(struct sk_buff *skb, struct iov_iter *from)
716716
}
717717
EXPORT_SYMBOL(zerocopy_sg_from_iter);
718718

719+
static __always_inline
720+
size_t copy_to_user_iter_csum(void __user *iter_to, size_t progress,
721+
size_t len, void *from, void *priv2)
722+
{
723+
__wsum next, *csum = priv2;
724+
725+
next = csum_and_copy_to_user(from + progress, iter_to, len);
726+
*csum = csum_block_add(*csum, next, progress);
727+
return next ? 0 : len;
728+
}
729+
730+
static __always_inline
731+
size_t memcpy_to_iter_csum(void *iter_to, size_t progress,
732+
size_t len, void *from, void *priv2)
733+
{
734+
__wsum *csum = priv2;
735+
736+
*csum = csum_and_memcpy(iter_to, from + progress, len, *csum, progress);
737+
return 0;
738+
}
739+
740+
static size_t csum_and_copy_to_iter(const void *addr, size_t bytes, void *_csstate,
741+
struct iov_iter *i)
742+
{
743+
struct csum_state *csstate = _csstate;
744+
__wsum sum;
745+
746+
if (WARN_ON_ONCE(i->data_source))
747+
return 0;
748+
if (unlikely(iov_iter_is_discard(i))) {
749+
// can't use csum_memcpy() for that one - data is not copied
750+
csstate->csum = csum_block_add(csstate->csum,
751+
csum_partial(addr, bytes, 0),
752+
csstate->off);
753+
csstate->off += bytes;
754+
return bytes;
755+
}
756+
757+
sum = csum_shift(csstate->csum, csstate->off);
758+
759+
bytes = iterate_and_advance2(i, bytes, (void *)addr, &sum,
760+
copy_to_user_iter_csum,
761+
memcpy_to_iter_csum);
762+
csstate->csum = csum_shift(sum, csstate->off);
763+
csstate->off += bytes;
764+
return bytes;
765+
}
766+
719767
/**
720768
* skb_copy_and_csum_datagram - Copy datagram to an iovec iterator
721769
* and update a checksum.

net/core/skbuff.c

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
#include <linux/if_vlan.h>
6363
#include <linux/mpls.h>
6464
#include <linux/kcov.h>
65+
#include <linux/iov_iter.h>
6566

6667
#include <net/protocol.h>
6768
#include <net/dst.h>
@@ -6931,3 +6932,35 @@ ssize_t skb_splice_from_iter(struct sk_buff *skb, struct iov_iter *iter,
69316932
return spliced ?: ret;
69326933
}
69336934
EXPORT_SYMBOL(skb_splice_from_iter);
6935+
6936+
static __always_inline
6937+
size_t memcpy_from_iter_csum(void *iter_from, size_t progress,
6938+
size_t len, void *to, void *priv2)
6939+
{
6940+
__wsum *csum = priv2;
6941+
6942+
*csum = csum_and_memcpy(to + progress, iter_from, len, *csum, progress);
6943+
return 0;
6944+
}
6945+
6946+
static __always_inline
6947+
size_t copy_from_user_iter_csum(void __user *iter_from, size_t progress,
6948+
size_t len, void *to, void *priv2)
6949+
{
6950+
__wsum next, *csum = priv2;
6951+
6952+
next = csum_and_copy_from_user(iter_from, to + progress, len);
6953+
*csum = csum_block_add(*csum, next, progress);
6954+
return next ? 0 : len;
6955+
}
6956+
6957+
size_t csum_and_copy_from_iter(void *addr, size_t bytes, __wsum *csum,
6958+
struct iov_iter *i)
6959+
{
6960+
if (WARN_ON_ONCE(!i->data_source))
6961+
return 0;
6962+
return iterate_and_advance2(i, bytes, addr, csum,
6963+
copy_from_user_iter_csum,
6964+
memcpy_from_iter_csum);
6965+
}
6966+
EXPORT_SYMBOL(csum_and_copy_from_iter);

0 commit comments

Comments
 (0)