mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	sock: Remove ->sendpage*() in favour of sendmsg(MSG_SPLICE_PAGES)
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>
This commit is contained in:
		
							parent
							
								
									e52828cc01
								
							
						
					
					
						commit
						dc97391e66
					
				
					 66 changed files with 20 additions and 442 deletions
				
			
		| 
						 | 
					@ -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
 | 
					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.
 | 
					parse data that the (``data``, ``data_end``) pointers have already consumed.
 | 
				
			||||||
For ``sendmsg()`` hooks this is likely the first scatterlist element. But for
 | 
					For ``sendmsg()`` hooks this is likely the first scatterlist element. But for
 | 
				
			||||||
calls relying on the ``sendpage`` handler (e.g., ``sendfile()``) this will be
 | 
					calls relying on MSG_SPLICE_PAGES (e.g., ``sendfile()``) this will be the
 | 
				
			||||||
the range (**0**, **0**) because the data is shared with user space and by
 | 
					range (**0**, **0**) because the data is shared with user space and by default
 | 
				
			||||||
default the objective is to avoid allowing user space to modify data while (or
 | 
					the objective is to avoid allowing user space to modify data while (or after)
 | 
				
			||||||
after) BPF verdict is being decided. This helper can be used to pull in data
 | 
					BPF verdict is being decided. This helper can be used to pull in data and to
 | 
				
			||||||
and to set the start and end pointers to given values. Data will be copied if
 | 
					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
 | 
					necessary (i.e., if data was not linear and if start and end pointers do not
 | 
				
			||||||
point to the same chunk).
 | 
					point to the same chunk).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -521,8 +521,6 @@ prototypes::
 | 
				
			||||||
	int (*fsync) (struct file *, loff_t start, loff_t end, int datasync);
 | 
						int (*fsync) (struct file *, loff_t start, loff_t end, int datasync);
 | 
				
			||||||
	int (*fasync) (int, struct file *, int);
 | 
						int (*fasync) (int, struct file *, int);
 | 
				
			||||||
	int (*lock) (struct file *, int, struct file_lock *);
 | 
						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 (*get_unmapped_area)(struct file *, unsigned long,
 | 
				
			||||||
			unsigned long, unsigned long, unsigned long);
 | 
								unsigned long, unsigned long, unsigned long);
 | 
				
			||||||
	int (*check_flags)(int);
 | 
						int (*check_flags)(int);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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 (*fsync) (struct file *, loff_t, loff_t, int datasync);
 | 
				
			||||||
		int (*fasync) (int, struct file *, int);
 | 
							int (*fasync) (int, struct file *, int);
 | 
				
			||||||
		int (*lock) (struct file *, int, struct file_lock *);
 | 
							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);
 | 
							unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
 | 
				
			||||||
		int (*check_flags)(int);
 | 
							int (*check_flags)(int);
 | 
				
			||||||
		int (*flock) (struct file *, int, struct file_lock *);
 | 
							int (*flock) (struct file *, int, struct file_lock *);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
					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.
 | 
					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
 | 
					Each table value is a CPU index that is updated during calls to recvmsg
 | 
				
			||||||
and sendmsg (specifically, inet_recvmsg(), inet_sendmsg(), inet_sendpage()
 | 
					and sendmsg (specifically, inet_recvmsg(), inet_sendmsg() and
 | 
				
			||||||
and tcp_splice_read()).
 | 
					tcp_splice_read()).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
When the scheduler moves a thread to a new CPU while it has outstanding
 | 
					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
 | 
					receive packets on the old CPU, packets may arrive out of order. To
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -482,7 +482,6 @@ static const struct proto_ops alg_proto_ops = {
 | 
				
			||||||
	.listen		=	sock_no_listen,
 | 
						.listen		=	sock_no_listen,
 | 
				
			||||||
	.shutdown	=	sock_no_shutdown,
 | 
						.shutdown	=	sock_no_shutdown,
 | 
				
			||||||
	.mmap		=	sock_no_mmap,
 | 
						.mmap		=	sock_no_mmap,
 | 
				
			||||||
	.sendpage	=	sock_no_sendpage,
 | 
					 | 
				
			||||||
	.sendmsg	=	sock_no_sendmsg,
 | 
						.sendmsg	=	sock_no_sendmsg,
 | 
				
			||||||
	.recvmsg	=	sock_no_recvmsg,
 | 
						.recvmsg	=	sock_no_recvmsg,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1106,33 +1105,6 @@ int af_alg_sendmsg(struct socket *sock, struct msghdr *msg, size_t size,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
EXPORT_SYMBOL_GPL(af_alg_sendmsg);
 | 
					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
 | 
					 * af_alg_free_resources - release resources required for crypto request
 | 
				
			||||||
 * @areq: Request holding the TX and RX SGL
 | 
					 * @areq: Request holding the TX and RX SGL
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -9,10 +9,10 @@
 | 
				
			||||||
 * The following concept of the memory management is used:
 | 
					 * 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
 | 
					 * 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
 | 
					 * filled by user space with the data submitted via sendmsg (maybe with
 | 
				
			||||||
 * the TX SGL does not cause a crypto operation -- the data will only be
 | 
					 * MSG_SPLICE_PAGES).  Filling up the TX SGL does not cause a crypto operation
 | 
				
			||||||
 * tracked by the kernel. Upon receipt of one recvmsg call, the caller must
 | 
					 * -- the data will only be tracked by the kernel. Upon receipt of one recvmsg
 | 
				
			||||||
 * provide a buffer which is tracked with the RX SGL.
 | 
					 * 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
 | 
					 * During the processing of the recvmsg operation, the cipher request is
 | 
				
			||||||
 * allocated and prepared. As part of the recvmsg operation, the processed
 | 
					 * 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,
 | 
						.release	=	af_alg_release,
 | 
				
			||||||
	.sendmsg	=	aead_sendmsg,
 | 
						.sendmsg	=	aead_sendmsg,
 | 
				
			||||||
	.sendpage	=	af_alg_sendpage,
 | 
					 | 
				
			||||||
	.recvmsg	=	aead_recvmsg,
 | 
						.recvmsg	=	aead_recvmsg,
 | 
				
			||||||
	.poll		=	af_alg_poll,
 | 
						.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);
 | 
						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,
 | 
					static int aead_recvmsg_nokey(struct socket *sock, struct msghdr *msg,
 | 
				
			||||||
				  size_t ignored, int flags)
 | 
									  size_t ignored, int flags)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -461,7 +448,6 @@ static struct proto_ops algif_aead_ops_nokey = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	.release	=	af_alg_release,
 | 
						.release	=	af_alg_release,
 | 
				
			||||||
	.sendmsg	=	aead_sendmsg_nokey,
 | 
						.sendmsg	=	aead_sendmsg_nokey,
 | 
				
			||||||
	.sendpage	=	aead_sendpage_nokey,
 | 
					 | 
				
			||||||
	.recvmsg	=	aead_recvmsg_nokey,
 | 
						.recvmsg	=	aead_recvmsg_nokey,
 | 
				
			||||||
	.poll		=	af_alg_poll,
 | 
						.poll		=	af_alg_poll,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -174,7 +174,6 @@ static struct proto_ops algif_rng_ops = {
 | 
				
			||||||
	.bind		=	sock_no_bind,
 | 
						.bind		=	sock_no_bind,
 | 
				
			||||||
	.accept		=	sock_no_accept,
 | 
						.accept		=	sock_no_accept,
 | 
				
			||||||
	.sendmsg	=	sock_no_sendmsg,
 | 
						.sendmsg	=	sock_no_sendmsg,
 | 
				
			||||||
	.sendpage	=	sock_no_sendpage,
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	.release	=	af_alg_release,
 | 
						.release	=	af_alg_release,
 | 
				
			||||||
	.recvmsg	=	rng_recvmsg,
 | 
						.recvmsg	=	rng_recvmsg,
 | 
				
			||||||
| 
						 | 
					@ -192,7 +191,6 @@ static struct proto_ops __maybe_unused algif_rng_test_ops = {
 | 
				
			||||||
	.mmap		=	sock_no_mmap,
 | 
						.mmap		=	sock_no_mmap,
 | 
				
			||||||
	.bind		=	sock_no_bind,
 | 
						.bind		=	sock_no_bind,
 | 
				
			||||||
	.accept		=	sock_no_accept,
 | 
						.accept		=	sock_no_accept,
 | 
				
			||||||
	.sendpage	=	sock_no_sendpage,
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	.release	=	af_alg_release,
 | 
						.release	=	af_alg_release,
 | 
				
			||||||
	.recvmsg	=	rng_test_recvmsg,
 | 
						.recvmsg	=	rng_test_recvmsg,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -194,7 +194,6 @@ static struct proto_ops algif_skcipher_ops = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	.release	=	af_alg_release,
 | 
						.release	=	af_alg_release,
 | 
				
			||||||
	.sendmsg	=	skcipher_sendmsg,
 | 
						.sendmsg	=	skcipher_sendmsg,
 | 
				
			||||||
	.sendpage	=	af_alg_sendpage,
 | 
					 | 
				
			||||||
	.recvmsg	=	skcipher_recvmsg,
 | 
						.recvmsg	=	skcipher_recvmsg,
 | 
				
			||||||
	.poll		=	af_alg_poll,
 | 
						.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);
 | 
						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,
 | 
					static int skcipher_recvmsg_nokey(struct socket *sock, struct msghdr *msg,
 | 
				
			||||||
				  size_t ignored, int flags)
 | 
									  size_t ignored, int flags)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -285,7 +272,6 @@ static struct proto_ops algif_skcipher_ops_nokey = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	.release	=	af_alg_release,
 | 
						.release	=	af_alg_release,
 | 
				
			||||||
	.sendmsg	=	skcipher_sendmsg_nokey,
 | 
						.sendmsg	=	skcipher_sendmsg_nokey,
 | 
				
			||||||
	.sendpage	=	skcipher_sendpage_nokey,
 | 
					 | 
				
			||||||
	.recvmsg	=	skcipher_recvmsg_nokey,
 | 
						.recvmsg	=	skcipher_recvmsg_nokey,
 | 
				
			||||||
	.poll		=	af_alg_poll,
 | 
						.poll		=	af_alg_poll,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
					int chtls_recvmsg(struct sock *sk, struct msghdr *msg,
 | 
				
			||||||
		  size_t len, int flags, int *addr_len);
 | 
							  size_t len, int flags, int *addr_len);
 | 
				
			||||||
