aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/vhost
diff options
context:
space:
mode:
authorJason Wang <jasowang@redhat.com>2015-02-15 03:35:17 -0500
committerDavid S. Miller <davem@davemloft.net>2015-02-15 11:17:15 -0500
commit0960b6417e9ed8e4b4aa3c54e257324a9352f40b (patch)
tree57ed67565cc5723eedfb15bc30894f29069177af /drivers/vhost
parentca9f1fd263e14765a4c213e46940876ad78fce28 (diff)
vhost_net: fix wrong iter offset when setting number of buffers
In commit ba7438aed924 ("vhost: don't bother copying iovecs in handle_rx(), kill memcpy_toiovecend()"), we advance iov iter fixup sizeof(struct virtio_net_hdr) bytes and fill the number of buffers after doing the socket recvmsg(). This work well but was broken after commit 6e03f896b52c ("Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net") which tries to advance sizeof(struct virtio_net_hdr_mrg_rxbuf). It will fill the number of buffers at the wrong place. This patch fixes this. Fixes 6e03f896b52c ("Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net") Cc: David S. Miller <davem@davemloft.net> Cc: Al Viro <viro@zeniv.linux.org.uk> Cc: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Jason Wang <jasowang@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/vhost')
-rw-r--r--drivers/vhost/net.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c
index 8dccca9013ed..afa06d28725d 100644
--- a/drivers/vhost/net.c
+++ b/drivers/vhost/net.c
@@ -528,9 +528,9 @@ static void handle_rx(struct vhost_net *net)
528 .msg_controllen = 0, 528 .msg_controllen = 0,
529 .msg_flags = MSG_DONTWAIT, 529 .msg_flags = MSG_DONTWAIT,
530 }; 530 };
531 struct virtio_net_hdr_mrg_rxbuf hdr = { 531 struct virtio_net_hdr hdr = {
532 .hdr.flags = 0, 532 .flags = 0,
533 .hdr.gso_type = VIRTIO_NET_HDR_GSO_NONE 533 .gso_type = VIRTIO_NET_HDR_GSO_NONE
534 }; 534 };
535 size_t total_len = 0; 535 size_t total_len = 0;
536 int err, mergeable; 536 int err, mergeable;
@@ -539,6 +539,7 @@ static void handle_rx(struct vhost_net *net)
539 size_t vhost_len, sock_len; 539 size_t vhost_len, sock_len;
540 struct socket *sock; 540 struct socket *sock;
541 struct iov_iter fixup; 541 struct iov_iter fixup;
542 __virtio16 num_buffers;
542 543
543 mutex_lock(&vq->mutex); 544 mutex_lock(&vq->mutex);
544 sock = vq->private_data; 545 sock = vq->private_data;
@@ -616,9 +617,9 @@ static void handle_rx(struct vhost_net *net)
616 } 617 }
617 /* TODO: Should check and handle checksum. */ 618 /* TODO: Should check and handle checksum. */
618 619
619 hdr.num_buffers = cpu_to_vhost16(vq, headcount); 620 num_buffers = cpu_to_vhost16(vq, headcount);
620 if (likely(mergeable) && 621 if (likely(mergeable) &&
621 copy_to_iter(&hdr.num_buffers, 2, &fixup) != 2) { 622 copy_to_iter(&num_buffers, 2, &fixup) != 2) {
622 vq_err(vq, "Failed num_buffers write"); 623 vq_err(vq, "Failed num_buffers write");
623 vhost_discard_vq_desc(vq, headcount); 624 vhost_discard_vq_desc(vq, headcount);
624 break; 625 break;