sock: Remove ->sendpage*() in favour of sendmsg(MSG_SPLICE_PAGES)
authorDavid Howells <dhowells@redhat.com>
Fri, 23 Jun 2023 22:55:12 +0000 (23:55 +0100)
committerJakub Kicinski <kuba@kernel.org>
Sat, 24 Jun 2023 22:50:13 +0000 (15:50 -0700)
Remove ->sendpage() and ->sendpage_locked().  sendmsg() with
MSG_SPLICE_PAGES should be used instead.  This allows multiple pages and
multipage folios to be passed through.

Signed-off-by: David Howells <dhowells@redhat.com>
Acked-by: Marc Kleine-Budde <mkl@pengutronix.de> # for net/can
cc: Jens Axboe <axboe@kernel.dk>
cc: Matthew Wilcox <willy@infradead.org>
cc: linux-afs@lists.infradead.org
cc: mptcp@lists.linux.dev
cc: rds-devel@oss.oracle.com
cc: tipc-discussion@lists.sourceforge.net
cc: virtualization@lists.linux-foundation.org
Link: https://lore.kernel.org/r/20230623225513.2732256-16-dhowells@redhat.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
66 files changed:
Documentation/bpf/map_sockmap.rst
Documentation/filesystems/locking.rst
Documentation/filesystems/vfs.rst
Documentation/networking/scaling.rst
crypto/af_alg.c
crypto/algif_aead.c
crypto/algif_rng.c
crypto/algif_skcipher.c
drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls.h
drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_io.c
drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_main.c
fs/nfsd/vfs.c
include/crypto/if_alg.h
include/linux/net.h
include/net/inet_common.h
include/net/sock.h
include/net/tcp.h
net/appletalk/ddp.c
net/atm/pvc.c
net/atm/svc.c
net/ax25/af_ax25.c
net/caif/caif_socket.c
net/can/bcm.c
net/can/isotp.c
net/can/j1939/socket.c
net/can/raw.c
net/core/sock.c
net/dccp/ipv4.c
net/dccp/ipv6.c
net/ieee802154/socket.c
net/ipv4/af_inet.c
net/ipv4/tcp.c
net/ipv4/tcp_bpf.c
net/ipv4/tcp_ipv4.c
net/ipv4/udp.c
net/ipv4/udp_impl.h
net/ipv4/udplite.c
net/ipv6/af_inet6.c
net/ipv6/raw.c
net/ipv6/tcp_ipv6.c
net/kcm/kcmsock.c
net/key/af_key.c
net/l2tp/l2tp_ip.c
net/l2tp/l2tp_ip6.c
net/llc/af_llc.c
net/mctp/af_mctp.c
net/mptcp/protocol.c
net/netlink/af_netlink.c
net/netrom/af_netrom.c
net/packet/af_packet.c
net/phonet/socket.c
net/qrtr/af_qrtr.c
net/rds/af_rds.c
net/rose/af_rose.c
net/rxrpc/af_rxrpc.c
net/sctp/protocol.c
net/socket.c
net/tipc/socket.c
net/tls/tls.h
net/tls/tls_device.c
net/tls/tls_main.c
net/tls/tls_sw.c
net/unix/af_unix.c
net/vmw_vsock/af_vsock.c
net/x25/af_x25.c
net/xdp/xsk.c

index cc92047c66300fce4bcf98a609633147786a3036..2d630686a00baa141bb7557098117f0eb236455b 100644 (file)
@@ -240,11 +240,11 @@ offsets into ``msg``, respectively.
 If a program of type ``BPF_PROG_TYPE_SK_MSG`` is run on a ``msg`` it can only
 parse data that the (``data``, ``data_end``) pointers have already consumed.
 For ``sendmsg()`` hooks this is likely the first scatterlist element. But for
-calls relying on the ``sendpage`` handler (e.g., ``sendfile()``) this will be
-the range (**0**, **0**) because the data is shared with user space and by
-default the objective is to avoid allowing user space to modify data while (or
-after) BPF verdict is being decided. This helper can be used to pull in data
-and to set the start and end pointers to given values. Data will be copied if
+calls relying on MSG_SPLICE_PAGES (e.g., ``sendfile()``) this will be the
+range (**0**, **0**) because the data is shared with user space and by default
+the objective is to avoid allowing user space to modify data while (or after)
+BPF verdict is being decided. This helper can be used to pull in data and to
+set the start and end pointers to given values. Data will be copied if
 necessary (i.e., if data was not linear and if start and end pointers do not
 point to the same chunk).
 
index aa1a233b0fa862a78f8a59cfb6f627525817252b..ed148919e11ad5e49ecd569110f8cabf7541607e 100644 (file)
@@ -521,8 +521,6 @@ prototypes::
        int (*fsync) (struct file *, loff_t start, loff_t end, int datasync);
        int (*fasync) (int, struct file *, int);
        int (*lock) (struct file *, int, struct file_lock *);
-       ssize_t (*sendpage) (struct file *, struct page *, int, size_t,
-                       loff_t *, int);
        unsigned long (*get_unmapped_area)(struct file *, unsigned long,
                        unsigned long, unsigned long, unsigned long);
        int (*check_flags)(int);
index 769be5230210769b454f14cbdf640301dd034121..cb2a97e498726536c7dcc14cafd035bd468882af 100644 (file)
@@ -1086,7 +1086,6 @@ This describes how the VFS can manipulate an open file.  As of kernel
                int (*fsync) (struct file *, loff_t, loff_t, int datasync);
                int (*fasync) (int, struct file *, int);
                int (*lock) (struct file *, int, struct file_lock *);
-               ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);
                unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
                int (*check_flags)(int);
                int (*flock) (struct file *, int, struct file_lock *);
index 3d435caa3ef2bbc25414389ba78872260510e63b..92c9fb46d6a21c7c5490973a63301f0fe341a1bf 100644 (file)
@@ -269,8 +269,8 @@ a single application thread handles flows with many different flow hashes.
 rps_sock_flow_table is a global flow table that contains the *desired* CPU
 for flows: the CPU that is currently processing the flow in userspace.
 Each table value is a CPU index that is updated during calls to recvmsg
-and sendmsg (specifically, inet_recvmsg(), inet_sendmsg(), inet_sendpage()
-and tcp_splice_read()).
+and sendmsg (specifically, inet_recvmsg(), inet_sendmsg() and
+tcp_splice_read()).
 
 When the scheduler moves a thread to a new CPU while it has outstanding
 receive packets on the old CPU, packets may arrive out of order. To
index cdb1dcc5dd1a19f6258c28518619a1744ed19ef9..6218c773d71c5906c6d2c6a63232502b21b25cd0 100644 (file)
@@ -482,7 +482,6 @@ static const struct proto_ops alg_proto_ops = {
        .listen         =       sock_no_listen,
        .shutdown       =       sock_no_shutdown,
        .mmap           =       sock_no_mmap,
-       .sendpage       =       sock_no_sendpage,
        .sendmsg        =       sock_no_sendmsg,
        .recvmsg        =       sock_no_recvmsg,
 
@@ -1106,33 +1105,6 @@ unlock:
 }
 EXPORT_SYMBOL_GPL(af_alg_sendmsg);
 
