]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net: split __zerocopy_sg_from_iter()
authorPavel Begunkov <asml.silence@gmail.com>
Thu, 27 Jun 2024 12:59:42 +0000 (13:59 +0100)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 2 Jul 2024 10:06:50 +0000 (12:06 +0200)
Split a function out of __zerocopy_sg_from_iter() that only cares about
the traditional path with refcounted pages and doesn't need to know
about ->sg_from_iter. A preparation patch, we'll improve on the function
later.

Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Reviewed-by: Willem de Bruijn <willemb@google.com>
Reviewed-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
net/core/datagram.c

index e614cfd8e14a50a08c764dfed30c2e0838413a93..ef81d6ecbe1ee6657f89a51a695b2cd35543cf7f 100644 (file)
@@ -610,16 +610,10 @@ fault:
 }
 EXPORT_SYMBOL(skb_copy_datagram_from_iter);
 
-int __zerocopy_sg_from_iter(struct msghdr *msg, struct sock *sk,
-                           struct sk_buff *skb, struct iov_iter *from,
-                           size_t length)
+static int zerocopy_fill_skb_from_iter(struct sock *sk, struct sk_buff *skb,
+                                       struct iov_iter *from, size_t length)
 {
-       int frag;
-
-       if (msg && msg->msg_ubuf && msg->sg_from_iter)
-               return msg->sg_from_iter(sk, skb, from, length);
-
-       frag = skb_shinfo(skb)->nr_frags;
+       int frag = skb_shinfo(skb)->nr_frags;
 
        while (length && iov_iter_count(from)) {
                struct page *head, *last_head = NULL;
@@ -692,6 +686,16 @@ int __zerocopy_sg_from_iter(struct msghdr *msg, struct sock *sk,
        }
        return 0;
 }
+
+int __zerocopy_sg_from_iter(struct msghdr *msg, struct sock *sk,
+                           struct sk_buff *skb, struct iov_iter *from,
+                           size_t length)
+{
+       if (msg && msg->msg_ubuf && msg->sg_from_iter)
+               return msg->sg_from_iter(sk, skb, from, length);
+       else
+               return zerocopy_fill_skb_from_iter(sk, skb, from, length);
+}
 EXPORT_SYMBOL(__zerocopy_sg_from_iter);
 
 /**