Al Viro
2015-Feb-04  06:40 UTC
[PATCH v3 16/18] vhost: don't bother with copying iovec in handle_tx()
From: Al Viro <viro at zeniv.linux.org.uk>
just advance the msg.msg_iter and be done with that.
Cc: Michael S. Tsirkin <mst at redhat.com>
Cc: kvm at vger.kernel.org
Cc: virtualization at lists.linux-foundation.org
Signed-off-by: Al Viro <viro at zeniv.linux.org.uk>
---
 drivers/vhost/net.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c
index 6906f76..d86cc9b 100644
--- a/drivers/vhost/net.c
+++ b/drivers/vhost/net.c
@@ -336,7 +336,7 @@ static void handle_tx(struct vhost_net *net)
 {
 	struct vhost_net_virtqueue *nvq = &net->vqs[VHOST_NET_VQ_TX];
 	struct vhost_virtqueue *vq = &nvq->vq;
-	unsigned out, in, s;
+	unsigned out, in;
 	int head;
 	struct msghdr msg = {
 		.msg_name = NULL,
@@ -395,16 +395,17 @@ static void handle_tx(struct vhost_net *net)
 			break;
 		}
 		/* Skip header. TODO: support TSO. */
-		s = move_iovec_hdr(vq->iov, nvq->hdr, hdr_size, out);
 		len = iov_length(vq->iov, out);
 		iov_iter_init(&msg.msg_iter, WRITE, vq->iov, out, len);
+		iov_iter_advance(&msg.msg_iter, hdr_size);
 		/* Sanity check */
-		if (!len) {
+		if (!iov_iter_count(&msg.msg_iter)) {
 			vq_err(vq, "Unexpected header len for TX: "
 			       "%zd expected %zd\n",
-			       iov_length(nvq->hdr, s), hdr_size);
+			       len, hdr_size);
 			break;
 		}
+		len = iov_iter_count(&msg.msg_iter);
 
 		zcopy_used = zcopy && len >= VHOST_GOODCOPY_LEN
 				   && (nvq->upend_idx + 1) % UIO_MAXIOV !-- 
2.1.4
Michael S. Tsirkin
2015-Feb-04  09:13 UTC
[PATCH v3 16/18] vhost: don't bother with copying iovec in handle_tx()
On Wed, Feb 04, 2015 at 06:40:07AM +0000, Al Viro wrote:> From: Al Viro <viro at zeniv.linux.org.uk> > > just advance the msg.msg_iter and be done with that. > > Cc: Michael S. Tsirkin <mst at redhat.com> > Cc: kvm at vger.kernel.org > Cc: virtualization at lists.linux-foundation.org > Signed-off-by: Al Viro <viro at zeniv.linux.org.uk>Acked-by: Michael S. Tsirkin <mst at redhat.com>> --- > drivers/vhost/net.c | 9 +++++---- > 1 file changed, 5 insertions(+), 4 deletions(-) > > diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c > index 6906f76..d86cc9b 100644 > --- a/drivers/vhost/net.c > +++ b/drivers/vhost/net.c > @@ -336,7 +336,7 @@ static void handle_tx(struct vhost_net *net) > { > struct vhost_net_virtqueue *nvq = &net->vqs[VHOST_NET_VQ_TX]; > struct vhost_virtqueue *vq = &nvq->vq; > - unsigned out, in, s; > + unsigned out, in; > int head; > struct msghdr msg = { > .msg_name = NULL, > @@ -395,16 +395,17 @@ static void handle_tx(struct vhost_net *net) > break; > } > /* Skip header. TODO: support TSO. */ > - s = move_iovec_hdr(vq->iov, nvq->hdr, hdr_size, out); > len = iov_length(vq->iov, out); > iov_iter_init(&msg.msg_iter, WRITE, vq->iov, out, len); > + iov_iter_advance(&msg.msg_iter, hdr_size); > /* Sanity check */ > - if (!len) { > + if (!iov_iter_count(&msg.msg_iter)) { > vq_err(vq, "Unexpected header len for TX: " > "%zd expected %zd\n", > - iov_length(nvq->hdr, s), hdr_size); > + len, hdr_size); > break; > } > + len = iov_iter_count(&msg.msg_iter); > > zcopy_used = zcopy && len >= VHOST_GOODCOPY_LEN > && (nvq->upend_idx + 1) % UIO_MAXIOV !> -- > 2.1.4
Reasonably Related Threads
- [PATCH v3 16/18] vhost: don't bother with copying iovec in handle_tx()
- [PATCH v3 17/18] vhost: don't bother copying iovecs in handle_rx(), kill memcpy_toiovecend()
- [PATCH v3 17/18] vhost: don't bother copying iovecs in handle_rx(), kill memcpy_toiovecend()
- [RFC PATCH net-next 01/12] vhost_net: introduce helper to initialize tx iov iter
- [PATCH v3 15/18] vhost: switch vhost get_indirect() to iov_iter, kill memcpy_fromiovec()