-/**
- * af_alg_sendpage - sendpage system call handler
- * @sock: socket of connection to user space to write to
- * @page: data to send
- * @offset: offset into page to begin sending
- * @size: length of data
- * @flags: message send/receive flags
- *
- * This is a generic implementation of sendpage to fill ctx->tsgl_list.
- */
-ssize_t af_alg_sendpage(struct socket *sock, struct page *page,
-                       int offset, size_t size, int flags)
-{
-       struct bio_vec bvec;
-       struct msghdr msg = {
-               .msg_flags = flags | MSG_SPLICE_PAGES,
-       };
-
-       if (flags & MSG_SENDPAGE_NOTLAST)
-               msg.msg_flags |= MSG_MORE;
-
-       bvec_set_page(&bvec, page, size, offset);
-       iov_iter_bvec(&msg.msg_iter, ITER_SOURCE, &bvec, 1, size);
-       return sock_sendmsg(sock, &msg);
-}
-EXPORT_SYMBOL_GPL(af_alg_sendpage);
-
 /**
  * af_alg_free_resources - release resources required for crypto request
  * @areq: Request holding the TX and RX SGL
index 35bfa283748d957eaa1f123ac08e0eedbb82c54a..7d58cbbce4af28bbaec153ca31feabe0345df516 100644 (file)
@@ -9,10 +9,10 @@
  * The following concept of the memory management is used:
  *
  * The kernel maintains two SGLs, the TX SGL and the RX SGL. The TX SGL is
- * filled by user space with the data submitted via sendpage. Filling up
- * the TX SGL does not cause a crypto operation -- the data will only be
- * tracked by the kernel. Upon receipt of one recvmsg call, the caller must
- * provide a buffer which is tracked with the RX SGL.
+ * filled by user space with the data submitted via sendmsg (maybe with
+ * MSG_SPLICE_PAGES).  Filling up the TX SGL does not cause a crypto operation
+ * -- the data will only be tracked by the kernel. Upon receipt of one recvmsg
+ * call, the caller must provide a buffer which is tracked with the RX SGL.
  *
  * During the processing of the recvmsg operation, the cipher request is
  * allocated and prepared. As part of the recvmsg operation, the processed
@@ -370,7 +370,6 @@ static struct proto_ops algif_aead_ops = {
 
        .release        =       af_alg_release,
        .sendmsg        =       aead_sendmsg,
-       .sendpage       =       af_alg_sendpage,
        .recvmsg        =       aead_recvmsg,
        .poll           =       af_alg_poll,
 };
@@ -422,18 +421,6 @@ static int aead_sendmsg_nokey(struct socket *sock, struct msghdr *msg,
        return aead_sendmsg(sock, msg, size);
 }
 
-static ssize_t aead_sendpage_nokey(struct socket *sock, struct page *page,
-                                      int offset, size_t size, int flags)
-{
-       int err;
-
-       err = aead_check_key(sock);
-       if (err)
-               return err;
-
-       return af_alg_sendpage(sock, page, offset, size, flags);
-}
-
 static int aead_recvmsg_nokey(struct socket *sock, struct msghdr *msg,
                                  size_t ignored, int flags)
 {
@@ -461,7 +448,6 @@ static struct proto_ops algif_aead_ops_nokey = {
 
        .release        =       af_alg_release,
        .sendmsg        =       aead_sendmsg_nokey,
-       .sendpage       =       aead_sendpage_nokey,
        .recvmsg        =       aead_recvmsg_nokey,
        .poll           =       af_alg_poll,
 };
index 407408c437308f9d27eb0031da0fb16a4c8bf2a6..10c41adac3b1f3574494ad71ce65f6e4db383997 100644 (file)
@@ -174,7 +174,6 @@ static struct proto_ops algif_rng_ops = {
        .bind           =       sock_no_bind,
        .accept         =       sock_no_accept,
        .sendmsg        =       sock_no_sendmsg,
-       .sendpage       =       sock_no_sendpage,
 
        .release        =       af_alg_release,
        .recvmsg        =       rng_recvmsg,
@@ -192,7 +191,6 @@ static struct proto_ops __maybe_unused algif_rng_test_ops = {
        .mmap           =       sock_no_mmap,
        .bind           =       sock_no_bind,
        .accept         =       sock_no_accept,
-       .sendpage       =       sock_no_sendpage,
 
        .release        =       af_alg_release,
        .recvmsg        =       rng_test_recvmsg,
index b1f321b9f846af4d31dc517090aa9380212c769f..9ada9b741af8dc99e62c165a1d469123ebe8183d 100644 (file)
@@ -194,7 +194,6 @@ static struct proto_ops algif_skcipher_ops = {
 
        .release        =       af_alg_release,
        .sendmsg        =       skcipher_sendmsg,
-       .sendpage       =       af_alg_sendpage,
        .recvmsg        =       skcipher_recvmsg,
        .poll           =       af_alg_poll,
 };
@@ -246,18 +245,6 @@ static int skcipher_sendmsg_nokey(struct socket *sock, struct msghdr *msg,
        return skcipher_sendmsg(sock, msg, size);
 }
 
-static ssize_t skcipher_sendpage_nokey(struct socket *sock, struct page *page,
-                                      int offset, size_t size, int flags)
-{
-       int err;
-
-       err = skcipher_check_key(sock);
-       if (err)
-               return err;
-
-       return af_alg_sendpage(sock, page, offset, size, flags);
-}
-
 static int skcipher_recvmsg_nokey(struct socket *sock, struct msghdr *msg,
                                  size_t ignored, int flags)
 {
@@ -285,7 +272,6 @@ static struct proto_ops algif_skcipher_ops_nokey = {
 
        .release        =       af_alg_release,
        .sendmsg        =       skcipher_sendmsg_nokey,
-       .sendpage       =       skcipher_sendpage_nokey,
        .recvmsg        =       skcipher_recvmsg_nokey,
        .poll           =       af_alg_poll,
 };
index da4818d2c85647be9e5e8c29bae3e1f23da63629..68562a82d03681131d983d89b0f0ef549235442b 100644 (file)
@@ -569,8 +569,6 @@ int chtls_sendmsg(struct sock *sk, struct msghdr *msg, size_t size);
 int chtls_recvmsg(struct sock *sk, struct msghdr *msg,
                  size_t len, int flags, int *addr_len);
 void chtls_splice_eof(struct socket *sock);
-int chtls_sendpage(struct sock *sk, struct page *page,
-                  int offset, size_t size, int flags);
 int send_tx_flowc_wr(struct sock *sk, int compl,
                     u32 snd_nxt, u32 rcv_nxt);
 void chtls_tcp_push(struct sock *sk, int flags);
index e08ac960c96709e51ccc1eb234352a7b4662d8e2..5fc64e47568a9c55acaabb62eeb30cfa7524f876 100644 (file)
@@ -1246,20 +1246,6 @@ void chtls_splice_eof(struct socket *sock)
        release_sock(sk);
 }
 
-int chtls_sendpage(struct sock *sk, struct page *page,
-                  int offset, size_t size, int flags)
-{
-       struct msghdr msg = { .msg_flags = flags | MSG_SPLICE_PAGES, };
-       struct bio_vec bvec;
-
-       if (flags & MSG_SENDPAGE_NOTLAST)
-               msg.msg_flags |= MSG_MORE;
-
-       bvec_set_page(&bvec, page, size, offset);
-       iov_iter_bvec(&msg.msg_iter, ITER_SOURCE, &bvec, 1, size);
-       return chtls_sendmsg(sk, &msg, size);
-}
-
 static void chtls_select_window(struct sock *sk)
 {
        struct chtls_sock *csk = rcu_dereference_sk_user_data(sk);
index 6b6787eafd2fbf001ec0d68287c29664f7c93259..455a54708be4405ae6be05b8f3e70fd88f57c729 100644 (file)
@@ -607,7 +607,6 @@ static void __init chtls_init_ulp_ops(void)
        chtls_cpl_prot.shutdown         = chtls_shutdown;
        chtls_cpl_prot.sendmsg          = chtls_sendmsg;
        chtls_cpl_prot.splice_eof       = chtls_splice_eof;
-       chtls_cpl_prot.sendpage         = chtls_sendpage;
        chtls_cpl_prot.recvmsg          = chtls_recvmsg;
        chtls_cpl_prot.setsockopt       = chtls_setsockopt;
        chtls_cpl_prot.getsockopt       = chtls_getsockopt;
index db67f8e19344a454dbc8aa8166fe362ef156145d..8879e207ff5a4f117e524eb09cb4414dc8922453 100644 (file)
@@ -936,7 +936,7 @@ nfsd_open_verified(struct svc_rqst *rqstp, struct svc_fh *fhp, int may_flags,
 
 /*
  * Grab and keep cached pages associated with a file in the svc_rqst
- * so that they can be passed to the network sendmsg/sendpage routines
+ * so that they can be passed to the network sendmsg routines
  * directly. They will be released after the sending has completed.
  *
  * Return values: Number of bytes consumed, or -EIO if there are no
index 34224e77f5a25137e1159c16693743a967454f19..ef8ce86b1f7887f37ddf6d2d5bc1560aad44097c 100644 (file)
@@ -229,8 +229,6 @@ void af_alg_wmem_wakeup(struct sock *sk);
 int af_alg_wait_for_data(struct sock *sk, unsigned flags, unsigned min);
 int af_alg_sendmsg(struct socket *sock, struct msghdr *msg, size_t size,
                   unsigned int ivsize);
-ssize_t af_alg_sendpage(struct socket *sock, struct page *page,
-                       int offset, size_t size, int flags);
 void af_alg_free_resources(struct af_alg_async_req *areq);
 void af_alg_async_cb(void *data, int err);
 __poll_t af_alg_poll(struct file *file, struct socket *sock,
index 23324e9a2b3d25c770f9918d6fa8d5c6691c9e99..41c608c1b02c26071bffc9a44a075ee65cc56197 100644 (file)
@@ -207,8 +207,6 @@ struct proto_ops {
                                      size_t total_len, int flags);
        int             (*mmap)      (struct file *file, struct socket *sock,
                                      struct vm_area_struct * vma);
-       ssize_t         (*sendpage)  (struct socket *sock, struct page *page,
-                                     int offset, size_t size, int flags);
        ssize_t         (*splice_read)(struct socket *sock,  loff_t *ppos,
                                       struct pipe_inode_info *pipe, size_t len, unsigned int flags);
        void            (*splice_eof)(struct socket *sock);
@@ -222,8 +220,6 @@ struct proto_ops {
                                     sk_read_actor_t recv_actor);
        /* This is different from read_sock(), it reads an entire skb at a time. */
        int             (*read_skb)(struct sock *sk, skb_read_actor_t recv_actor);
