summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael S. Tsirkin <mst@redhat.com>2015-02-03 11:07:06 +0200
committerDavid S. Miller <davem@davemloft.net>2015-02-04 13:59:31 -0800
commit5201aa49b0fc12d9bf911090744ca04066bad4a7 (patch)
treea7fab4ac90b4f820531e639a390998255b4fb2b1
parent75300ad2d91fac50852dc4123977d55e64c874cc (diff)
downloadlinux-5201aa49b0fc12d9bf911090744ca04066bad4a7.tar.gz
linux-5201aa49b0fc12d9bf911090744ca04066bad4a7.tar.bz2
linux-5201aa49b0fc12d9bf911090744ca04066bad4a7.zip
vhost/net: fix up num_buffers endian-ness
In virtio 1.0 mode, when mergeable buffers are enabled on a big-endian host, num_buffers wasn't byte-swapped correctly, so large incoming packets got corrupted. To fix, fill it in within hdr - this also makes sure it gets the correct type. Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/vhost/net.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c
index d415d69dc237..9484d5652ca5 100644
--- a/drivers/vhost/net.c
+++ b/drivers/vhost/net.c
@@ -650,8 +650,10 @@ static void handle_rx(struct vhost_net *net)
break;
}
/* TODO: Should check and handle checksum. */
+
+ hdr.num_buffers = cpu_to_vhost16(vq, headcount);
if (likely(mergeable) &&
- memcpy_toiovecend(nvq->hdr, (unsigned char *)&headcount,
+ memcpy_toiovecend(nvq->hdr, (void *)&hdr.num_buffers,
offsetof(typeof(hdr), num_buffers),
sizeof hdr.num_buffers)) {
vq_err(vq, "Failed num_buffers write");