X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=net%2Fipv6%2Fip6_output.c;h=1e8c90e976080aa73fa4035515e8d49ceec63bf5;hb=5a6f6873606e03a0a95afe40ba5e84bb6e28a26f;hp=9554cf46ed88833d7fb421dddefbde0a45b4ac91;hpb=849a4f09730ba3c02da01924c7a6e7a000a4d27c;p=platform%2Fkernel%2Flinux-starfive.git diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 9554cf4..1e8c90e 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c @@ -42,6 +42,7 @@ #include #include +#include #include #include #include @@ -1589,6 +1590,15 @@ emsgsize: skb_zcopy_set(skb, uarg, &extra_uref); } } + } else if ((flags & MSG_SPLICE_PAGES) && length) { + if (inet_sk(sk)->hdrincl) + return -EPERM; + if (rt->dst.dev->features & NETIF_F_SG && + getfrag == ip_generic_getfrag) + /* We need an empty buffer to attach stuff to */ + paged = true; + else + flags &= ~MSG_SPLICE_PAGES; } /* @@ -1778,6 +1788,15 @@ alloc_new_skb: err = -EFAULT; goto error; } + } else if (flags & MSG_SPLICE_PAGES) { + struct msghdr *msg = from; + + err = skb_splice_from_iter(skb, &msg->msg_iter, copy, + sk->sk_allocation); + if (err < 0) + goto error; + copy = err; + wmem_alloc_delta += copy; } else if (!zc) { int i = skb_shinfo(skb)->nr_frags;