-       int             (*sendpage_locked)(struct sock *sk, struct page *page,
-                                          int offset, size_t size, int flags);
        int             (*sendmsg_locked)(struct sock *sk, struct msghdr *msg,
                                          size_t size);
        int             (*set_rcvlowat)(struct sock *sk, int val);
@@ -341,10 +337,6 @@ int kernel_connect(struct socket *sock, struct sockaddr *addr, int addrlen,
                   int flags);
 int kernel_getsockname(struct socket *sock, struct sockaddr *addr);
 int kernel_getpeername(struct socket *sock, struct sockaddr *addr);
-int kernel_sendpage(struct socket *sock, struct page *page, int offset,
-                   size_t size, int flags);
-int kernel_sendpage_locked(struct sock *sk, struct page *page, int offset,
-                          size_t size, int flags);
 int kernel_sock_shutdown(struct socket *sock, enum sock_shutdown_cmd how);
 
 /* Routine returns the IP overhead imposed by a (caller-protected) socket. */
index a75333342c4ec5da036f4bcbb04bbe567b0e53db..b86b8e21de7f74c6ad8ef91494e22ea35d50ad20 100644 (file)
@@ -36,8 +36,6 @@ void __inet_accept(struct socket *sock, struct socket *newsock,
 int inet_send_prepare(struct sock *sk);
 int inet_sendmsg(struct socket *sock, struct msghdr *msg, size_t size);
 void inet_splice_eof(struct socket *sock);
-ssize_t inet_sendpage(struct socket *sock, struct page *page, int offset,
-                     size_t size, int flags);
 int inet_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
                 int flags);
 int inet_shutdown(struct socket *sock, int how);
index 62a1b99da3496ceff94f4ec0b283da82d21015ee..121284f455a83741a51c1cb10c499064478017de 100644 (file)
@@ -1277,8 +1277,6 @@ struct proto {
                                           size_t len);
        int                     (*recvmsg)(struct sock *sk, struct msghdr *msg,
                                           size_t len, int flags, int *addr_len);
-       int                     (*sendpage)(struct sock *sk, struct page *page,
-                                       int offset, size_t size, int flags);
        void                    (*splice_eof)(struct socket *sock);
        int                     (*bind)(struct sock *sk,
                                        struct sockaddr *addr, int addr_len);
@@ -1919,10 +1917,6 @@ int sock_no_sendmsg_locked(struct sock *sk, struct msghdr *msg, size_t len);
 int sock_no_recvmsg(struct socket *, struct msghdr *, size_t, int);
 int sock_no_mmap(struct file *file, struct socket *sock,
                 struct vm_area_struct *vma);
-ssize_t sock_no_sendpage(struct socket *sock, struct page *page, int offset,
-                        size_t size, int flags);
-ssize_t sock_no_sendpage_locked(struct sock *sk, struct page *page,
-                               int offset, size_t size, int flags);
 
 /*
  * Functions to fill in entries in struct proto_ops when a protocol
index 31b534370787a0ce8f28f492108fbfab154ee3be..226bce6d1e8c30185260baadec449b67323db91c 100644 (file)
@@ -329,10 +329,6 @@ int tcp_sendmsg_locked(struct sock *sk, struct msghdr *msg, size_t size);
 int tcp_sendmsg_fastopen(struct sock *sk, struct msghdr *msg, int *copied,
                         size_t size, struct ubuf_info *uarg);
 void tcp_splice_eof(struct socket *sock);
-int tcp_sendpage(struct sock *sk, struct page *page, int offset, size_t size,
-                int flags);
-int tcp_sendpage_locked(struct sock *sk, struct page *page, int offset,
-                       size_t size, int flags);
 int tcp_send_mss(struct sock *sk, int *size_goal, int flags);
 int tcp_wmem_schedule(struct sock *sk, int copy);
 void tcp_push(struct sock *sk, int flags, int mss_now, int nonagle,
index a06f4d4a6f476a651abe9c1ad67eac0cb8a0264f..8978fb6212ffb670eb0bd0ef854df2a9da1da656 100644 (file)
@@ -1929,7 +1929,6 @@ static const struct proto_ops atalk_dgram_ops = {
        .sendmsg        = atalk_sendmsg,
        .recvmsg        = atalk_recvmsg,
        .mmap           = sock_no_mmap,
-       .sendpage       = sock_no_sendpage,
 };
 
 static struct notifier_block ddp_notifier = {
index 53e7d3f39e26cc859d7003243555b2ff4785d2e8..66d9a9bd58967201f38ab3d114ec4aa05571546a 100644 (file)
@@ -126,7 +126,6 @@ static const struct proto_ops pvc_proto_ops = {
        .sendmsg =      vcc_sendmsg,
        .recvmsg =      vcc_recvmsg,
        .mmap =         sock_no_mmap,
-       .sendpage =     sock_no_sendpage,
 };
 
 
index d83556d8beb9b3b2c2f101ac493c5cfc1a224b86..36a814f1fbd16f9f4fe789b65f81a06abc6710ff 100644 (file)
@@ -654,7 +654,6 @@ static const struct proto_ops svc_proto_ops = {
        .sendmsg =      vcc_sendmsg,
        .recvmsg =      vcc_recvmsg,
        .mmap =         sock_no_mmap,
-       .sendpage =     sock_no_sendpage,
 };
 
 
index d8da400cb4de152db3825074c36ed61c6c101b7a..5db805d5f74d73902071e04802d658e2abef95b6 100644 (file)
@@ -2022,7 +2022,6 @@ static const struct proto_ops ax25_proto_ops = {
        .sendmsg        = ax25_sendmsg,
        .recvmsg        = ax25_recvmsg,
        .mmap           = sock_no_mmap,
-       .sendpage       = sock_no_sendpage,
 };
 
 /*
index 4eebcc66c19a8c2d87dd41309be3595fa0588630..9c82698da4f509a6f7f8e2fa2f9a16ffc55c704f 100644 (file)
@@ -976,7 +976,6 @@ static const struct proto_ops caif_seqpacket_ops = {
        .sendmsg = caif_seqpkt_sendmsg,
        .recvmsg = caif_seqpkt_recvmsg,
        .mmap = sock_no_mmap,
-       .sendpage = sock_no_sendpage,
 };
 
 static const struct proto_ops caif_stream_ops = {
@@ -996,7 +995,6 @@ static const struct proto_ops caif_stream_ops = {
        .sendmsg = caif_stream_sendmsg,
        .recvmsg = caif_stream_recvmsg,
        .mmap = sock_no_mmap,
-       .sendpage = sock_no_sendpage,
 };
 
 /* This function is called when a socket is finally destroyed. */