void chtls_splice_eof(struct socket *sock);
 | 
					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,
 | 
					int send_tx_flowc_wr(struct sock *sk, int compl,
 | 
				
			||||||
		     u32 snd_nxt, u32 rcv_nxt);
 | 
							     u32 snd_nxt, u32 rcv_nxt);
 | 
				
			||||||
void chtls_tcp_push(struct sock *sk, int flags);
 | 
					void chtls_tcp_push(struct sock *sk, int flags);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1246,20 +1246,6 @@ void chtls_splice_eof(struct socket *sock)
 | 
				
			||||||
	release_sock(sk);
 | 
						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)
 | 
					static void chtls_select_window(struct sock *sk)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct chtls_sock *csk = rcu_dereference_sk_user_data(sk);
 | 
						struct chtls_sock *csk = rcu_dereference_sk_user_data(sk);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -607,7 +607,6 @@ static void __init chtls_init_ulp_ops(void)
 | 
				
			||||||
	chtls_cpl_prot.shutdown		= chtls_shutdown;
 | 
						chtls_cpl_prot.shutdown		= chtls_shutdown;
 | 
				
			||||||
	chtls_cpl_prot.sendmsg		= chtls_sendmsg;
 | 
						chtls_cpl_prot.sendmsg		= chtls_sendmsg;
 | 
				
			||||||
	chtls_cpl_prot.splice_eof	= chtls_splice_eof;
 | 
						chtls_cpl_prot.splice_eof	= chtls_splice_eof;
 | 
				
			||||||
	chtls_cpl_prot.sendpage		= chtls_sendpage;
 | 
					 | 
				
			||||||
	chtls_cpl_prot.recvmsg		= chtls_recvmsg;
 | 
						chtls_cpl_prot.recvmsg		= chtls_recvmsg;
 | 
				
			||||||
	chtls_cpl_prot.setsockopt	= chtls_setsockopt;
 | 
						chtls_cpl_prot.setsockopt	= chtls_setsockopt;
 | 
				
			||||||
	chtls_cpl_prot.getsockopt	= chtls_getsockopt;
 | 
						chtls_cpl_prot.getsockopt	= chtls_getsockopt;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
					 * 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.
 | 
					 * directly. They will be released after the sending has completed.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * Return values: Number of bytes consumed, or -EIO if there are no
 | 
					 * Return values: Number of bytes consumed, or -EIO if there are no
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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_wait_for_data(struct sock *sk, unsigned flags, unsigned min);
 | 
				
			||||||
int af_alg_sendmsg(struct socket *sock, struct msghdr *msg, size_t size,
 | 
					int af_alg_sendmsg(struct socket *sock, struct msghdr *msg, size_t size,
 | 
				
			||||||
		   unsigned int ivsize);
 | 
							   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_free_resources(struct af_alg_async_req *areq);
 | 
				
			||||||
void af_alg_async_cb(void *data, int err);
 | 
					void af_alg_async_cb(void *data, int err);
 | 
				
			||||||
__poll_t af_alg_poll(struct file *file, struct socket *sock,
 | 
					__poll_t af_alg_poll(struct file *file, struct socket *sock,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -207,8 +207,6 @@ struct proto_ops {
 | 
				
			||||||
				      size_t total_len, int flags);
 | 
									      size_t total_len, int flags);
 | 
				
			||||||
	int		(*mmap)	     (struct file *file, struct socket *sock,
 | 
						int		(*mmap)	     (struct file *file, struct socket *sock,
 | 
				
			||||||
				      struct vm_area_struct * vma);
 | 
									      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,
 | 
						ssize_t 	(*splice_read)(struct socket *sock,  loff_t *ppos,
 | 
				
			||||||
				       struct pipe_inode_info *pipe, size_t len, unsigned int flags);
 | 
									       struct pipe_inode_info *pipe, size_t len, unsigned int flags);
 | 
				
			||||||
	void		(*splice_eof)(struct socket *sock);
 | 
						void		(*splice_eof)(struct socket *sock);
 | 
				
			||||||
| 
						 | 
					@ -222,8 +220,6 @@ struct proto_ops {
 | 
				
			||||||
				     sk_read_actor_t recv_actor);
 | 
									     sk_read_actor_t recv_actor);
 | 
				
			||||||
	/* This is different from read_sock(), it reads an entire skb at a time. */
 | 
						/* 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		(*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,
 | 
						int		(*sendmsg_locked)(struct sock *sk, struct msghdr *msg,
 | 
				
			||||||
					  size_t size);
 | 
										  size_t size);
 | 
				
			||||||
	int		(*set_rcvlowat)(struct sock *sk, int val);
 | 
						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 flags);
 | 
				
			||||||
int kernel_getsockname(struct socket *sock, struct sockaddr *addr);
 | 
					int kernel_getsockname(struct socket *sock, struct sockaddr *addr);
 | 
				
			||||||
int kernel_getpeername(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);
 | 
					int kernel_sock_shutdown(struct socket *sock, enum sock_shutdown_cmd how);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Routine returns the IP overhead imposed by a (caller-protected) socket. */
 | 
					/* Routine returns the IP overhead imposed by a (caller-protected) socket. */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -36,8 +36,6 @@ void __inet_accept(struct socket *sock, struct socket *newsock,
 | 
				
			||||||
int inet_send_prepare(struct sock *sk);
 | 
					int inet_send_prepare(struct sock *sk);
 | 
				
			||||||
int inet_sendmsg(struct socket *sock, struct msghdr *msg, size_t size);
 | 
					int inet_sendmsg(struct socket *sock, struct msghdr *msg, size_t size);
 | 
				
			||||||
void inet_splice_eof(struct socket *sock);
 | 
					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 inet_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
 | 
				
			||||||
		 int flags);
 | 
							 int flags);
 | 
				
			||||||
