From mboxrd@z Thu Jan 1 00:00:00 1970 From: Al Viro Subject: Re: [RFC][PATCHSET] more iov_iter conversion in net/* Date: Sat, 31 Jan 2015 04:03:47 +0000 Message-ID: <20150131040347.GL29656@ZenIV.linux.org.uk> References: <20150131035513.GK29656@ZenIV.linux.org.uk> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: netdev@vger.kernel.org To: David Miller Return-path: Received: from zeniv.linux.org.uk ([195.92.253.2]:55030 "EHLO ZenIV.linux.org.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753388AbbAaEDs (ORCPT ); Fri, 30 Jan 2015 23:03:48 -0500 Content-Disposition: inline In-Reply-To: <20150131035513.GK29656@ZenIV.linux.org.uk> Sender: netdev-owner@vger.kernel.org List-ID: 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.