index a962ec2b8ba5b393a7e5fafa6e88450dd7359008..9ba35685b04305b77fa3f48577136c89fe8047b3 100644 (file)
@@ -1703,7 +1703,6 @@ static const struct proto_ops bcm_ops = {
        .sendmsg       = bcm_sendmsg,
        .recvmsg       = bcm_recvmsg,
        .mmap          = sock_no_mmap,
-       .sendpage      = sock_no_sendpage,
 };
 
 static struct proto bcm_proto __read_mostly = {
index 84f9aba029017c47349aaed84639228a538fece1..1f25b45868cf3571931717c01325a56e93d04888 100644 (file)
@@ -1699,7 +1699,6 @@ static const struct proto_ops isotp_ops = {
        .sendmsg = isotp_sendmsg,
        .recvmsg = isotp_recvmsg,
        .mmap = sock_no_mmap,
-       .sendpage = sock_no_sendpage,
 };
 
 static struct proto isotp_proto __read_mostly = {
index 35970c25496ab569a01a839b9e129a5b20415856..feaec4ad6d163d6c898f7e63671a3e264bb2cd1b 100644 (file)
@@ -1306,7 +1306,6 @@ static const struct proto_ops j1939_ops = {
        .sendmsg = j1939_sk_sendmsg,
        .recvmsg = j1939_sk_recvmsg,
        .mmap = sock_no_mmap,
-       .sendpage = sock_no_sendpage,
 };
 
 static struct proto j1939_proto __read_mostly = {
index f64469b98260f2f7df1fdcdb11868e4981fa70df..15c79b079184ebb058445ed7858cd2e97315b1b3 100644 (file)
@@ -962,7 +962,6 @@ static const struct proto_ops raw_ops = {
        .sendmsg       = raw_sendmsg,
        .recvmsg       = raw_recvmsg,
        .mmap          = sock_no_mmap,
-       .sendpage      = sock_no_sendpage,
 };
 
 static struct proto raw_proto __read_mostly = {
index 5f1747c12004bdcf2dda552ef8e3d2221acfebc7..de719094b8045291fbaa066178b550b19fdfc6d0 100644 (file)
@@ -3261,36 +3261,6 @@ void __receive_sock(struct file *file)
        }
 }
 
-ssize_t sock_no_sendpage(struct socket *sock, struct page *page, int offset, size_t size, int flags)
-{
-       ssize_t res;
-       struct msghdr msg = {.msg_flags = flags};
-       struct kvec iov;
-       char *kaddr = kmap(page);
-       iov.iov_base = kaddr + offset;
-       iov.iov_len = size;
-       res = kernel_sendmsg(sock, &msg, &iov, 1, size);
-       kunmap(page);
-       return res;
-}
-EXPORT_SYMBOL(sock_no_sendpage);
-
-ssize_t sock_no_sendpage_locked(struct sock *sk, struct page *page,
-                               int offset, size_t size, int flags)
-{
-       ssize_t res;
-       struct msghdr msg = {.msg_flags = flags};
-       struct kvec iov;
-       char *kaddr = kmap(page);
-
-       iov.iov_base = kaddr + offset;
-       iov.iov_len = size;
-       res = kernel_sendmsg_locked(sk, &msg, &iov, 1, size);
-       kunmap(page);
-       return res;
-}
-EXPORT_SYMBOL(sock_no_sendpage_locked);
-
 /*
  *     Default Socket Callbacks
  */
@@ -4046,7 +4016,7 @@ static void proto_seq_printf(struct seq_file *seq, struct proto *proto)
 {
 
        seq_printf(seq, "%-9s %4u %6d  %6ld   %-3s %6u   %-3s  %-10s "
-                       "%2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c\n",
+                       "%2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c\n",
                   proto->name,
                   proto->obj_size,
                   sock_prot_inuse_get(seq_file_net(seq), proto),
@@ -4067,7 +4037,6 @@ static void proto_seq_printf(struct seq_file *seq, struct proto *proto)
                   proto_method_implemented(proto->getsockopt),
                   proto_method_implemented(proto->sendmsg),
                   proto_method_implemented(proto->recvmsg),
-                  proto_method_implemented(proto->sendpage),
                   proto_method_implemented(proto->bind),
                   proto_method_implemented(proto->backlog_rcv),
                   proto_method_implemented(proto->hash),
@@ -4088,7 +4057,7 @@ static int proto_seq_show(struct seq_file *seq, void *v)
                           "maxhdr",
                           "slab",
                           "module",
-                          "cl co di ac io in de sh ss gs se re sp bi br ha uh gp em\n");
+                          "cl co di ac io in de sh ss gs se re bi br ha uh gp em\n");
        else
                proto_seq_printf(seq, list_entry(v, struct proto, node));
        return 0;
index 3ab68415d121ce393168030b6821215ff28b1af4..fa8079303cb060aadb50ec1ae822876198c4ef4a 100644 (file)
@@ -1010,7 +1010,6 @@ static const struct proto_ops inet_dccp_ops = {
        .sendmsg           = inet_sendmsg,
        .recvmsg           = sock_common_recvmsg,
        .mmap              = sock_no_mmap,
-       .sendpage          = sock_no_sendpage,
 };
 
 static struct inet_protosw dccp_v4_protosw = {
index 93c98990d72632e18ae50c046b9fdc9e096f66de..7249ef218178743ce7936fcf2f605616a419370e 100644 (file)
@@ -1087,7 +1087,6 @@ static const struct proto_ops inet6_dccp_ops = {
        .sendmsg           = inet_sendmsg,
        .recvmsg           = sock_common_recvmsg,
        .mmap              = sock_no_mmap,
-       .sendpage          = sock_no_sendpage,
 #ifdef CONFIG_COMPAT
        .compat_ioctl      = inet6_compat_ioctl,
 #endif
index 9c124705120ddd92655ca8a52b7987316d7689fd..00302e8b9615b1a5b00b6d3d218b80745d768f91 100644 (file)
@@ -426,7 +426,6 @@ static const struct proto_ops ieee802154_raw_ops = {
        .sendmsg           = ieee802154_sock_sendmsg,
        .recvmsg           = sock_common_recvmsg,
        .mmap              = sock_no_mmap,
-       .sendpage          = sock_no_sendpage,
 };
 
 /* DGRAM Sockets (802.15.4 dataframes) */
@@ -989,7 +988,6 @@ static const struct proto_ops ieee802154_dgram_ops = {
        .sendmsg           = ieee802154_sock_sendmsg,
        .recvmsg           = sock_common_recvmsg,
        .mmap              = sock_no_mmap,
-       .sendpage          = sock_no_sendpage,
 };
 
 static void ieee802154_sock_destruct(struct sock *sk)
index 38e649fb447451b4cbbf8b844676804d76b1498e..9b2ca2fcc5a1176ffcaab4abee1492c6466ce5ca 100644 (file)
@@ -847,23 +847,6 @@ void inet_splice_eof(struct socket *sock)
 }
 EXPORT_SYMBOL_GPL(inet_splice_eof);
 
-ssize_t inet_sendpage(struct socket *sock, struct page *page, int offset,
-                     size_t size, int flags)
-{
-       struct sock *sk = sock->sk;
-       const struct proto *prot;
-
-       if (unlikely(inet_send_prepare(sk)))
-               return -EAGAIN;
-
-       /* IPV6_ADDRFORM can change sk->sk_prot under us. */
-       prot = READ_ONCE(sk->sk_prot);
-       if (prot->sendpage)
-               return prot->sendpage(sk, page, offset, size, flags);
-       return sock_no_sendpage(sock, page, offset, size, flags);
-}
-EXPORT_SYMBOL(inet_sendpage);
-
 INDIRECT_CALLABLE_DECLARE(int udp_recvmsg(struct sock *, struct msghdr *,
                                          size_t, int, int *));
 int inet_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
@@ -1067,12 +1050,10 @@ const struct proto_ops inet_stream_ops = {
        .mmap              = tcp_mmap,
 #endif
        .splice_eof        = inet_splice_eof,
-       .sendpage          = inet_sendpage,
        .splice_read       = tcp_splice_read,
        .read_sock         = tcp_read_sock,
        .read_skb          = tcp_read_skb,
        .sendmsg_locked    = tcp_sendmsg_locked,
-       .sendpage_locked   = tcp_sendpage_locked,
        .peek_len          = tcp_peek_len,
 #ifdef CONFIG_COMPAT
        .compat_ioctl      = inet_compat_ioctl,
@@ -1102,7 +1083,6 @@ const struct proto_ops inet_dgram_ops = {
        .recvmsg           = inet_recvmsg,
        .mmap              = sock_no_mmap,
        .splice_eof        = inet_splice_eof,
-       .sendpage          = inet_sendpage,
        .set_peek_off      = sk_set_peek_off,
 #ifdef CONFIG_COMPAT
        .compat_ioctl      = inet_compat_ioctl,
@@ -1134,7 +1114,6 @@ static const struct proto_ops inet_sockraw_ops = {
        .recvmsg           = inet_recvmsg,
        .mmap              = sock_no_mmap,
        .splice_eof        = inet_splice_eof,
-       .sendpage          = inet_sendpage,
 #ifdef CONFIG_COMPAT
        .compat_ioctl      = inet_compat_ioctl,
 #endif
index d56edc2c885fc5cc8c8df6a5d30a98def7484f3b..e03e08745308189c9d64509c2cff94da56c86a0c 100644 (file)
@@ -923,11 +923,10 @@ int tcp_send_mss(struct sock *sk, int *size_goal, int flags)
        return mss_now;
 }
 
-/* In some cases, both sendpage() and sendmsg() could have added
- * an skb to the write queue, but failed adding payload on it.
- * We need to remove it to consume less memory, but more
- * importantly be able to generate EPOLLOUT for Edge Trigger epoll()
- * users.
+/* In some cases, both sendmsg() could have added an skb to the write queue,
+ * but failed adding payload on it.  We need to remove it to consume less
+ * memory, but more importantly be able to generate EPOLLOUT for Edge Trigger
+ * epoll() users.
  */
 void tcp_remove_empty_skb(struct sock *sk)
 {
@@ -975,40 +974,6 @@ int tcp_wmem_schedule(struct sock *sk, int copy)
        return min(copy, sk->sk_forward_alloc);
 }
 
-int tcp_sendpage_locked(struct sock *sk, struct page *page, int offset,
-                       size_t size, int flags)
-{
-       struct bio_vec bvec;
-       struct msghdr msg = { .msg_flags = flags | MSG_SPLICE_PAGES, };
-
-       if (!(sk->sk_route_caps & NETIF_F_SG))
-               return sock_no_sendpage_locked(sk, page, offset, size, flags);
-
-       tcp_rate_check_app_limited(sk);  /* is sending application-limited? */
-
-       bvec_set_page(&bvec, page, size, offset);
-       iov_iter_bvec(&msg.msg_iter, ITER_SOURCE, &bvec, 1, size);
-
-       if (flags & MSG_SENDPAGE_NOTLAST)
-               msg.msg_flags |= MSG_MORE;
-
-       return tcp_sendmsg_locked(sk, &msg, size);
-}
-EXPORT_SYMBOL_GPL(tcp_sendpage_locked);
-
-int tcp_sendpage(struct sock *sk, struct page *page, int offset,
-                size_t size, int flags)
-{
-       int ret;
-
-       lock_sock(sk);
-       ret = tcp_sendpage_locked(sk, page, offset, size, flags);
-       release_sock(sk);
-
-       return ret;
-}
-EXPORT_SYMBOL(tcp_sendpage);
-
 void tcp_free_fastopen_req(struct tcp_sock *tp)
 {
        if (tp->fastopen_req) {
index 31d6005cea9bd9fee706da94a79a4dde8c6e467e..81f0dff69e0b69bcc03bd932dcc42a8578939ecb 100644 (file)
@@ -486,7 +486,7 @@ static int tcp_bpf_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)
        long timeo;
        int flags;
 
-       /* Don't let internal sendpage flags through */
+       /* Don't let internal flags through */
        flags = (msg->msg_flags & ~MSG_SENDPAGE_DECRYPTED);
        flags |= MSG_NO_SHARED_FRAGS;
 
@@ -566,23 +566,6 @@ out_err:
        return copied ? copied : err;
 }
 
-static int tcp_bpf_sendpage(struct sock *sk, struct page *page, int offset,
-                           size_t size, int flags)
-{
-       struct bio_vec bvec;
-       struct msghdr msg = {
-               .msg_flags = flags | MSG_SPLICE_PAGES,
-       };
-
-       bvec_set_page(&bvec, page, size, offset);
-       iov_iter_bvec(&msg.msg_iter, ITER_SOURCE, &bvec, 1, size);
-
-       if (flags & MSG_SENDPAGE_NOTLAST)
-               msg.msg_flags |= MSG_MORE;
-
-       return tcp_bpf_sendmsg(sk, &msg, size);
-}
-
 enum {
        TCP_BPF_IPV4,
        TCP_BPF_IPV6,
@@ -612,7 +595,6 @@ static void tcp_bpf_rebuild_protos(struct proto prot[TCP_BPF_NUM_CFGS],
 
        prot[TCP_BPF_TX]                        = prot[TCP_BPF_BASE];
        prot[TCP_BPF_TX].sendmsg                = tcp_bpf_sendmsg;
-       prot[TCP_BPF_TX].sendpage               = tcp_bpf_sendpage;
 
        prot[TCP_BPF_RX]                        = prot[TCP_BPF_BASE];
        prot[TCP_BPF_RX].recvmsg                = tcp_bpf_recvmsg_parser;
@@ -647,8 +629,7 @@ static int tcp_bpf_assert_proto_ops(struct proto *ops)
         * indeed valid assumptions.
         */
        return ops->recvmsg  == tcp_recvmsg &&
-              ops->sendmsg  == tcp_sendmsg &&
-              ops->sendpage == tcp_sendpage ? 0 : -ENOTSUPP;
+              ops->sendmsg  == tcp_sendmsg ? 0 : -ENOTSUPP;
 }
 
 int tcp_bpf_update_proto(struct sock *sk, struct sk_psock *psock, bool restore)
index 9213804b034febc3cbf4fecf0699c86210b15a57..fd365de4d5ffca5e6cb22d056acb27a1a40a497f 100644 (file)
@@ -3117,7 +3117,6 @@ struct proto tcp_prot = {
        .recvmsg                = tcp_recvmsg,
        .sendmsg                = tcp_sendmsg,
        .splice_eof             = tcp_splice_eof,
-       .sendpage               = tcp_sendpage,
        .backlog_rcv            = tcp_v4_do_rcv,
        .release_cb             = tcp_release_cb,
        .hash                   = inet_hash,
index 48fdcd3cad9c2b5a825202f27ebd28557e2b74e8..42a96b3547c9fadc7d508aff9c57b553cf5fad4d 100644 (file)
@@ -1340,20 +1340,6 @@ void udp_splice_eof(struct socket *sock)
 }
 EXPORT_SYMBOL_GPL(udp_splice_eof);
 
-int udp_sendpage(struct sock *sk, struct page *page, int offset,
-                size_t size, int flags)
-{
-       struct bio_vec bvec;
-       struct msghdr msg = { .msg_flags = flags | MSG_SPLICE_PAGES };
-
-       if (flags & MSG_SENDPAGE_NOTLAST)
-               msg.msg_flags |= MSG_MORE;
-
-       bvec_set_page(&bvec, page, size, offset);
-       iov_iter_bvec(&msg.msg_iter, ITER_SOURCE, &bvec, 1, size);
-       return udp_sendmsg(sk, &msg, size);
-}
-
 #define UDP_SKB_IS_STATELESS 0x80000000
 
 /* all head states (dst, sk, nf conntrack) except skb extensions are
@@ -2933,7 +2919,6 @@ struct proto udp_prot = {
        .sendmsg                = udp_sendmsg,
        .recvmsg                = udp_recvmsg,
        .splice_eof             = udp_splice_eof,
-       .sendpage               = udp_sendpage,
        .release_cb             = ip4_datagram_release_cb,
        .hash                   = udp_lib_hash,
        .unhash                 = udp_lib_unhash,
index 4ba7a88a1b1d37d87af3331d89c3cddb7b4c05dc..e1ff3a37599614b18a0b621534019a7bd71ea901 100644 (file)
@@ -19,8 +19,6 @@ int udp_getsockopt(struct sock *sk, int level, int optname,
 
 int udp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int flags,
                int *addr_len);
-int udp_sendpage(struct sock *sk, struct page *page, int offset, size_t size,
-                int flags);
 void udp_destroy_sock(struct sock *sk);
 
 #ifdef CONFIG_PROC_FS
index 143f93a12f250063aaebb2c78a8fc71419eec192..39ecdad1b50ce5608fa84b9d838c91c8704b3427 100644 (file)
@@ -56,7 +56,6 @@ struct proto  udplite_prot = {
        .getsockopt        = udp_getsockopt,
        .sendmsg           = udp_sendmsg,
        .recvmsg           = udp_recvmsg,
-       .sendpage          = udp_sendpage,
        .hash              = udp_lib_hash,
        .unhash            = udp_lib_unhash,
        .rehash            = udp_v4_rehash,
index b3451cf47d29664634d818a56e01a584a4ac4a5a..5d593ddc0347ebd13788b1319990f167de833d9a 100644 (file)
@@ -696,9 +696,7 @@ const struct proto_ops inet6_stream_ops = {
        .mmap              = tcp_mmap,
 #endif
        .splice_eof        = inet_splice_eof,
-       .sendpage          = inet_sendpage,
        .sendmsg_locked    = tcp_sendmsg_locked,
-       .sendpage_locked   = tcp_sendpage_locked,
        .splice_read       = tcp_splice_read,
        .read_sock         = tcp_read_sock,
        .read_skb          = tcp_read_skb,
@@ -729,7 +727,6 @@ const struct proto_ops inet6_dgram_ops = {
        .recvmsg           = inet6_recvmsg,             /* retpoline's sake */
        .read_skb          = udp_read_skb,
        .mmap              = sock_no_mmap,
-       .sendpage          = sock_no_sendpage,
        .set_peek_off      = sk_set_peek_off,
 #ifdef CONFIG_COMPAT
        .compat_ioctl      = inet6_compat_ioctl,
index c9caeb5a43ed2894429624451ee7205620723b82..ac1cef094c5f200d34a45eeb06f2f7356c87ad6d 100644 (file)
@@ -1296,7 +1296,6 @@ const struct proto_ops inet6_sockraw_ops = {
        .sendmsg           = inet_sendmsg,              /* ok           */
        .recvmsg           = sock_common_recvmsg,       /* ok           */
        .mmap              = sock_no_mmap,
-       .sendpage          = sock_no_sendpage,
 #ifdef CONFIG_COMPAT
        .compat_ioctl      = inet6_compat_ioctl,
 #endif
index c17c8ff94b7971ad745ad8dd727cd2bba59fb2a1..40dd92a2f4807960c7939a19adccdd1b493c30b1 100644 (file)
@@ -2151,7 +2151,6 @@ struct proto tcpv6_prot = {
        .recvmsg                = tcp_recvmsg,
        .sendmsg                = tcp_sendmsg,
        .splice_eof             = tcp_splice_eof,
-       .sendpage               = tcp_sendpage,
        .backlog_rcv            = tcp_v6_do_rcv,
        .release_cb             = tcp_release_cb,
        .hash                   = inet6_hash,
index d0537c1c8cd79218572b560bd1a137a1d94cab10..393f01b2a7e6d4dbd47645d58e5d146548dacc16 100644 (file)
@@ -963,24 +963,6 @@ static void kcm_splice_eof(struct socket *sock)
        release_sock(sk);
 }
 
-static ssize_t kcm_sendpage(struct socket *sock, struct page *page,
-                           int offset, size_t size, int flags)
-
-{
-       struct bio_vec bvec;
-       struct msghdr msg = { .msg_flags = flags | MSG_SPLICE_PAGES, };
-
-       if (flags & MSG_SENDPAGE_NOTLAST)
-               msg.msg_flags |= MSG_MORE;
-
-       if (flags & MSG_OOB)
-               return -EOPNOTSUPP;
-
-       bvec_set_page(&bvec, page, size, offset);
-       iov_iter_bvec(&msg.msg_iter, ITER_SOURCE, &bvec, 1, size);
-       return kcm_sendmsg(sock, &msg, size);
-}
-
 static int kcm_recvmsg(struct socket *sock, struct msghdr *msg,
                       size_t len, int flags)
 {
@@ -1769,7 +1751,6 @@ static const struct proto_ops kcm_dgram_ops = {
        .recvmsg =      kcm_recvmsg,
        .mmap =         sock_no_mmap,
        .splice_eof =   kcm_splice_eof,
-       .sendpage =     kcm_sendpage,
 };
 
 static const struct proto_ops kcm_seqpacket_ops = {
@@ -1791,7 +1772,6 @@ static const struct proto_ops kcm_seqpacket_ops = {
        .recvmsg =      kcm_recvmsg,
        .mmap =         sock_no_mmap,
        .splice_eof =   kcm_splice_eof,
-       .sendpage =     kcm_sendpage,
        .splice_read =  kcm_splice_read,
 };
 
index 31ab12fd720aefdab9e3eced63d2a37d169516f9..ede3c6a603532551ee70cb870199737b0942ca25 100644 (file)
@@ -3761,7 +3761,6 @@ static const struct proto_ops pfkey_ops = {
        .listen         =       sock_no_listen,
        .shutdown       =       sock_no_shutdown,
        .mmap           =       sock_no_mmap,
-       .sendpage       =       sock_no_sendpage,
 
        /* Now the operations that really occur. */
        .release        =       pfkey_release,
index 2b795c1064f5c15f4a1fbdb3c6c50073bfc92448..f9073bc7281f96267f6b40b830a19fa0e8df140f 100644 (file)
@@ -624,7 +624,6 @@ static const struct proto_ops l2tp_ip_ops = {
        .sendmsg           = inet_sendmsg,
        .recvmsg           = sock_common_recvmsg,
        .mmap              = sock_no_mmap,
-       .sendpage          = sock_no_sendpage,
 };
 
 static struct inet_protosw l2tp_ip_protosw = {
index 5137ea1861ce26a2e6efc1f5c29e4de0fdce2c06..b1623f9c4f921791ab541ecf93695ea19addaa5a 100644 (file)
@@ -751,7 +751,6 @@ static const struct proto_ops l2tp_ip6_ops = {
        .sendmsg           = inet_sendmsg,
        .recvmsg           = sock_common_recvmsg,
        .mmap              = sock_no_mmap,
-       .sendpage          = sock_no_sendpage,
 #ifdef CONFIG_COMPAT
        .compat_ioctl      = inet6_compat_ioctl,
 #endif
index 9ffbc667be6cf4c13d2f731e003510efeed8ee29..57c35c960b2c795ebefcf8e3e3e6458177edf298 100644 (file)
@@ -1232,7 +1232,6 @@ static const struct proto_ops llc_ui_ops = {
        .sendmsg     = llc_ui_sendmsg,
        .recvmsg     = llc_ui_recvmsg,
        .mmap        = sock_no_mmap,
-       .sendpage    = sock_no_sendpage,
 };
 
 static const char llc_proc_err_msg[] __initconst =
index bb4bd0b6a4f79c2dc1aefd02572648ac29c554a7..f6be58b68c6f368ec641580755bd1a4bad6b5e2d 100644 (file)
@@ -485,7 +485,6 @@ static const struct proto_ops mctp_dgram_ops = {
        .sendmsg        = mctp_sendmsg,
        .recvmsg        = mctp_recvmsg,
        .mmap           = sock_no_mmap,
-       .sendpage       = sock_no_sendpage,
 #ifdef CONFIG_COMPAT
        .compat_ioctl   = mctp_compat_ioctl,
 #endif
index bd023debedc8e46cd04b2190773eab368397caeb..e892673deb73b48abdcaff1f24a3b962ee5d5d9d 100644 (file)
@@ -3866,7 +3866,6 @@ static const struct proto_ops mptcp_stream_ops = {
        .sendmsg           = inet_sendmsg,
        .recvmsg           = inet_recvmsg,
        .mmap              = sock_no_mmap,
-       .sendpage          = inet_sendpage,
 };
 
 static struct inet_protosw mptcp_protosw = {
@@ -3961,7 +3960,6 @@ static const struct proto_ops mptcp_v6_stream_ops = {
        .sendmsg           = inet6_sendmsg,
        .recvmsg           = inet6_recvmsg,
        .mmap              = sock_no_mmap,
-       .sendpage          = inet_sendpage,
 #ifdef CONFIG_COMPAT
        .compat_ioctl      = inet6_compat_ioctl,
 #endif
index cbd9aa7ee24aed57037a984fd7bb5f966cb4bad6..39cfb778ebc5b76af0cd716d4366af4fffaceafa 100644 (file)
@@ -2815,7 +2815,6 @@ static const struct proto_ops netlink_ops = {
        .sendmsg =      netlink_sendmsg,
        .recvmsg =      netlink_recvmsg,
        .mmap =         sock_no_mmap,
-       .sendpage =     sock_no_sendpage,
 };
 
 static const struct net_proto_family netlink_family_ops = {
index 5a4cb796150f5abfcfd2f500e954d3e197149d6b..eb8ccbd58df7424828ca666095f6d8cd9fc6373c 100644 (file)
@@ -1364,7 +1364,6 @@ static const struct proto_ops nr_proto_ops = {
        .sendmsg        =       nr_sendmsg,
        .recvmsg        =       nr_recvmsg,
        .mmap           =       sock_no_mmap,
-       .sendpage       =       sock_no_sendpage,
 };
 
 static struct notifier_block nr_dev_notifier = {
index a2dbeb264f260e5b8923ece9aac99fe19ddfeb62..85ff90a03b0c343a2c8ee23ec8b1d47dbe7046f8 100644 (file)
@@ -4621,7 +4621,6 @@ static const struct proto_ops packet_ops_spkt = {
        .sendmsg =      packet_sendmsg_spkt,
        .recvmsg =      packet_recvmsg,
        .mmap =         sock_no_mmap,
-       .sendpage =     sock_no_sendpage,
 };
 
 static const struct proto_ops packet_ops = {
@@ -4643,7 +4642,6 @@ static const struct proto_ops packet_ops = {
        .sendmsg =      packet_sendmsg,
        .recvmsg =      packet_recvmsg,
        .mmap =         packet_mmap,
-       .sendpage =     sock_no_sendpage,
 };
 
 static const struct net_proto_family packet_family_ops = {
index 967f9b4dc02657351701d89e61b8c1ca01c21dee..1018340d89a7d4619a86ac9667ffaf58f2de83fd 100644 (file)
@@ -441,7 +441,6 @@ const struct proto_ops phonet_dgram_ops = {
        .sendmsg        = pn_socket_sendmsg,
        .recvmsg        = sock_common_recvmsg,
        .mmap           = sock_no_mmap,
-       .sendpage       = sock_no_sendpage,
 };
 
 const struct proto_ops phonet_stream_ops = {
@@ -462,7 +461,6 @@ const struct proto_ops phonet_stream_ops = {
        .sendmsg        = pn_socket_sendmsg,
        .recvmsg        = sock_common_recvmsg,
        .mmap           = sock_no_mmap,
-       .sendpage       = sock_no_sendpage,
 };
 EXPORT_SYMBOL(phonet_stream_ops);
 
index 76f0434d3d06a48b80d80c54241440ff4ce8ea9c..78beb74146e74012cee9a16b7da43f56666e64d7 100644 (file)
@@ -1244,7 +1244,6 @@ static const struct proto_ops qrtr_proto_ops = {
        .shutdown       = sock_no_shutdown,
        .release        = qrtr_release,
        .mmap           = sock_no_mmap,
-       .sendpage       = sock_no_sendpage,
 };
 
 static struct proto qrtr_proto = {
index 3ff6995244e5eb20ee1e1b2457ccb188a2c36592..01c4cdfef45df32ad0b0b942e416d6bc267687e1 100644 (file)
@@ -653,7 +653,6 @@ static const struct proto_ops rds_proto_ops = {
        .sendmsg =      rds_sendmsg,
        .recvmsg =      rds_recvmsg,
        .mmap =         sock_no_mmap,
-       .sendpage =     sock_no_sendpage,
 };
 
 static void rds_sock_destruct(struct sock *sk)
index ca2b17f32670dc232ebaeced139782d0ccb4e899..49dafe9ac72f010c56a5546926ee1a360fa767b7 100644 (file)
@@ -1496,7 +1496,6 @@ static const struct proto_ops rose_proto_ops = {
        .sendmsg        =       rose_sendmsg,
        .recvmsg        =       rose_recvmsg,
        .mmap           =       sock_no_mmap,
-       .sendpage       =       sock_no_sendpage,
 };
 
 static struct notifier_block rose_dev_notifier = {
index da0b3b5157d5f343f7ffac19882e3d3a0ea26ea1..f2cf4aa99db296eabaf5227c617e3bb6fdaf7365 100644 (file)
@@ -954,7 +954,6 @@ static const struct proto_ops rxrpc_rpc_ops = {
        .sendmsg        = rxrpc_sendmsg,
        .recvmsg        = rxrpc_recvmsg,
        .mmap           = sock_no_mmap,
-       .sendpage       = sock_no_sendpage,
 };
 
 static struct proto rxrpc_proto = {
index 664d1f2e9121c9b90f5d8d972f1ea259f534066c..274d07bd774f0e9b9de3886ba902c3c205991050 100644 (file)
@@ -1133,7 +1133,6 @@ static const struct proto_ops inet_seqpacket_ops = {
        .sendmsg           = inet_sendmsg,
        .recvmsg           = inet_recvmsg,
        .mmap              = sock_no_mmap,
-       .sendpage          = sock_no_sendpage,
 };
 
 /* Registration with AF_INET family.  */
index b778fc03c6e0bd614f8d814120a37e32e571d843..8c3c8b29995a84c95c969a02a8e56737414ebc9e 100644 (file)
@@ -3552,54 +3552,6 @@ int kernel_getpeername(struct socket *sock, struct sockaddr *addr)
 }
 EXPORT_SYMBOL(kernel_getpeername);
 
-/**
- *     kernel_sendpage - send a &page through a socket (kernel space)
- *     @sock: socket
- *     @page: page
- *     @offset: page offset
- *     @size: total size in bytes
- *     @flags: flags (MSG_DONTWAIT, ...)
- *
- *     Returns the total amount sent in bytes or an error.
- */
-
-int kernel_sendpage(struct socket *sock, struct page *page, int offset,
-                   size_t size, int flags)
-{
-       if (sock->ops->sendpage) {
-               /* Warn in case the improper page to zero-copy send */
-               WARN_ONCE(!sendpage_ok(page), "improper page for zero-copy send");
-               return sock->ops->sendpage(sock, page, offset, size, flags);
-       }
-       return sock_no_sendpage(sock, page, offset, size, flags);
-}
-EXPORT_SYMBOL(kernel_sendpage);
-
-/**
- *     kernel_sendpage_locked - send a &page through the locked sock (kernel space)
- *     @sk: sock
- *     @page: page
- *     @offset: page offset
- *     @size: total size in bytes
- *     @flags: flags (MSG_DONTWAIT, ...)
- *
- *     Returns the total amount sent in bytes or an error.
- *     Caller must hold @sk.
- */
-
-int kernel_sendpage_locked(struct sock *sk, struct page *page, int offset,
-                          size_t size, int flags)
-{
-       struct socket *sock = sk->sk_socket;
-
-       if (sock->ops->sendpage_locked)
-               return sock->ops->sendpage_locked(sk, page, offset, size,
-                                                 flags);
-
-       return sock_no_sendpage_locked(sk, page, offset, size, flags);
-}
-EXPORT_SYMBOL(kernel_sendpage_locked);
-
 /**
  *     kernel_sock_shutdown - shut down part of a full-duplex connection (kernel space)
  *     @sock: socket
index dd73d71c02a99df7acd7ce3fb0d4a96d1778171d..ef8e5139a87377732a7c5021a00b15f7504370b3 100644 (file)
@@ -3375,7 +3375,6 @@ static const struct proto_ops msg_ops = {
        .sendmsg        = tipc_sendmsg,
        .recvmsg        = tipc_recvmsg,
        .mmap           = sock_no_mmap,
-       .sendpage       = sock_no_sendpage
 };
 
 static const struct proto_ops packet_ops = {
@@ -3396,7 +3395,6 @@ static const struct proto_ops packet_ops = {
        .sendmsg        = tipc_send_packet,
        .recvmsg        = tipc_recvmsg,
        .mmap           = sock_no_mmap,
-       .sendpage       = sock_no_sendpage
 };
 
 static const struct proto_ops stream_ops = {
@@ -3417,7 +3415,6 @@ static const struct proto_ops stream_ops = {
        .sendmsg        = tipc_sendstream,
        .recvmsg        = tipc_recvstream,
        .mmap           = sock_no_mmap,
-       .sendpage       = sock_no_sendpage
 };
 
 static const struct net_proto_family tipc_family_ops = {
index d002c3af1966dccd1e776d2fe77745163b3856bb..86cef1c68e03bf0d4bd91bc563f5a9b208f32b29 100644 (file)
@@ -98,10 +98,6 @@ void tls_sw_strparser_arm(struct sock *sk, struct tls_context *ctx);
 void tls_sw_strparser_done(struct tls_context *tls_ctx);
 int tls_sw_sendmsg(struct sock *sk, struct msghdr *msg, size_t size);
 void tls_sw_splice_eof(struct socket *sock);
-int tls_sw_sendpage_locked(struct sock *sk, struct page *page,
-                          int offset, size_t size, int flags);
-int tls_sw_sendpage(struct sock *sk, struct page *page,
-                   int offset, size_t size, int flags);
 void tls_sw_cancel_work_tx(struct tls_context *tls_ctx);
 void tls_sw_release_resources_tx(struct sock *sk);
 void tls_sw_free_ctx_tx(struct tls_context *tls_ctx);
@@ -117,8 +113,6 @@ ssize_t tls_sw_splice_read(struct socket *sock, loff_t *ppos,
 
 int tls_device_sendmsg(struct sock *sk, struct msghdr *msg, size_t size);
 void tls_device_splice_eof(struct socket *sock);
-int tls_device_sendpage(struct sock *sk, struct page *page,
-                       int offset, size_t size, int flags);
 int tls_tx_records(struct sock *sk, int flags);
 
 void tls_sw_write_space(struct sock *sk, struct tls_context *ctx);
index 975299d7213b3b003a48e1cd575d676fa5085d4b..840ee06f17089bc40160e3a2f8405b20946af6d9 100644 (file)
@@ -621,23 +621,6 @@ void tls_device_splice_eof(struct socket *sock)
        mutex_unlock(&tls_ctx->tx_lock);
 }
 
-int tls_device_sendpage(struct sock *sk, struct page *page,
-                       int offset, size_t size, int flags)
-{
-       struct bio_vec bvec;
-       struct msghdr msg = { .msg_flags = flags | MSG_SPLICE_PAGES, };
-
-       if (flags & MSG_SENDPAGE_NOTLAST)
-               msg.msg_flags |= MSG_MORE;
-
-       if (flags & MSG_OOB)
-               return -EOPNOTSUPP;
-
-       bvec_set_page(&bvec, page, size, offset);
-       iov_iter_bvec(&msg.msg_iter, ITER_SOURCE, &bvec, 1, size);
-       return tls_device_sendmsg(sk, &msg, size);
-}
-
 struct tls_record_info *tls_get_record(struct tls_offload_context_tx *context,
                                       u32 seq, u64 *p_record_sn)
 {
index 7b9c83dd7de289847e9a42ba72f22b88f41580a5..d5ed4d47b16e5f6f6b2c08f0a6e213fae970c90d 100644 (file)
@@ -958,7 +958,6 @@ static void build_proto_ops(struct proto_ops ops[TLS_NUM_CONFIG][TLS_NUM_CONFIG]
 
        ops[TLS_SW  ][TLS_BASE] = ops[TLS_BASE][TLS_BASE];
        ops[TLS_SW  ][TLS_BASE].splice_eof      = tls_sw_splice_eof;
-       ops[TLS_SW  ][TLS_BASE].sendpage_locked = tls_sw_sendpage_locked;
 
        ops[TLS_BASE][TLS_SW  ] = ops[TLS_BASE][TLS_BASE];
        ops[TLS_BASE][TLS_SW  ].splice_read     = tls_sw_splice_read;
@@ -970,17 +969,14 @@ static void build_proto_ops(struct proto_ops ops[TLS_NUM_CONFIG][TLS_NUM_CONFIG]
 
 #ifdef CONFIG_TLS_DEVICE
        ops[TLS_HW  ][TLS_BASE] = ops[TLS_BASE][TLS_BASE];
-       ops[TLS_HW  ][TLS_BASE].sendpage_locked = NULL;
 
        ops[TLS_HW  ][TLS_SW  ] = ops[TLS_BASE][TLS_SW  ];
-       ops[TLS_HW  ][TLS_SW  ].sendpage_locked = NULL;
 
        ops[TLS_BASE][TLS_HW  ] = ops[TLS_BASE][TLS_SW  ];
 
        ops[TLS_SW  ][TLS_HW  ] = ops[TLS_SW  ][TLS_SW  ];
 
        ops[TLS_HW  ][TLS_HW  ] = ops[TLS_HW  ][TLS_SW  ];
-       ops[TLS_HW  ][TLS_HW  ].sendpage_locked = NULL;
 #endif
 #ifdef CONFIG_TLS_TOE
        ops[TLS_HW_RECORD][TLS_HW_RECORD] = *base;
@@ -1029,7 +1025,6 @@ static void build_protos(struct proto prot[TLS_NUM_CONFIG][TLS_NUM_CONFIG],
        prot[TLS_SW][TLS_BASE] = prot[TLS_BASE][TLS_BASE];
        prot[TLS_SW][TLS_BASE].sendmsg          = tls_sw_sendmsg;
        prot[TLS_SW][TLS_BASE].splice_eof       = tls_sw_splice_eof;
-       prot[TLS_SW][TLS_BASE].sendpage         = tls_sw_sendpage;
 
        prot[TLS_BASE][TLS_SW] = prot[TLS_BASE][TLS_BASE];
        prot[TLS_BASE][TLS_SW].recvmsg            = tls_sw_recvmsg;
@@ -1045,12 +1040,10 @@ static void build_protos(struct proto prot[TLS_NUM_CONFIG][TLS_NUM_CONFIG],
        prot[TLS_HW][TLS_BASE] = prot[TLS_BASE][TLS_BASE];
        prot[TLS_HW][TLS_BASE].sendmsg          = tls_device_sendmsg;
        prot[TLS_HW][TLS_BASE].splice_eof       = tls_device_splice_eof;
-       prot[TLS_HW][TLS_BASE].sendpage         = tls_device_sendpage;
 
        prot[TLS_HW][TLS_SW] = prot[TLS_BASE][TLS_SW];
        prot[TLS_HW][TLS_SW].sendmsg            = tls_device_sendmsg;
        prot[TLS_HW][TLS_SW].splice_eof         = tls_device_splice_eof;
-       prot[TLS_HW][TLS_SW].sendpage           = tls_device_sendpage;
 
        prot[TLS_BASE][TLS_HW] = prot[TLS_BASE][TLS_SW];
 
index 319f61590d2cff835a2b1df17d4d0ecd2b58f968..9b3aa89a42927974e5828e75d3fb39d76b00b662 100644 (file)
@@ -1281,41 +1281,6 @@ unlock:
        mutex_unlock(&tls_ctx->tx_lock);
 }
 
-int tls_sw_sendpage_locked(struct sock *sk, struct page *page,
-                          int offset, size_t size, int flags)
-{
-       struct bio_vec bvec;
-       struct msghdr msg = { .msg_flags = flags | MSG_SPLICE_PAGES, };
-
-       if (flags & ~(MSG_MORE | MSG_DONTWAIT | MSG_NOSIGNAL |
-                     MSG_SENDPAGE_NOTLAST | MSG_SENDPAGE_NOPOLICY |
-                     MSG_NO_SHARED_FRAGS))
-               return -EOPNOTSUPP;
-       if (flags & MSG_SENDPAGE_NOTLAST)
-               msg.msg_flags |= MSG_MORE;
-
-       bvec_set_page(&bvec, page, size, offset);
-       iov_iter_bvec(&msg.msg_iter, ITER_SOURCE, &bvec, 1, size);
-       return tls_sw_sendmsg_locked(sk, &msg, size);
-}
-
-int tls_sw_sendpage(struct sock *sk, struct page *page,
-                   int offset, size_t size, int flags)
-{
-       struct bio_vec bvec;
-       struct msghdr msg = { .msg_flags = flags | MSG_SPLICE_PAGES, };
-
-       if (flags & ~(MSG_MORE | MSG_DONTWAIT | MSG_NOSIGNAL |
-                     MSG_SENDPAGE_NOTLAST | MSG_SENDPAGE_NOPOLICY))
-               return -EOPNOTSUPP;
-       if (flags & MSG_SENDPAGE_NOTLAST)
-               msg.msg_flags |= MSG_MORE;
-
-       bvec_set_page(&bvec, page, size, offset);
-       iov_iter_bvec(&msg.msg_iter, ITER_SOURCE, &bvec, 1, size);
-       return tls_sw_sendmsg(sk, &msg, size);
-}
-
 static int
 tls_rx_rec_wait(struct sock *sk, struct sk_psock *psock, bool nonblock,
                bool released)
index f9d196439b4930ae49fe6cdc3e9cfbf4c753fb2b..f2f234f0b92c0f983346af2e759372a7ddc5b9d4 100644 (file)
@@ -758,8 +758,6 @@ static int unix_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned lon
 static int unix_shutdown(struct socket *, int);
 static int unix_stream_sendmsg(struct socket *, struct msghdr *, size_t);
 static int unix_stream_recvmsg(struct socket *, struct msghdr *, size_t, int);
-static ssize_t unix_stream_sendpage(struct socket *, struct page *, int offset,
-                                   size_t size, int flags);
 static ssize_t unix_stream_splice_read(struct socket *,  loff_t *ppos,
                                       struct pipe_inode_info *, size_t size,
                                       unsigned int flags);
@@ -852,7 +850,6 @@ static const struct proto_ops unix_stream_ops = {
        .recvmsg =      unix_stream_recvmsg,
        .read_skb =     unix_stream_read_skb,
        .mmap =         sock_no_mmap,
-       .sendpage =     unix_stream_sendpage,
        .splice_read =  unix_stream_splice_read,
        .set_peek_off = unix_set_peek_off,
        .show_fdinfo =  unix_show_fdinfo,
@@ -878,7 +875,6 @@ static const struct proto_ops unix_dgram_ops = {
        .read_skb =     unix_read_skb,
        .recvmsg =      unix_dgram_recvmsg,
        .mmap =         sock_no_mmap,
-       .sendpage =     sock_no_sendpage,
        .set_peek_off = unix_set_peek_off,
        .show_fdinfo =  unix_show_fdinfo,
 };
@@ -902,7 +898,6 @@ static const struct proto_ops unix_seqpacket_ops = {
        .sendmsg =      unix_seqpacket_sendmsg,
        .recvmsg =      unix_seqpacket_recvmsg,
        .mmap =         sock_no_mmap,
-       .sendpage =     sock_no_sendpage,
        .set_peek_off = unix_set_peek_off,
        .show_fdinfo =  unix_show_fdinfo,
 };
@@ -2294,20 +2289,6 @@ out_err:
        return sent ? : err;
 }
 
-static ssize_t unix_stream_sendpage(struct socket *socket, struct page *page,
-                                   int offset, size_t size, int flags)
-{
-       struct bio_vec bvec;
-       struct msghdr msg = { .msg_flags = flags | MSG_SPLICE_PAGES };
-
-       if (flags & MSG_SENDPAGE_NOTLAST)
-               msg.msg_flags |= MSG_MORE;
-
-       bvec_set_page(&bvec, page, size, offset);
-       iov_iter_bvec(&msg.msg_iter, ITER_SOURCE, &bvec, 1, size);
-       return unix_stream_sendmsg(socket, &msg, size);
-}
-
 static int unix_seqpacket_sendmsg(struct socket *sock, struct msghdr *msg,
                                  size_t len)
 {
index efb8a0937a13b74b3aaa0c2722d4f0e61f29fd5c..020cf17ab7e47b7022b855e878caa7d501d50a13 100644 (file)
@@ -1306,7 +1306,6 @@ static const struct proto_ops vsock_dgram_ops = {
        .sendmsg = vsock_dgram_sendmsg,
        .recvmsg = vsock_dgram_recvmsg,
        .mmap = sock_no_mmap,
-       .sendpage = sock_no_sendpage,
        .read_skb = vsock_read_skb,
 };
 
@@ -2234,7 +2233,6 @@ static const struct proto_ops vsock_stream_ops = {
        .sendmsg = vsock_connectible_sendmsg,
        .recvmsg = vsock_connectible_recvmsg,
        .mmap = sock_no_mmap,
-       .sendpage = sock_no_sendpage,
        .set_rcvlowat = vsock_set_rcvlowat,
        .read_skb = vsock_read_skb,
 };
@@ -2257,7 +2255,6 @@ static const struct proto_ops vsock_seqpacket_ops = {
        .sendmsg = vsock_connectible_sendmsg,
        .recvmsg = vsock_connectible_recvmsg,
        .mmap = sock_no_mmap,
-       .sendpage = sock_no_sendpage,
        .read_skb = vsock_read_skb,
 };
 
index 5c7ad301d742e8776320c51d13c7d9eff0793992..0fb5143bec7ac45374f6b2e1c6133072c8e8145c 100644 (file)
@@ -1757,7 +1757,6 @@ static const struct proto_ops x25_proto_ops = {
        .sendmsg =      x25_sendmsg,
        .recvmsg =      x25_recvmsg,
        .mmap =         sock_no_mmap,
-       .sendpage =     sock_no_sendpage,
 };
 
 static struct packet_type x25_packet_type __read_mostly = {
index cc1e7f15fa731483b10e5000e25eaf77a15316cb..5a8c0dd250afb04d5f1438dd6a21bddd560aa13d 100644 (file)
@@ -1389,7 +1389,6 @@ static const struct proto_ops xsk_proto_ops = {
        .sendmsg        = xsk_sendmsg,
        .recvmsg        = xsk_recvmsg,
        .mmap           = xsk_mmap,
-       .sendpage       = sock_no_sendpage,
 };
 
 static void xsk_destruct(struct sock *sk)