Subject: Re: [RFC][PATCHSET] more iov_iter conversion in net/*

From: Al Viro <[email-masked]>
Date: Sat, 31 Jan 2015 04:03:47 +0000

On Sat, Jan 31, 2015 at 03:55:13AM +0000, Al Viro wrote:
> 	->sendmsg() side of that business, now.  By the end of it, we
> get all ->sendmsg() instances leaving iovec unchanged and ->msg_iter -
> drained.
> 
> 1/18:	netlink: make the check for "send from tx_ring" deterministic
> 	As discussed last year.
> 2/18:	raw_send_hdrinc(): pass msghdr
> 	Switch from passing msg->iov_iter.iov to passing msg itself
> 3/18:	rawv6_send_hdrinc(): pass msghdr
> 	Ditto
> 4/18:	propagate msghdr all way down to __qp_memcpy_to_queue()
> 	Ditto
> 5/18:	switch rxrpc_send_data() to iov_iter primitives
> 	Convert skb_add_data() to iov_iter; allows to get rid of the explicit
> messing with iovec in its only caller - skb_add_data() will keep advancing
> ->msg_iter for us, so there's no need to similate that manually.
> 6/18:	make the users of rxrpc_kernel_send_data() set kvec-backed msg_iter
> properly
> 	Use iov_iter_kvec() there, get rid of set_fs() games - now that
> rxrpc_send_data() uses iov_iter primitives, it'll handle ITER_KVEC just
> fine.	
> 7/18:	stash a pointer to msghdr in struct ping_fakehdr
> 	... instead of storing its ->mgs_iter.iov there
> 8/18:	convert tcp_sendmsg() to iov_iter primitives
> 	There's one potentially subtle change here: in case of short
> copy from userland, mainline tcp_send_syn_data() discards the skb it
> has allocated and falls back to normal path, where we'll send as much
> as possible after rereading the same data again.  This patch trims
> SYN+data skb instead - that way we don't need to copy from the same
> place twice.  I _think_ it's correct, but I'd really appreciate a review
> of that one.
> 9/18:	switch memcpy_fromiovec()/memcpy_fromiovecend() users to
> copy_from_iter()
> 	That takes care of the majority of ->sendmsg() instances.
> 10/18:	tipc ->sendmsg() conversion
> 	This one needs to copy the same data from user potentially more than
> once.  Sadly, MTU changes can trigger that ;-/
> 11/18:	bury net/core/iovec.c - nothing in there is used anymore
> 12/18:	switch af_alg_make_sg() to iov_iter
> 	With that, all ->sendmsg() instances are converted to iov_iter
> primitives and are agnostic wrt the kind of iov_iter they are working with.
> So's the last remaining ->recvmsg() instance that wasn't kind-agnostic yet.
> All ->sendmsg() and ->recvmsg() advance ->msg_iter by the amount actually
> copied and none of them modifies the underlying iovec, etc.
> 13/18:	net/socket.c: fold do_sock_{read,write} into callers
> 14/18:	switch sockets to ->read_iter/->write_iter
> 15/18:	switch vhost get_indirect() to iov_iter, kill memcpy_fromiovec()
> 16/18:	vhost: don't bother with copying iovec in handle_tx()
> 17/18:	vhost: don't bother copying iovecs in handle_rx(), kill
> memcpy_toiovecend()
> 18/18:	vhost: vhost_scsi_handle_vq() should just use copy_from_user()
> 	... and with that lib/iovec.c is gone - nothing in there has callers
> left.
> 
> 	The pile after that one will be dealing with the kernel_sendmsg and
> kernel_recvmg callers - at that point we can start reaping benefits of
> consistent way ->msg_iter is handled.  Note that after these changes if
> iov_iter_kvec() is used to initialize ->msg_iter, we don't need the games
> with get_fs()/set_fs() anymore; just sock_sendmsg()/sock_recvmsg() will do,
> so quite a few of those kernel_{send,recv}msg() callers will turn into
> sock_{send,recv}msg() ones.

FWIW, for those who prefer to review stuff in git, this pile is in
git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs.git for-davem, and
diffstat is

 crypto/af_alg.c                         |  40 ++----
 crypto/algif_hash.c                     |  45 +++---
 crypto/algif_skcipher.c                 |  74 +++++-----
 drivers/misc/vmw_vmci/vmci_queue_pair.c |  16 +--
 drivers/vhost/net.c                     |  88 ++++--------
 drivers/vhost/scsi.c                    |   2 +-
 drivers/vhost/vhost.c                   |   6 +-
 fs/afs/rxrpc.c                          |  14 +-
 include/crypto/if_alg.h                 |   3 +-
 include/linux/skbuff.h                  |  14 +-
 include/linux/socket.h                  |   7 -
 include/linux/uio.h                     |   6 -
 include/linux/vmw_vmci_api.h            |   2 +-
 include/net/ping.h                      |   2 +-
 include/net/sock.h                      |  18 ++-
 include/net/udplite.h                   |   3 +-
 lib/Makefile                            |   2 +-
 lib/iovec.c                             |  87 ------------
 net/core/Makefile                       |   2 +-
 net/core/iovec.c                        | 137 -------------------
 net/ipv4/ip_output.c                    |   6 +-
 net/ipv4/ping.c                         |  17 ++-
 net/ipv4/raw.c                          |   7 +-
 net/ipv4/tcp.c                          | 233 +++++++++++++++-----------------
 net/ipv4/tcp_output.c                   |  11 +-
 net/ipv6/ping.c                         |   3 +-
 net/ipv6/raw.c                          |   7 +-
 net/netlink/af_netlink.c                |   4 +
 net/rxrpc/ar-output.c                   |  46 ++-----
 net/socket.c                            |  76 ++++-------
 net/tipc/msg.c                          |   7 +-
 net/tipc/socket.c                       |  14 +-
 net/vmw_vsock/vmci_transport.c          |   3 +-
 33 files changed, 316 insertions(+), 686 deletions(-)

Please, review.