From: Al Viro <viro@ZenIV.linux.org.uk>
To: David Miller <davem@davemloft.net>
Cc: netdev@vger.kernel.org
Subject: [PATCH v3 05/18] rxrpc: switch rxrpc_send_data() to iov_iter primitives
Date: Wed, 4 Feb 2015 06:39:56 +0000 [thread overview]
Message-ID: <1423032009-18367-5-git-send-email-viro@ZenIV.linux.org.uk> (raw)
In-Reply-To: <20150204063730.GG29656@ZenIV.linux.org.uk>
From: Al Viro <viro@zeniv.linux.org.uk>
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.
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
---
include/linux/skbuff.h | 11 +++++------
net/rxrpc/ar-output.c | 43 ++++++++++---------------------------------
2 files changed, 15 insertions(+), 39 deletions(-)
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index 85ab7d7..9a8bafe 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -2484,19 +2484,18 @@ static inline int skb_put_padto(struct sk_buff *skb, unsigned int len)
}
static inline int skb_add_data(struct sk_buff *skb,
- char __user *from, int copy)
+ struct iov_iter *from, int copy)
{
const int off = skb->len;
if (skb->ip_summed == CHECKSUM_NONE) {
- int err = 0;
- __wsum csum = csum_and_copy_from_user(from, skb_put(skb, copy),
- copy, 0, &err);
- if (!err) {
+ __wsum csum = 0;
+ if (csum_and_copy_from_iter(skb_put(skb, copy), copy,
+ &csum, from) == copy) {
skb->csum = csum_block_add(skb->csum, csum, off);
return 0;
}
- } else if (!copy_from_user(skb_put(skb, copy), from, copy))
+ } else if (copy_from_iter(skb_put(skb, copy), copy, from) == copy)
return 0;
__skb_trim(skb, off);
diff --git a/net/rxrpc/ar-output.c b/net/rxrpc/ar-output.c
index e1a9373..963a5b9 100644
--- a/net/rxrpc/ar-output.c
+++ b/net/rxrpc/ar-output.c
@@ -529,13 +529,11 @@ static int rxrpc_send_data(struct kiocb *iocb,
struct msghdr *msg, size_t len)
{
struct rxrpc_skb_priv *sp;
- unsigned char __user *from;
struct sk_buff *skb;
- const struct iovec *iov;
struct sock *sk = &rx->sk;
long timeo;
bool more;
- int ret, ioc, segment, copied;
+ int ret, copied;
timeo = sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT);
@@ -545,25 +543,17 @@ static int rxrpc_send_data(struct kiocb *iocb,
if (sk->sk_err || (sk->sk_shutdown & SEND_SHUTDOWN))
return -EPIPE;
- iov = msg->msg_iter.iov;
- ioc = msg->msg_iter.nr_segs - 1;
- from = iov->iov_base;
- segment = iov->iov_len;
- iov++;
more = msg->msg_flags & MSG_MORE;
skb = call->tx_pending;
call->tx_pending = NULL;
copied = 0;
- do {
+ if (len > iov_iter_count(&msg->msg_iter))
+ len = iov_iter_count(&msg->msg_iter);
+ while (len) {
int copy;
- if (segment > len)
- segment = len;
-
- _debug("SEGMENT %d @%p", segment, from);
-
if (!skb) {
size_t size, chunk, max, space;
@@ -631,13 +621,13 @@ static int rxrpc_send_data(struct kiocb *iocb,
/* append next segment of data to the current buffer */
copy = skb_tailroom(skb);
ASSERTCMP(copy, >, 0);
- if (copy > segment)
- copy = segment;
+ if (copy > len)
+ copy = len;
if (copy > sp->remain)
copy = sp->remain;
_debug("add");
- ret = skb_add_data(skb, from, copy);
+ ret = skb_add_data(skb, &msg->msg_iter, copy);
_debug("added");
if (ret < 0)
goto efault;
@@ -646,18 +636,6 @@ static int rxrpc_send_data(struct kiocb *iocb,
copied += copy;
len -= copy;
- segment -= copy;
- from += copy;
- while (segment == 0 && ioc > 0) {
- from = iov->iov_base;
- segment = iov->iov_len;
- iov++;
- ioc--;
- }
- if (len == 0) {
- segment = 0;
- ioc = 0;
- }
/* check for the far side aborting the call or a network error
* occurring */
@@ -665,7 +643,7 @@ static int rxrpc_send_data(struct kiocb *iocb,
goto call_aborted;
/* add the packet to the send queue if it's now full */
- if (sp->remain <= 0 || (segment == 0 && !more)) {
+ if (sp->remain <= 0 || (!len && !more)) {
struct rxrpc_connection *conn = call->conn;
uint32_t seq;
size_t pad;
@@ -711,11 +689,10 @@ static int rxrpc_send_data(struct kiocb *iocb,
memcpy(skb->head, &sp->hdr,
sizeof(struct rxrpc_header));
- rxrpc_queue_packet(call, skb, segment == 0 && !more);
+ rxrpc_queue_packet(call, skb, !iov_iter_count(&msg->msg_iter) && !more);
skb = NULL;
}
-
- } while (segment > 0);
+ }
success:
ret = copied;
--
2.1.4
next prev parent reply other threads:[~2015-02-04 6:40 UTC|newest]
Thread overview: 80+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-01-31 3:55 [RFC][PATCHSET] more iov_iter conversion in net/* Al Viro
2015-01-31 3:56 ` [PATCH 01/18] netlink: make the check for "send from tx_ring" deterministic Al Viro
2015-01-31 3:56 ` [PATCH 02/18] raw_send_hdrinc(): pass msghdr Al Viro
2015-01-31 3:56 ` [PATCH 03/18] rawv6_send_hdrinc(): " Al Viro
2015-01-31 3:56 ` [PATCH 04/18] propagate msghdr all way down to __qp_memcpy_to_queue() Al Viro
2015-01-31 3:56 ` [PATCH 05/18] switch rxrpc_send_data() to iov_iter primitives Al Viro
2015-01-31 3:56 ` [PATCH 06/18] make the users of rxrpc_kernel_send_data() set kvec-backed msg_iter properly Al Viro
2015-01-31 3:56 ` [PATCH 07/18] stash a pointer to msghdr in struct ping_fakehdr Al Viro
2015-01-31 3:56 ` [PATCH 08/18] convert tcp_sendmsg() to iov_iter primitives Al Viro
2015-01-31 3:56 ` [PATCH 09/18] switch memcpy_fromiovec()/memcpy_fromiovecend() users to copy_from_iter() Al Viro
2015-01-31 3:56 ` [PATCH 10/18] tipc ->sendmsg() conversion Al Viro
2015-01-31 3:56 ` [PATCH 11/18] bury net/core/iovec.c - nothing in there is used anymore Al Viro
2015-01-31 3:56 ` [PATCH 12/18] switch af_alg_make_sg() to iov_iter Al Viro
2015-01-31 3:56 ` [PATCH 13/18] net/socket.c: fold do_sock_{read,write} into callers Al Viro
2015-01-31 3:56 ` [PATCH 14/18] switch sockets to ->read_iter/->write_iter Al Viro
2015-01-31 3:56 ` [PATCH 15/18] switch vhost get_indirect() to iov_iter, kill memcpy_fromiovec() Al Viro
2015-01-31 3:56 ` [PATCH 16/18] vhost: don't bother with copying iovec in handle_tx() Al Viro
2015-01-31 3:56 ` [PATCH 17/18] vhost: don't bother copying iovecs in handle_rx(), kill memcpy_toiovecend() Al Viro
2015-01-31 3:56 ` [PATCH 18/18] vhost: vhost_scsi_handle_vq() should just use copy_from_user() Al Viro
2015-01-31 4:03 ` [RFC][PATCHSET] more iov_iter conversion in net/* Al Viro
2015-02-02 6:26 ` David Miller
2015-02-02 6:53 ` Al Viro
2015-02-02 7:05 ` David Miller
2015-02-02 8:01 ` Al Viro
2015-02-02 7:59 ` [PATCH v2 01/18] netlink: make the check for "send from tx_ring" deterministic Al Viro
2015-02-02 13:14 ` Sergei Shtylyov
2015-02-04 0:21 ` David Miller
2015-02-04 6:37 ` Al Viro
2015-02-04 6:39 ` [PATCH v3 " Al Viro
2015-02-04 6:39 ` [PATCH v3 02/18] ipv4: raw_send_hdrinc(): pass msghdr Al Viro
2015-02-04 6:39 ` [PATCH v3 03/18] ipv6: rawv6_send_hdrinc(): " Al Viro
2015-02-04 6:39 ` [PATCH v3 04/18] vmci: propagate msghdr all way down to __qp_memcpy_to_queue() Al Viro
2015-02-04 6:39 ` Al Viro [this message]
2015-02-04 6:39 ` [PATCH v3 06/18] rxrpc: make the users of rxrpc_kernel_send_data() set kvec-backed msg_iter properly Al Viro
2015-02-04 6:39 ` [PATCH v3 07/18] ip: stash a pointer to msghdr in struct ping_fakehdr Al Viro
2015-02-04 6:39 ` [PATCH v3 08/18] ip: convert tcp_sendmsg() to iov_iter primitives Al Viro
2015-02-04 6:40 ` [PATCH v3 09/18] net: switch memcpy_fromiovec()/memcpy_fromiovecend() users to copy_from_iter() Al Viro
2015-02-04 6:40 ` [PATCH v3 10/18] tipc: tipc ->sendmsg() conversion Al Viro
2015-02-04 6:40 ` [PATCH v3 11/18] net: bury net/core/iovec.c - nothing in there is used anymore Al Viro
2015-02-04 6:40 ` [PATCH v3 12/18] crypto: switch af_alg_make_sg() to iov_iter Al Viro
2015-02-09 13:33 ` Stephan Mueller
2015-02-09 17:28 ` Al Viro
2015-02-09 13:59 ` Stephan Mueller
2015-02-09 17:30 ` Al Viro
2015-02-04 6:40 ` [PATCH v3 13/18] net/socket.c: fold do_sock_{read,write} into callers Al Viro
2015-02-04 6:40 ` [PATCH v3 14/18] net: switch sockets to ->read_iter/->write_iter Al Viro
2015-02-04 6:40 ` [PATCH v3 15/18] vhost: switch vhost get_indirect() to iov_iter, kill memcpy_fromiovec() Al Viro
2015-02-04 8:52 ` Michael S. Tsirkin
2015-02-04 6:40 ` [PATCH v3 16/18] vhost: don't bother with copying iovec in handle_tx() Al Viro
2015-02-04 9:13 ` Michael S. Tsirkin
2015-02-04 6:40 ` [PATCH v3 17/18] vhost: don't bother copying iovecs in handle_rx(), kill memcpy_toiovecend() Al Viro
2015-02-04 8:52 ` Michael S. Tsirkin
2015-02-04 9:02 ` Michael S. Tsirkin
2015-02-04 6:40 ` [PATCH v3 18/18] vhost: vhost_scsi_handle_vq() should just use copy_from_user() Al Viro
2015-02-04 9:05 ` Michael S. Tsirkin
2015-02-02 7:59 ` [PATCH v2 02/18] ipv4: raw_send_hdrinc(): pass msghdr Al Viro
2015-02-02 7:59 ` [PATCH v2 03/18] ipv6: rawv6_send_hdrinc(): " Al Viro
2015-02-02 7:59 ` [PATCH v2 04/18] vmci: propagate msghdr all way down to __qp_memcpy_to_queue() Al Viro
2015-02-02 7:59 ` [PATCH v2 05/18] rxrpc: switch rxrpc_send_data() to iov_iter primitives Al Viro
2015-02-02 7:59 ` [PATCH v2 06/18] rxrpc: make the users of rxrpc_kernel_send_data() set kvec-backed msg_iter properly Al Viro
2015-02-02 7:59 ` [PATCH v2 07/18] ip: stash a pointer to msghdr in struct ping_fakehdr Al Viro
2015-02-02 7:59 ` [PATCH v2 08/18] ip: convert tcp_sendmsg() to iov_iter primitives Al Viro
2015-02-02 7:59 ` [PATCH v2 09/18] net: switch memcpy_fromiovec()/memcpy_fromiovecend() users to copy_from_iter() Al Viro
2015-02-02 7:59 ` [PATCH v2 10/18] tipc: tipc ->sendmsg() conversion Al Viro
2015-02-02 7:59 ` [PATCH v2 11/18] net: bury net/core/iovec.c - nothing in there is used anymore Al Viro
2015-02-02 7:59 ` [PATCH v2 12/18] crypto: switch af_alg_make_sg() to iov_iter Al Viro
2015-02-02 7:59 ` [PATCH v2 13/18] net/socket.c: fold do_sock_{read,write} into callers Al Viro
2015-02-02 7:59 ` [PATCH v2 14/18] net: switch sockets to ->read_iter/->write_iter Al Viro
2015-02-02 7:59 ` [PATCH v2 15/18] vhost: switch vhost get_indirect() to iov_iter, kill memcpy_fromiovec() Al Viro
2015-02-03 9:01 ` Michael S. Tsirkin
2015-02-02 7:59 ` [PATCH v2 16/18] vhost: don't bother with copying iovec in handle_tx() Al Viro
2015-02-03 9:14 ` Michael S. Tsirkin
2015-02-02 7:59 ` [PATCH v2 17/18] vhost: don't bother copying iovecs in handle_rx(), kill memcpy_toiovecend() Al Viro
2015-02-03 9:13 ` Michael S. Tsirkin
2015-02-03 10:04 ` Michael S. Tsirkin
2015-02-03 15:21 ` Michael S. Tsirkin
2015-02-03 22:13 ` Al Viro
2015-02-02 7:59 ` [PATCH v2 18/18] vhost: vhost_scsi_handle_vq() should just use copy_from_user() Al Viro
2015-02-03 0:42 ` Nicholas A. Bellinger
2015-02-03 9:05 ` Michael S. Tsirkin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1423032009-18367-5-git-send-email-viro@ZenIV.linux.org.uk \
--to=viro@zeniv.linux.org.uk \
--cc=davem@davemloft.net \
--cc=netdev@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).