int inet_shutdown(struct socket *sock, int how);
 | 
					int inet_shutdown(struct socket *sock, int how);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1277,8 +1277,6 @@ struct proto {
 | 
				
			||||||
					   size_t len);
 | 
										   size_t len);
 | 
				
			||||||
	int			(*recvmsg)(struct sock *sk, struct msghdr *msg,
 | 
						int			(*recvmsg)(struct sock *sk, struct msghdr *msg,
 | 
				
			||||||
					   size_t len, int flags, int *addr_len);
 | 
										   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);
 | 
						void			(*splice_eof)(struct socket *sock);
 | 
				
			||||||
	int			(*bind)(struct sock *sk,
 | 
						int			(*bind)(struct sock *sk,
 | 
				
			||||||
					struct sockaddr *addr, int addr_len);
 | 
										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_recvmsg(struct socket *, struct msghdr *, size_t, int);
 | 
				
			||||||
int sock_no_mmap(struct file *file, struct socket *sock,
 | 
					int sock_no_mmap(struct file *file, struct socket *sock,
 | 
				
			||||||
		 struct vm_area_struct *vma);
 | 
							 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
 | 
					 * Functions to fill in entries in struct proto_ops when a protocol
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
					int tcp_sendmsg_fastopen(struct sock *sk, struct msghdr *msg, int *copied,
 | 
				
			||||||
			 size_t size, struct ubuf_info *uarg);
 | 
								 size_t size, struct ubuf_info *uarg);
 | 
				
			||||||
void tcp_splice_eof(struct socket *sock);
 | 
					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_send_mss(struct sock *sk, int *size_goal, int flags);
 | 
				
			||||||
int tcp_wmem_schedule(struct sock *sk, int copy);
 | 
					int tcp_wmem_schedule(struct sock *sk, int copy);
 | 
				
			||||||
void tcp_push(struct sock *sk, int flags, int mss_now, int nonagle,
 | 
					void tcp_push(struct sock *sk, int flags, int mss_now, int nonagle,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1929,7 +1929,6 @@ static const struct proto_ops atalk_dgram_ops = {
 | 
				
			||||||
	.sendmsg	= atalk_sendmsg,
 | 
						.sendmsg	= atalk_sendmsg,
 | 
				
			||||||
	.recvmsg	= atalk_recvmsg,
 | 
						.recvmsg	= atalk_recvmsg,
 | 
				
			||||||
	.mmap		= sock_no_mmap,
 | 
						.mmap		= sock_no_mmap,
 | 
				
			||||||
	.sendpage	= sock_no_sendpage,
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct notifier_block ddp_notifier = {
 | 
					static struct notifier_block ddp_notifier = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -126,7 +126,6 @@ static const struct proto_ops pvc_proto_ops = {
 | 
				
			||||||
	.sendmsg =	vcc_sendmsg,
 | 
						.sendmsg =	vcc_sendmsg,
 | 
				
			||||||
	.recvmsg =	vcc_recvmsg,
 | 
						.recvmsg =	vcc_recvmsg,
 | 
				
			||||||
	.mmap =		sock_no_mmap,
 | 
						.mmap =		sock_no_mmap,
 | 
				
			||||||
	.sendpage =	sock_no_sendpage,
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -654,7 +654,6 @@ static const struct proto_ops svc_proto_ops = {
 | 
				
			||||||
	.sendmsg =	vcc_sendmsg,
 | 
						.sendmsg =	vcc_sendmsg,
 | 
				
			||||||
	.recvmsg =	vcc_recvmsg,
 | 
						.recvmsg =	vcc_recvmsg,
 | 
				
			||||||
	.mmap =		sock_no_mmap,
 | 
						.mmap =		sock_no_mmap,
 | 
				
			||||||
	.sendpage =	sock_no_sendpage,
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2022,7 +2022,6 @@ static const struct proto_ops ax25_proto_ops = {
 | 
				
			||||||
	.sendmsg	= ax25_sendmsg,
 | 
						.sendmsg	= ax25_sendmsg,
 | 
				
			||||||
	.recvmsg	= ax25_recvmsg,
 | 
						.recvmsg	= ax25_recvmsg,
 | 
				
			||||||
	.mmap		= sock_no_mmap,
 | 
						.mmap		= sock_no_mmap,
 | 
				
			||||||
	.sendpage	= sock_no_sendpage,
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -976,7 +976,6 @@ static const struct proto_ops caif_seqpacket_ops = {
 | 
				
			||||||
	.sendmsg = caif_seqpkt_sendmsg,
 | 
						.sendmsg = caif_seqpkt_sendmsg,
 | 
				
			||||||
	.recvmsg = caif_seqpkt_recvmsg,
 | 
						.recvmsg = caif_seqpkt_recvmsg,
 | 
				
			||||||
	.mmap = sock_no_mmap,
 | 
						.mmap = sock_no_mmap,
 | 
				
			||||||
	.sendpage = sock_no_sendpage,
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const struct proto_ops caif_stream_ops = {
 | 
					static const struct proto_ops caif_stream_ops = {
 | 
				
			||||||
| 
						 | 
					@ -996,7 +995,6 @@ static const struct proto_ops caif_stream_ops = {
 | 
				
			||||||
	.sendmsg = caif_stream_sendmsg,
 | 
						.sendmsg = caif_stream_sendmsg,
 | 
				
			||||||
	.recvmsg = caif_stream_recvmsg,
 | 
						.recvmsg = caif_stream_recvmsg,
 | 
				
			||||||
	.mmap = sock_no_mmap,
 | 
						.mmap = sock_no_mmap,
 | 
				
			||||||
	.sendpage = sock_no_sendpage,
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* This function is called when a socket is finally destroyed. */
 | 
					/* This function is called when a socket is finally destroyed. */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1703,7 +1703,6 @@ static const struct proto_ops bcm_ops = {
 | 
				
			||||||
	.sendmsg       = bcm_sendmsg,
 | 
						.sendmsg       = bcm_sendmsg,
 | 
				
			||||||
	.recvmsg       = bcm_recvmsg,
 | 
						.recvmsg       = bcm_recvmsg,
 | 
				
			||||||
	.mmap          = sock_no_mmap,
 | 
						.mmap          = sock_no_mmap,
 | 
				
			||||||
	.sendpage      = sock_no_sendpage,
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct proto bcm_proto __read_mostly = {
 | 
					static struct proto bcm_proto __read_mostly = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1699,7 +1699,6 @@ static const struct proto_ops isotp_ops = {
 | 
				
			||||||
	.sendmsg = isotp_sendmsg,
 | 
						.sendmsg = isotp_sendmsg,
 | 
				
			||||||
	.recvmsg = isotp_recvmsg,
 | 
						.recvmsg = isotp_recvmsg,
 | 
				
			||||||
	.mmap = sock_no_mmap,
 | 
						.mmap = sock_no_mmap,
 | 
				
			||||||
	.sendpage = sock_no_sendpage,
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct proto isotp_proto __read_mostly = {
 | 
					static struct proto isotp_proto __read_mostly = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1306,7 +1306,6 @@ static const struct proto_ops j1939_ops = {
 | 
				
			||||||
	.sendmsg = j1939_sk_sendmsg,
 | 
						.sendmsg = j1939_sk_sendmsg,
 | 
				
			||||||
	.recvmsg = j1939_sk_recvmsg,
 | 
						.recvmsg = j1939_sk_recvmsg,
 | 
				
			||||||
	.mmap = sock_no_mmap,
 | 
						.mmap = sock_no_mmap,
 | 
				
			||||||
	.sendpage = sock_no_sendpage,
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct proto j1939_proto __read_mostly = {
 | 
					static struct proto j1939_proto __read_mostly = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -962,7 +962,6 @@ static const struct proto_ops raw_ops = {
 | 
				
			||||||
	.sendmsg       = raw_sendmsg,
 | 
						.sendmsg       = raw_sendmsg,
 | 
				
			||||||
	.recvmsg       = raw_recvmsg,
 | 
						.recvmsg       = raw_recvmsg,
 | 
				
			||||||
	.mmap          = sock_no_mmap,
 | 
						.mmap          = sock_no_mmap,
 | 
				
			||||||
	.sendpage      = sock_no_sendpage,
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct proto raw_proto __read_mostly = {
 | 
					static struct proto raw_proto __read_mostly = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
					 *	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 "
 | 
						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->name,
 | 
				
			||||||
		   proto->obj_size,
 | 
							   proto->obj_size,
 | 
				
			||||||
		   sock_prot_inuse_get(seq_file_net(seq), proto),
 | 
							   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->getsockopt),
 | 
				
			||||||
		   proto_method_implemented(proto->sendmsg),
 | 
							   proto_method_implemented(proto->sendmsg),
 | 
				
			||||||
		   proto_method_implemented(proto->recvmsg),
 | 
							   proto_method_implemented(proto->recvmsg),
 | 
				
			||||||
		   proto_method_implemented(proto->sendpage),
 | 
					 | 
				
			||||||
		   proto_method_implemented(proto->bind),
 | 
							   proto_method_implemented(proto->bind),
 | 
				
			||||||
		   proto_method_implemented(proto->backlog_rcv),
 | 
							   proto_method_implemented(proto->backlog_rcv),
 | 
				
			||||||
		   proto_method_implemented(proto->hash),
 | 
							   proto_method_implemented(proto->hash),
 | 
				
			||||||
| 
						 | 
					@ -4088,7 +4057,7 @@ static int proto_seq_show(struct seq_file *seq, void *v)
 | 
				
			||||||
			   "maxhdr",
 | 
								   "maxhdr",
 | 
				
			||||||
			   "slab",
 | 
								   "slab",
 | 
				
			||||||
			   "module",
 | 
								   "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
 | 
						else
 | 
				
			||||||
		proto_seq_printf(seq, list_entry(v, struct proto, node));
 | 
							proto_seq_printf(seq, list_entry(v, struct proto, node));
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1010,7 +1010,6 @@ static const struct proto_ops inet_dccp_ops = {
 | 
				
			||||||
	.sendmsg	   = inet_sendmsg,
 | 
						.sendmsg	   = inet_sendmsg,
 | 
				
			||||||
	.recvmsg	   = sock_common_recvmsg,
 | 
						.recvmsg	   = sock_common_recvmsg,
 | 
				
			||||||
	.mmap		   = sock_no_mmap,
 | 
						.mmap		   = sock_no_mmap,
 | 
				
			||||||
	.sendpage	   = sock_no_sendpage,
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct inet_protosw dccp_v4_protosw = {
 | 
					static struct inet_protosw dccp_v4_protosw = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1087,7 +1087,6 @@ static const struct proto_ops inet6_dccp_ops = {
 | 
				
			||||||
	.sendmsg	   = inet_sendmsg,
 | 
						.sendmsg	   = inet_sendmsg,
 | 
				
			||||||
	.recvmsg	   = sock_common_recvmsg,
 | 
						.recvmsg	   = sock_common_recvmsg,
 | 
				
			||||||
	.mmap		   = sock_no_mmap,
 | 
						.mmap		   = sock_no_mmap,
 | 
				
			||||||
	.sendpage	   = sock_no_sendpage,
 | 
					 | 
				
			||||||
#ifdef CONFIG_COMPAT
 | 
					#ifdef CONFIG_COMPAT
 | 
				
			||||||
	.compat_ioctl	   = inet6_compat_ioctl,
 | 
						.compat_ioctl	   = inet6_compat_ioctl,
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -426,7 +426,6 @@ static const struct proto_ops ieee802154_raw_ops = {
 | 
				
			||||||
	.sendmsg	   = ieee802154_sock_sendmsg,
 | 
						.sendmsg	   = ieee802154_sock_sendmsg,
 | 
				
			||||||
	.recvmsg	   = sock_common_recvmsg,
 | 
						.recvmsg	   = sock_common_recvmsg,
 | 
				
			||||||
	.mmap		   = sock_no_mmap,
 | 
						.mmap		   = sock_no_mmap,
 | 
				
			||||||
	.sendpage	   = sock_no_sendpage,
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* DGRAM Sockets (802.15.4 dataframes) */
 | 
					/* DGRAM Sockets (802.15.4 dataframes) */
 | 
				
			||||||
| 
						 | 
					@ -989,7 +988,6 @@ static const struct proto_ops ieee802154_dgram_ops = {
 | 
				
			||||||
	.sendmsg	   = ieee802154_sock_sendmsg,
 | 
						.sendmsg	   = ieee802154_sock_sendmsg,
 | 
				
			||||||
	.recvmsg	   = sock_common_recvmsg,
 | 
						.recvmsg	   = sock_common_recvmsg,
 | 
				
			||||||
	.mmap		   = sock_no_mmap,
 | 
						.mmap		   = sock_no_mmap,
 | 
				
			||||||
	.sendpage	   = sock_no_sendpage,
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void ieee802154_sock_destruct(struct sock *sk)
 | 
					static void ieee802154_sock_destruct(struct sock *sk)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -847,23 +847,6 @@ void inet_splice_eof(struct socket *sock)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
EXPORT_SYMBOL_GPL(inet_splice_eof);
 | 
					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 *,
 | 
					INDIRECT_CALLABLE_DECLARE(int udp_recvmsg(struct sock *, struct msghdr *,
 | 
				
			||||||
					  size_t, int, int *));
 | 
										  size_t, int, int *));
 | 
				
			||||||
int inet_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
 | 
					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,
 | 
						.mmap		   = tcp_mmap,
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
	.splice_eof	   = inet_splice_eof,
 | 
						.splice_eof	   = inet_splice_eof,
 | 
				
			||||||
	.sendpage	   = inet_sendpage,
 | 
					 | 
				
			||||||
	.splice_read	   = tcp_splice_read,
 | 
						.splice_read	   = tcp_splice_read,
 | 
				
			||||||
	.read_sock	   = tcp_read_sock,
 | 
						.read_sock	   = tcp_read_sock,
 | 
				
			||||||
	.read_skb	   = tcp_read_skb,
 | 
						.read_skb	   = tcp_read_skb,
 | 
				
			||||||
	.sendmsg_locked    = tcp_sendmsg_locked,
 | 
						.sendmsg_locked    = tcp_sendmsg_locked,
 | 
				
			||||||
	.sendpage_locked   = tcp_sendpage_locked,
 | 
					 | 
				
			||||||
	.peek_len	   = tcp_peek_len,
 | 
						.peek_len	   = tcp_peek_len,
 | 
				
			||||||
#ifdef CONFIG_COMPAT
 | 
					#ifdef CONFIG_COMPAT
 | 
				
			||||||
	.compat_ioctl	   = inet_compat_ioctl,
 | 
						.compat_ioctl	   = inet_compat_ioctl,
 | 
				
			||||||
| 
						 | 
					@ -1102,7 +1083,6 @@ const struct proto_ops inet_dgram_ops = {
 | 
				
			||||||
	.recvmsg	   = inet_recvmsg,
 | 
						.recvmsg	   = inet_recvmsg,
 | 
				
			||||||
	.mmap		   = sock_no_mmap,
 | 
						.mmap		   = sock_no_mmap,
 | 
				
			||||||
	.splice_eof	   = inet_splice_eof,
 | 
						.splice_eof	   = inet_splice_eof,
 | 
				
			||||||
	.sendpage	   = inet_sendpage,
 | 
					 | 
				
			||||||
	.set_peek_off	   = sk_set_peek_off,
 | 
						.set_peek_off	   = sk_set_peek_off,
 | 
				
			||||||
#ifdef CONFIG_COMPAT
 | 
					#ifdef CONFIG_COMPAT
 | 
				
			||||||
	.compat_ioctl	   = inet_compat_ioctl,
 | 
						.compat_ioctl	   = inet_compat_ioctl,
 | 
				
			||||||
| 
						 | 
					@ -1134,7 +1114,6 @@ static const struct proto_ops inet_sockraw_ops = {
 | 
				
			||||||
	.recvmsg	   = inet_recvmsg,
 | 
						.recvmsg	   = inet_recvmsg,
 | 
				
			||||||
	.mmap		   = sock_no_mmap,
 | 
						.mmap		   = sock_no_mmap,
 | 
				
			||||||
	.splice_eof	   = inet_splice_eof,
 | 
						.splice_eof	   = inet_splice_eof,
 | 
				
			||||||
	.sendpage	   = inet_sendpage,
 | 
					 | 
				
			||||||
#ifdef CONFIG_COMPAT
 | 
					#ifdef CONFIG_COMPAT
 | 
				
			||||||
	.compat_ioctl	   = inet_compat_ioctl,
 | 
						.compat_ioctl	   = inet_compat_ioctl,
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -923,11 +923,10 @@ int tcp_send_mss(struct sock *sk, int *size_goal, int flags)
 | 
				
			||||||
	return mss_now;
 | 
						return mss_now;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* In some cases, both sendpage() and sendmsg() could have added
 | 
					/* In some cases, both sendmsg() could have added an skb to the write queue,
 | 
				
			||||||
 * an skb to the write queue, but failed adding payload on it.
 | 
					 * but failed adding payload on it.  We need to remove it to consume less
 | 
				
			||||||
 * We need to remove it to consume less memory, but more
 | 
					 * memory, but more importantly be able to generate EPOLLOUT for Edge Trigger
 | 
				
			||||||
 * importantly be able to generate EPOLLOUT for Edge Trigger epoll()
 | 
					 * epoll() users.
 | 
				
			||||||
 * users.
 | 
					 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
void tcp_remove_empty_skb(struct sock *sk)
 | 
					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);
 | 
						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)
 | 
					void tcp_free_fastopen_req(struct tcp_sock *tp)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (tp->fastopen_req) {
 | 
						if (tp->fastopen_req) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -486,7 +486,7 @@ static int tcp_bpf_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)
 | 
				
			||||||
	long timeo;
 | 
						long timeo;
 | 
				
			||||||
	int flags;
 | 
						int flags;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Don't let internal sendpage flags through */
 | 
						/* Don't let internal flags through */
 | 
				
			||||||
	flags = (msg->msg_flags & ~MSG_SENDPAGE_DECRYPTED);
 | 
						flags = (msg->msg_flags & ~MSG_SENDPAGE_DECRYPTED);
 | 
				
			||||||
	flags |= MSG_NO_SHARED_FRAGS;
 | 
						flags |= MSG_NO_SHARED_FRAGS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -566,23 +566,6 @@ static int tcp_bpf_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)
 | 
				
			||||||
	return copied ? copied : 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 {
 | 
					enum {
 | 
				
			||||||
	TCP_BPF_IPV4,
 | 
						TCP_BPF_IPV4,
 | 
				
			||||||
	TCP_BPF_IPV6,
 | 
						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]			= prot[TCP_BPF_BASE];
 | 
				
			||||||
	prot[TCP_BPF_TX].sendmsg		= tcp_bpf_sendmsg;
 | 
						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]			= prot[TCP_BPF_BASE];
 | 
				
			||||||
	prot[TCP_BPF_RX].recvmsg		= tcp_bpf_recvmsg_parser;
 | 
						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.
 | 
						 * indeed valid assumptions.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	return ops->recvmsg  == tcp_recvmsg &&
 | 
						return ops->recvmsg  == tcp_recvmsg &&
 | 
				
			||||||
	       ops->sendmsg  == tcp_sendmsg &&
 | 
						       ops->sendmsg  == tcp_sendmsg ? 0 : -ENOTSUPP;
 | 
				
			||||||
	       ops->sendpage == tcp_sendpage ? 0 : -ENOTSUPP;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int tcp_bpf_update_proto(struct sock *sk, struct sk_psock *psock, bool restore)
 | 
					int tcp_bpf_update_proto(struct sock *sk, struct sk_psock *psock, bool restore)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3117,7 +3117,6 @@ struct proto tcp_prot = {
 | 
				
			||||||
	.recvmsg		= tcp_recvmsg,
 | 
						.recvmsg		= tcp_recvmsg,
 | 
				
			||||||
	.sendmsg		= tcp_sendmsg,
 | 
						.sendmsg		= tcp_sendmsg,
 | 
				
			||||||
	.splice_eof		= tcp_splice_eof,
 | 
						.splice_eof		= tcp_splice_eof,
 | 
				
			||||||
	.sendpage		= tcp_sendpage,
 | 
					 | 
				
			||||||
	.backlog_rcv		= tcp_v4_do_rcv,
 | 
						.backlog_rcv		= tcp_v4_do_rcv,
 | 
				
			||||||
	.release_cb		= tcp_release_cb,
 | 
						.release_cb		= tcp_release_cb,
 | 
				
			||||||
	.hash			= inet_hash,
 | 
						.hash			= inet_hash,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1340,20 +1340,6 @@ void udp_splice_eof(struct socket *sock)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
EXPORT_SYMBOL_GPL(udp_splice_eof);
 | 
					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
 | 
					#define UDP_SKB_IS_STATELESS 0x80000000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* all head states (dst, sk, nf conntrack) except skb extensions are
 | 
					/* all head states (dst, sk, nf conntrack) except skb extensions are
 | 
				
			||||||
| 
						 | 
					@ -2933,7 +2919,6 @@ struct proto udp_prot = {
 | 
				
			||||||
	.sendmsg		= udp_sendmsg,
 | 
						.sendmsg		= udp_sendmsg,
 | 
				
			||||||
	.recvmsg		= udp_recvmsg,
 | 
						.recvmsg		= udp_recvmsg,
 | 
				
			||||||
	.splice_eof		= udp_splice_eof,
 | 
						.splice_eof		= udp_splice_eof,
 | 
				
			||||||
	.sendpage		= udp_sendpage,
 | 
					 | 
				
			||||||
	.release_cb		= ip4_datagram_release_cb,
 | 
						.release_cb		= ip4_datagram_release_cb,
 | 
				
			||||||
	.hash			= udp_lib_hash,
 | 
						.hash			= udp_lib_hash,
 | 
				
			||||||
	.unhash			= udp_lib_unhash,
 | 
						.unhash			= udp_lib_unhash,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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 udp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int flags,
 | 
				
			||||||
		int *addr_len);
 | 
							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);
 | 
					void udp_destroy_sock(struct sock *sk);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_PROC_FS
 | 
					#ifdef CONFIG_PROC_FS
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -56,7 +56,6 @@ struct proto 	udplite_prot = {
 | 
				
			||||||
	.getsockopt	   = udp_getsockopt,
 | 
						.getsockopt	   = udp_getsockopt,
 | 
				
			||||||
	.sendmsg	   = udp_sendmsg,
 | 
						.sendmsg	   = udp_sendmsg,
 | 
				
			||||||
	.recvmsg	   = udp_recvmsg,
 | 
						.recvmsg	   = udp_recvmsg,
 | 
				
			||||||
	.sendpage	   = udp_sendpage,
 | 
					 | 
				
			||||||
	.hash		   = udp_lib_hash,
 | 
						.hash		   = udp_lib_hash,
 | 
				
			||||||
	.unhash		   = udp_lib_unhash,
 | 
						.unhash		   = udp_lib_unhash,
 | 
				
			||||||
	.rehash		   = udp_v4_rehash,
 | 
						.rehash		   = udp_v4_rehash,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -696,9 +696,7 @@ const struct proto_ops inet6_stream_ops = {
 | 
				
			||||||
	.mmap		   = tcp_mmap,
 | 
						.mmap		   = tcp_mmap,
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
	.splice_eof	   = inet_splice_eof,
 | 
						.splice_eof	   = inet_splice_eof,
 | 
				
			||||||
	.sendpage	   = inet_sendpage,
 | 
					 | 
				
			||||||
	.sendmsg_locked    = tcp_sendmsg_locked,
 | 
						.sendmsg_locked    = tcp_sendmsg_locked,
 | 
				
			||||||
	.sendpage_locked   = tcp_sendpage_locked,
 | 
					 | 
				
			||||||
	.splice_read	   = tcp_splice_read,
 | 
						.splice_read	   = tcp_splice_read,
 | 
				
			||||||
	.read_sock	   = tcp_read_sock,
 | 
						.read_sock	   = tcp_read_sock,
 | 
				
			||||||
	.read_skb	   = tcp_read_skb,
 | 
						.read_skb	   = tcp_read_skb,
 | 
				
			||||||
| 
						 | 
					@ -729,7 +727,6 @@ const struct proto_ops inet6_dgram_ops = {
 | 
				
			||||||
	.recvmsg	   = inet6_recvmsg,		/* retpoline's sake */
 | 
						.recvmsg	   = inet6_recvmsg,		/* retpoline's sake */
 | 
				
			||||||
	.read_skb	   = udp_read_skb,
 | 
						.read_skb	   = udp_read_skb,
 | 
				
			||||||
	.mmap		   = sock_no_mmap,
 | 
						.mmap		   = sock_no_mmap,
 | 
				
			||||||
	.sendpage	   = sock_no_sendpage,
 | 
					 | 
				
			||||||
	.set_peek_off	   = sk_set_peek_off,
 | 
						.set_peek_off	   = sk_set_peek_off,
 | 
				
			||||||
#ifdef CONFIG_COMPAT
 | 
					#ifdef CONFIG_COMPAT
 | 
				
			||||||
	.compat_ioctl	   = inet6_compat_ioctl,
 | 
						.compat_ioctl	   = inet6_compat_ioctl,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1296,7 +1296,6 @@ const struct proto_ops inet6_sockraw_ops = {
 | 
				
			||||||
	.sendmsg	   = inet_sendmsg,		/* ok		*/
 | 
						.sendmsg	   = inet_sendmsg,		/* ok		*/
 | 
				
			||||||
	.recvmsg	   = sock_common_recvmsg,	/* ok		*/
 | 
						.recvmsg	   = sock_common_recvmsg,	/* ok		*/
 | 
				
			||||||
	.mmap		   = sock_no_mmap,
 | 
						.mmap		   = sock_no_mmap,
 | 
				
			||||||
	.sendpage	   = sock_no_sendpage,
 | 
					 | 
				
			||||||
#ifdef CONFIG_COMPAT
 | 
					#ifdef CONFIG_COMPAT
 | 
				
			||||||
	.compat_ioctl	   = inet6_compat_ioctl,
 | 
						.compat_ioctl	   = inet6_compat_ioctl,
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2151,7 +2151,6 @@ struct proto tcpv6_prot = {
 | 
				
			||||||
	.recvmsg		= tcp_recvmsg,
 | 
						.recvmsg		= tcp_recvmsg,
 | 
				
			||||||
	.sendmsg		= tcp_sendmsg,
 | 
						.sendmsg		= tcp_sendmsg,
 | 
				
			||||||
	.splice_eof		= tcp_splice_eof,
 | 
						.splice_eof		= tcp_splice_eof,
 | 
				
			||||||
	.sendpage		= tcp_sendpage,
 | 
					 | 
				
			||||||
	.backlog_rcv		= tcp_v6_do_rcv,
 | 
						.backlog_rcv		= tcp_v6_do_rcv,
 | 
				
			||||||
	.release_cb		= tcp_release_cb,
 | 
						.release_cb		= tcp_release_cb,
 | 
				
			||||||
	.hash			= inet6_hash,
 | 
						.hash			= inet6_hash,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -963,24 +963,6 @@ static void kcm_splice_eof(struct socket *sock)
 | 
				
			||||||
	release_sock(sk);
 | 
						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,
 | 
					static int kcm_recvmsg(struct socket *sock, struct msghdr *msg,
 | 
				
			||||||
		       size_t len, int flags)
 | 
							       size_t len, int flags)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -1769,7 +1751,6 @@ static const struct proto_ops kcm_dgram_ops = {
 | 
				
			||||||
	.recvmsg =	kcm_recvmsg,
 | 
						.recvmsg =	kcm_recvmsg,
 | 
				
			||||||
	.mmap =		sock_no_mmap,
 | 
						.mmap =		sock_no_mmap,
 | 
				
			||||||
	.splice_eof =	kcm_splice_eof,
 | 
						.splice_eof =	kcm_splice_eof,
 | 
				
			||||||
	.sendpage =	kcm_sendpage,
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const struct proto_ops kcm_seqpacket_ops = {
 | 
					static const struct proto_ops kcm_seqpacket_ops = {
 | 
				
			||||||
| 
						 | 
					@ -1791,7 +1772,6 @@ static const struct proto_ops kcm_seqpacket_ops = {
 | 
				
			||||||
	.recvmsg =	kcm_recvmsg,
 | 
						.recvmsg =	kcm_recvmsg,
 | 
				
			||||||
	.mmap =		sock_no_mmap,
 | 
						.mmap =		sock_no_mmap,
 | 
				
			||||||
	.splice_eof =	kcm_splice_eof,
 | 
						.splice_eof =	kcm_splice_eof,
 | 
				
			||||||
	.sendpage =	kcm_sendpage,
 | 
					 | 
				
			||||||
	.splice_read =	kcm_splice_read,
 | 
						.splice_read =	kcm_splice_read,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3761,7 +3761,6 @@ static const struct proto_ops pfkey_ops = {
 | 
				
			||||||
	.listen		=	sock_no_listen,
 | 
						.listen		=	sock_no_listen,
 | 
				
			||||||
	.shutdown	=	sock_no_shutdown,
 | 
						.shutdown	=	sock_no_shutdown,
 | 
				
			||||||
	.mmap		=	sock_no_mmap,
 | 
						.mmap		=	sock_no_mmap,
 | 
				
			||||||
	.sendpage	=	sock_no_sendpage,
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Now the operations that really occur. */
 | 
						/* Now the operations that really occur. */
 | 
				
			||||||
	.release	=	pfkey_release,
 | 
						.release	=	pfkey_release,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -624,7 +624,6 @@ static const struct proto_ops l2tp_ip_ops = {
 | 
				
			||||||
	.sendmsg	   = inet_sendmsg,
 | 
						.sendmsg	   = inet_sendmsg,
 | 
				
			||||||
	.recvmsg	   = sock_common_recvmsg,
 | 
						.recvmsg	   = sock_common_recvmsg,
 | 
				
			||||||
	.mmap		   = sock_no_mmap,
 | 
						.mmap		   = sock_no_mmap,
 | 
				
			||||||
	.sendpage	   = sock_no_sendpage,
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct inet_protosw l2tp_ip_protosw = {
 | 
					static struct inet_protosw l2tp_ip_protosw = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -751,7 +751,6 @@ static const struct proto_ops l2tp_ip6_ops = {
 | 
				
			||||||
	.sendmsg	   = inet_sendmsg,
 | 
						.sendmsg	   = inet_sendmsg,
 | 
				
			||||||
	.recvmsg	   = sock_common_recvmsg,
 | 
						.recvmsg	   = sock_common_recvmsg,
 | 
				
			||||||
	.mmap		   = sock_no_mmap,
 | 
						.mmap		   = sock_no_mmap,
 | 
				
			||||||
	.sendpage	   = sock_no_sendpage,
 | 
					 | 
				
			||||||
#ifdef CONFIG_COMPAT
 | 
					#ifdef CONFIG_COMPAT
 | 
				
			||||||
	.compat_ioctl	   = inet6_compat_ioctl,
 | 
						.compat_ioctl	   = inet6_compat_ioctl,
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1232,7 +1232,6 @@ static const struct proto_ops llc_ui_ops = {
 | 
				
			||||||
	.sendmsg     = llc_ui_sendmsg,
 | 
						.sendmsg     = llc_ui_sendmsg,
 | 
				
			||||||
	.recvmsg     = llc_ui_recvmsg,
 | 
						.recvmsg     = llc_ui_recvmsg,
 | 
				
			||||||
	.mmap	     = sock_no_mmap,
 | 
						.mmap	     = sock_no_mmap,
 | 
				
			||||||
	.sendpage    = sock_no_sendpage,
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const char llc_proc_err_msg[] __initconst =
 | 
					static const char llc_proc_err_msg[] __initconst =
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -485,7 +485,6 @@ static const struct proto_ops mctp_dgram_ops = {
 | 
				
			||||||
	.sendmsg	= mctp_sendmsg,
 | 
						.sendmsg	= mctp_sendmsg,
 | 
				
			||||||
	.recvmsg	= mctp_recvmsg,
 | 
						.recvmsg	= mctp_recvmsg,
 | 
				
			||||||
	.mmap		= sock_no_mmap,
 | 
						.mmap		= sock_no_mmap,
 | 
				
			||||||
	.sendpage	= sock_no_sendpage,
 | 
					 | 
				
			||||||
#ifdef CONFIG_COMPAT
 | 
					#ifdef CONFIG_COMPAT
 | 
				
			||||||
	.compat_ioctl	= mctp_compat_ioctl,
 | 
						.compat_ioctl	= mctp_compat_ioctl,
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3866,7 +3866,6 @@ static const struct proto_ops mptcp_stream_ops = {
 | 
				
			||||||
	.sendmsg	   = inet_sendmsg,
 | 
						.sendmsg	   = inet_sendmsg,
 | 
				
			||||||
	.recvmsg	   = inet_recvmsg,
 | 
						.recvmsg	   = inet_recvmsg,
 | 
				
			||||||
	.mmap		   = sock_no_mmap,
 | 
						.mmap		   = sock_no_mmap,
 | 
				
			||||||
	.sendpage	   = inet_sendpage,
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct inet_protosw mptcp_protosw = {
 | 
					static struct inet_protosw mptcp_protosw = {
 | 
				
			||||||
| 
						 | 
					@ -3961,7 +3960,6 @@ static const struct proto_ops mptcp_v6_stream_ops = {
 | 
				
			||||||
	.sendmsg	   = inet6_sendmsg,
 | 
						.sendmsg	   = inet6_sendmsg,
 | 
				
			||||||
	.recvmsg	   = inet6_recvmsg,
 | 
						.recvmsg	   = inet6_recvmsg,
 | 
				
			||||||
	.mmap		   = sock_no_mmap,
 | 
						.mmap		   = sock_no_mmap,
 | 
				
			||||||
	.sendpage	   = inet_sendpage,
 | 
					 | 
				
			||||||
#ifdef CONFIG_COMPAT
 | 
					#ifdef CONFIG_COMPAT
 | 
				
			||||||
	.compat_ioctl	   = inet6_compat_ioctl,
 | 
						.compat_ioctl	   = inet6_compat_ioctl,
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2815,7 +2815,6 @@ static const struct proto_ops netlink_ops = {
 | 
				
			||||||
	.sendmsg =	netlink_sendmsg,
 | 
						.sendmsg =	netlink_sendmsg,
 | 
				
			||||||
	.recvmsg =	netlink_recvmsg,
 | 
						.recvmsg =	netlink_recvmsg,
 | 
				
			||||||
	.mmap =		sock_no_mmap,
 | 
						.mmap =		sock_no_mmap,
 | 
				
			||||||
	.sendpage =	sock_no_sendpage,
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const struct net_proto_family netlink_family_ops = {
 | 
					static const struct net_proto_family netlink_family_ops = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1364,7 +1364,6 @@ static const struct proto_ops nr_proto_ops = {
 | 
				
			||||||
	.sendmsg	=	nr_sendmsg,
 | 
						.sendmsg	=	nr_sendmsg,
 | 
				
			||||||
	.recvmsg	=	nr_recvmsg,
 | 
						.recvmsg	=	nr_recvmsg,
 | 
				
			||||||
	.mmap		=	sock_no_mmap,
 | 
						.mmap		=	sock_no_mmap,
 | 
				
			||||||
	.sendpage	=	sock_no_sendpage,
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct notifier_block nr_dev_notifier = {
 | 
					static struct notifier_block nr_dev_notifier = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4621,7 +4621,6 @@ static const struct proto_ops packet_ops_spkt = {
 | 
				
			||||||
	.sendmsg =	packet_sendmsg_spkt,
 | 
						.sendmsg =	packet_sendmsg_spkt,
 | 
				
			||||||
	.recvmsg =	packet_recvmsg,
 | 
						.recvmsg =	packet_recvmsg,
 | 
				
			||||||
	.mmap =		sock_no_mmap,
 | 
						.mmap =		sock_no_mmap,
 | 
				
			||||||
	.sendpage =	sock_no_sendpage,
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const struct proto_ops packet_ops = {
 | 
					static const struct proto_ops packet_ops = {
 | 
				
			||||||
| 
						 | 
					@ -4643,7 +4642,6 @@ static const struct proto_ops packet_ops = {
 | 
				
			||||||
	.sendmsg =	packet_sendmsg,
 | 
						.sendmsg =	packet_sendmsg,
 | 
				
			||||||
	.recvmsg =	packet_recvmsg,
 | 
						.recvmsg =	packet_recvmsg,
 | 
				
			||||||
	.mmap =		packet_mmap,
 | 
						.mmap =		packet_mmap,
 | 
				
			||||||
	.sendpage =	sock_no_sendpage,
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const struct net_proto_family packet_family_ops = {
 | 
					static const struct net_proto_family packet_family_ops = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -441,7 +441,6 @@ const struct proto_ops phonet_dgram_ops = {
 | 
				
			||||||
	.sendmsg	= pn_socket_sendmsg,
 | 
						.sendmsg	= pn_socket_sendmsg,
 | 
				
			||||||
	.recvmsg	= sock_common_recvmsg,
 | 
						.recvmsg	= sock_common_recvmsg,
 | 
				
			||||||
	.mmap		= sock_no_mmap,
 | 
						.mmap		= sock_no_mmap,
 | 
				
			||||||
	.sendpage	= sock_no_sendpage,
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const struct proto_ops phonet_stream_ops = {
 | 
					const struct proto_ops phonet_stream_ops = {
 | 
				
			||||||
| 
						 | 
					@ -462,7 +461,6 @@ const struct proto_ops phonet_stream_ops = {
 | 
				
			||||||
	.sendmsg	= pn_socket_sendmsg,
 | 
						.sendmsg	= pn_socket_sendmsg,
 | 
				
			||||||
	.recvmsg	= sock_common_recvmsg,
 | 
						.recvmsg	= sock_common_recvmsg,
 | 
				
			||||||
	.mmap		= sock_no_mmap,
 | 
						.mmap		= sock_no_mmap,
 | 
				
			||||||
	.sendpage	= sock_no_sendpage,
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
EXPORT_SYMBOL(phonet_stream_ops);
 | 
					EXPORT_SYMBOL(phonet_stream_ops);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1244,7 +1244,6 @@ static const struct proto_ops qrtr_proto_ops = {
 | 
				
			||||||
	.shutdown	= sock_no_shutdown,
 | 
						.shutdown	= sock_no_shutdown,
 | 
				
			||||||
	.release	= qrtr_release,
 | 
						.release	= qrtr_release,
 | 
				
			||||||
	.mmap		= sock_no_mmap,
 | 
						.mmap		= sock_no_mmap,
 | 
				
			||||||
	.sendpage	= sock_no_sendpage,
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct proto qrtr_proto = {
 | 
					static struct proto qrtr_proto = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -653,7 +653,6 @@ static const struct proto_ops rds_proto_ops = {
 | 
				
			||||||
	.sendmsg =	rds_sendmsg,
 | 
						.sendmsg =	rds_sendmsg,
 | 
				
			||||||
	.recvmsg =	rds_recvmsg,
 | 
						.recvmsg =	rds_recvmsg,
 | 
				
			||||||
	.mmap =		sock_no_mmap,
 | 
						.mmap =		sock_no_mmap,
 | 
				
			||||||
	.sendpage =	sock_no_sendpage,
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void rds_sock_destruct(struct sock *sk)
 | 
					static void rds_sock_destruct(struct sock *sk)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1496,7 +1496,6 @@ static const struct proto_ops rose_proto_ops = {
 | 
				
			||||||
	.sendmsg	=	rose_sendmsg,
 | 
						.sendmsg	=	rose_sendmsg,
 | 
				
			||||||
	.recvmsg	=	rose_recvmsg,
 | 
						.recvmsg	=	rose_recvmsg,
 | 
				
			||||||
	.mmap		=	sock_no_mmap,
 | 
						.mmap		=	sock_no_mmap,
 | 
				
			||||||
	.sendpage	=	sock_no_sendpage,
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct notifier_block rose_dev_notifier = {
 | 
					static struct notifier_block rose_dev_notifier = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -954,7 +954,6 @@ static const struct proto_ops rxrpc_rpc_ops = {
 | 
				
			||||||
	.sendmsg	= rxrpc_sendmsg,
 | 
						.sendmsg	= rxrpc_sendmsg,
 | 
				
			||||||
	.recvmsg	= rxrpc_recvmsg,
 | 
						.recvmsg	= rxrpc_recvmsg,
 | 
				
			||||||
	.mmap		= sock_no_mmap,
 | 
						.mmap		= sock_no_mmap,
 | 
				
			||||||
	.sendpage	= sock_no_sendpage,
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct proto rxrpc_proto = {
 | 
					static struct proto rxrpc_proto = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1133,7 +1133,6 @@ static const struct proto_ops inet_seqpacket_ops = {
 | 
				
			||||||
	.sendmsg	   = inet_sendmsg,
 | 
						.sendmsg	   = inet_sendmsg,
 | 
				
			||||||
	.recvmsg	   = inet_recvmsg,
 | 
						.recvmsg	   = inet_recvmsg,
 | 
				
			||||||
	.mmap		   = sock_no_mmap,
 | 
						.mmap		   = sock_no_mmap,
 | 
				
			||||||
	.sendpage	   = sock_no_sendpage,
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Registration with AF_INET family.  */
 | 
					/* Registration with AF_INET family.  */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										48
									
								
								net/socket.c
									
									
									
									
									
								
							
							
						
						
									
										48
									
								
								net/socket.c
									
									
									
									
									
								
							| 
						 | 
					@ -3552,54 +3552,6 @@ int kernel_getpeername(struct socket *sock, struct sockaddr *addr)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
EXPORT_SYMBOL(kernel_getpeername);
 | 
					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)
 | 
					 *	kernel_sock_shutdown - shut down part of a full-duplex connection (kernel space)
 | 
				
			||||||
 *	@sock: socket
 | 
					 *	@sock: socket
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3375,7 +3375,6 @@ static const struct proto_ops msg_ops = {
 | 
				
			||||||
	.sendmsg	= tipc_sendmsg,
 | 
						.sendmsg	= tipc_sendmsg,
 | 
				
			||||||
	.recvmsg	= tipc_recvmsg,
 | 
						.recvmsg	= tipc_recvmsg,
 | 
				
			||||||
	.mmap		= sock_no_mmap,
 | 
						.mmap		= sock_no_mmap,
 | 
				
			||||||
	.sendpage	= sock_no_sendpage
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const struct proto_ops packet_ops = {
 | 
					static const struct proto_ops packet_ops = {
 | 
				
			||||||
| 
						 | 
					@ -3396,7 +3395,6 @@ static const struct proto_ops packet_ops = {
 | 
				
			||||||
	.sendmsg	= tipc_send_packet,
 | 
						.sendmsg	= tipc_send_packet,
 | 
				
			||||||
	.recvmsg	= tipc_recvmsg,
 | 
						.recvmsg	= tipc_recvmsg,
 | 
				
			||||||
	.mmap		= sock_no_mmap,
 | 
						.mmap		= sock_no_mmap,
 | 
				
			||||||
	.sendpage	= sock_no_sendpage
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const struct proto_ops stream_ops = {
 | 
					static const struct proto_ops stream_ops = {
 | 
				
			||||||
| 
						 | 
					@ -3417,7 +3415,6 @@ static const struct proto_ops stream_ops = {
 | 
				
			||||||
	.sendmsg	= tipc_sendstream,
 | 
						.sendmsg	= tipc_sendstream,
 | 
				
			||||||
	.recvmsg	= tipc_recvstream,
 | 
						.recvmsg	= tipc_recvstream,
 | 
				
			||||||
	.mmap		= sock_no_mmap,
 | 
						.mmap		= sock_no_mmap,
 | 
				
			||||||
	.sendpage	= sock_no_sendpage
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const struct net_proto_family tipc_family_ops = {
 | 
					static const struct net_proto_family tipc_family_ops = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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);
 | 
					void tls_sw_strparser_done(struct tls_context *tls_ctx);
 | 
				
			||||||
int tls_sw_sendmsg(struct sock *sk, struct msghdr *msg, size_t size);
 | 
					int tls_sw_sendmsg(struct sock *sk, struct msghdr *msg, size_t size);
 | 
				
			||||||
void tls_sw_splice_eof(struct socket *sock);
 | 
					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_cancel_work_tx(struct tls_context *tls_ctx);
 | 
				
			||||||
void tls_sw_release_resources_tx(struct sock *sk);
 | 
					void tls_sw_release_resources_tx(struct sock *sk);
 | 
				
			||||||
void tls_sw_free_ctx_tx(struct tls_context *tls_ctx);
 | 
					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);
 | 
					int tls_device_sendmsg(struct sock *sk, struct msghdr *msg, size_t size);
 | 
				
			||||||
void tls_device_splice_eof(struct socket *sock);
 | 
					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);
 | 
					int tls_tx_records(struct sock *sk, int flags);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void tls_sw_write_space(struct sock *sk, struct tls_context *ctx);
 | 
					void tls_sw_write_space(struct sock *sk, struct tls_context *ctx);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -621,23 +621,6 @@ void tls_device_splice_eof(struct socket *sock)
 | 
				
			||||||
	mutex_unlock(&tls_ctx->tx_lock);
 | 
						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,
 | 
					struct tls_record_info *tls_get_record(struct tls_offload_context_tx *context,
 | 
				
			||||||
				       u32 seq, u64 *p_record_sn)
 | 
									       u32 seq, u64 *p_record_sn)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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] = ops[TLS_BASE][TLS_BASE];
 | 
				
			||||||
	ops[TLS_SW  ][TLS_BASE].splice_eof	= tls_sw_splice_eof;
 | 
						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  ] = ops[TLS_BASE][TLS_BASE];
 | 
				
			||||||
	ops[TLS_BASE][TLS_SW  ].splice_read	= tls_sw_splice_read;
 | 
						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
 | 
					#ifdef CONFIG_TLS_DEVICE
 | 
				
			||||||
	ops[TLS_HW  ][TLS_BASE] = ops[TLS_BASE][TLS_BASE];
 | 
						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  ] = 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_BASE][TLS_HW  ] = ops[TLS_BASE][TLS_SW  ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ops[TLS_SW  ][TLS_HW  ] = ops[TLS_SW  ][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  ] = ops[TLS_HW  ][TLS_SW  ];
 | 
				
			||||||
	ops[TLS_HW  ][TLS_HW  ].sendpage_locked	= NULL;
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#ifdef CONFIG_TLS_TOE
 | 
					#ifdef CONFIG_TLS_TOE
 | 
				
			||||||
	ops[TLS_HW_RECORD][TLS_HW_RECORD] = *base;
 | 
						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] = prot[TLS_BASE][TLS_BASE];
 | 
				
			||||||
	prot[TLS_SW][TLS_BASE].sendmsg		= tls_sw_sendmsg;
 | 
						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].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] = prot[TLS_BASE][TLS_BASE];
 | 
				
			||||||
	prot[TLS_BASE][TLS_SW].recvmsg		  = tls_sw_recvmsg;
 | 
						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] = prot[TLS_BASE][TLS_BASE];
 | 
				
			||||||
	prot[TLS_HW][TLS_BASE].sendmsg		= tls_device_sendmsg;
 | 
						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].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] = prot[TLS_BASE][TLS_SW];
 | 
				
			||||||
	prot[TLS_HW][TLS_SW].sendmsg		= tls_device_sendmsg;
 | 
						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].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];
 | 
						prot[TLS_BASE][TLS_HW] = prot[TLS_BASE][TLS_SW];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1281,41 +1281,6 @@ void tls_sw_splice_eof(struct socket *sock)
 | 
				
			||||||
	mutex_unlock(&tls_ctx->tx_lock);
 | 
						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
 | 
					static int
 | 
				
			||||||
tls_rx_rec_wait(struct sock *sk, struct sk_psock *psock, bool nonblock,
 | 
					tls_rx_rec_wait(struct sock *sk, struct sk_psock *psock, bool nonblock,
 | 
				
			||||||
		bool released)
 | 
							bool released)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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_shutdown(struct socket *, int);
 | 
				
			||||||
static int unix_stream_sendmsg(struct socket *, struct msghdr *, size_t);
 | 
					static int unix_stream_sendmsg(struct socket *, struct msghdr *, size_t);
 | 
				
			||||||
static int unix_stream_recvmsg(struct socket *, struct msghdr *, size_t, int);
 | 
					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,
 | 
					static ssize_t unix_stream_splice_read(struct socket *,  loff_t *ppos,
 | 
				
			||||||
				       struct pipe_inode_info *, size_t size,
 | 
									       struct pipe_inode_info *, size_t size,
 | 
				
			||||||
				       unsigned int flags);
 | 
									       unsigned int flags);
 | 
				
			||||||
| 
						 | 
					@ -852,7 +850,6 @@ static const struct proto_ops unix_stream_ops = {
 | 
				
			||||||
	.recvmsg =	unix_stream_recvmsg,
 | 
						.recvmsg =	unix_stream_recvmsg,
 | 
				
			||||||
	.read_skb =	unix_stream_read_skb,
 | 
						.read_skb =	unix_stream_read_skb,
 | 
				
			||||||
	.mmap =		sock_no_mmap,
 | 
						.mmap =		sock_no_mmap,
 | 
				
			||||||
	.sendpage =	unix_stream_sendpage,
 | 
					 | 
				
			||||||
	.splice_read =	unix_stream_splice_read,
 | 
						.splice_read =	unix_stream_splice_read,
 | 
				
			||||||
	.set_peek_off =	unix_set_peek_off,
 | 
						.set_peek_off =	unix_set_peek_off,
 | 
				
			||||||
	.show_fdinfo =	unix_show_fdinfo,
 | 
						.show_fdinfo =	unix_show_fdinfo,
 | 
				
			||||||
| 
						 | 
					@ -878,7 +875,6 @@ static const struct proto_ops unix_dgram_ops = {
 | 
				
			||||||
	.read_skb =	unix_read_skb,
 | 
						.read_skb =	unix_read_skb,
 | 
				
			||||||
	.recvmsg =	unix_dgram_recvmsg,
 | 
						.recvmsg =	unix_dgram_recvmsg,
 | 
				
			||||||
	.mmap =		sock_no_mmap,
 | 
						.mmap =		sock_no_mmap,
 | 
				
			||||||
	.sendpage =	sock_no_sendpage,
 | 
					 | 
				
			||||||
	.set_peek_off =	unix_set_peek_off,
 | 
						.set_peek_off =	unix_set_peek_off,
 | 
				
			||||||
	.show_fdinfo =	unix_show_fdinfo,
 | 
						.show_fdinfo =	unix_show_fdinfo,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -902,7 +898,6 @@ static const struct proto_ops unix_seqpacket_ops = {
 | 
				
			||||||
	.sendmsg =	unix_seqpacket_sendmsg,
 | 
						.sendmsg =	unix_seqpacket_sendmsg,
 | 
				
			||||||
	.recvmsg =	unix_seqpacket_recvmsg,
 | 
						.recvmsg =	unix_seqpacket_recvmsg,
 | 
				
			||||||
	.mmap =		sock_no_mmap,
 | 
						.mmap =		sock_no_mmap,
 | 
				
			||||||
	.sendpage =	sock_no_sendpage,
 | 
					 | 
				
			||||||
	.set_peek_off =	unix_set_peek_off,
 | 
						.set_peek_off =	unix_set_peek_off,
 | 
				
			||||||
	.show_fdinfo =	unix_show_fdinfo,
 | 
						.show_fdinfo =	unix_show_fdinfo,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -2294,20 +2289,6 @@ static int unix_stream_sendmsg(struct socket *sock, struct msghdr *msg,
 | 
				
			||||||
	return sent ? : 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,
 | 
					static int unix_seqpacket_sendmsg(struct socket *sock, struct msghdr *msg,
 | 
				
			||||||
				  size_t len)
 | 
									  size_t len)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1306,7 +1306,6 @@ static const struct proto_ops vsock_dgram_ops = {
 | 
				
			||||||
	.sendmsg = vsock_dgram_sendmsg,
 | 
						.sendmsg = vsock_dgram_sendmsg,
 | 
				
			||||||
	.recvmsg = vsock_dgram_recvmsg,
 | 
						.recvmsg = vsock_dgram_recvmsg,
 | 
				
			||||||
	.mmap = sock_no_mmap,
 | 
						.mmap = sock_no_mmap,
 | 
				
			||||||
	.sendpage = sock_no_sendpage,
 | 
					 | 
				
			||||||
	.read_skb = vsock_read_skb,
 | 
						.read_skb = vsock_read_skb,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2234,7 +2233,6 @@ static const struct proto_ops vsock_stream_ops = {
 | 
				
			||||||
	.sendmsg = vsock_connectible_sendmsg,
 | 
						.sendmsg = vsock_connectible_sendmsg,
 | 
				
			||||||
	.recvmsg = vsock_connectible_recvmsg,
 | 
						.recvmsg = vsock_connectible_recvmsg,
 | 
				
			||||||
	.mmap = sock_no_mmap,
 | 
						.mmap = sock_no_mmap,
 | 
				
			||||||
	.sendpage = sock_no_sendpage,
 | 
					 | 
				
			||||||
	.set_rcvlowat = vsock_set_rcvlowat,
 | 
						.set_rcvlowat = vsock_set_rcvlowat,
 | 
				
			||||||
	.read_skb = vsock_read_skb,
 | 
						.read_skb = vsock_read_skb,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -2257,7 +2255,6 @@ static const struct proto_ops vsock_seqpacket_ops = {
 | 
				
			||||||
	.sendmsg = vsock_connectible_sendmsg,
 | 
						.sendmsg = vsock_connectible_sendmsg,
 | 
				
			||||||
	.recvmsg = vsock_connectible_recvmsg,
 | 
						.recvmsg = vsock_connectible_recvmsg,
 | 
				
			||||||
	.mmap = sock_no_mmap,
 | 
						.mmap = sock_no_mmap,
 | 
				
			||||||
	.sendpage = sock_no_sendpage,
 | 
					 | 
				
			||||||
	.read_skb = vsock_read_skb,
 | 
						.read_skb = vsock_read_skb,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1757,7 +1757,6 @@ static const struct proto_ops x25_proto_ops = {
 | 
				
			||||||
	.sendmsg =	x25_sendmsg,
 | 
						.sendmsg =	x25_sendmsg,
 | 
				
			||||||
	.recvmsg =	x25_recvmsg,
 | 
						.recvmsg =	x25_recvmsg,
 | 
				
			||||||
	.mmap =		sock_no_mmap,
 | 
						.mmap =		sock_no_mmap,
 | 
				
			||||||
	.sendpage =	sock_no_sendpage,
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct packet_type x25_packet_type __read_mostly = {
 | 
					static struct packet_type x25_packet_type __read_mostly = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1389,7 +1389,6 @@ static const struct proto_ops xsk_proto_ops = {
 | 
				
			||||||
	.sendmsg	= xsk_sendmsg,
 | 
						.sendmsg	= xsk_sendmsg,
 | 
				
			||||||
	.recvmsg	= xsk_recvmsg,
 | 
						.recvmsg	= xsk_recvmsg,
 | 
				
			||||||
	.mmap		= xsk_mmap,
 | 
						.mmap		= xsk_mmap,
 | 
				
			||||||
	.sendpage	= sock_no_sendpage,
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void xsk_destruct(struct sock *sk)
 | 
					static void xsk_destruct(struct sock *sk)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue