aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/vhost/net.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/vhost/net.c')
-rw-r--r--drivers/vhost/net.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c
index 59dad9fe52dd..9f57cd45fe8f 100644
--- a/drivers/vhost/net.c
+++ b/drivers/vhost/net.c
@@ -411,7 +411,7 @@ static void handle_rx_mergeable(struct vhost_net *net)
411 .hdr.gso_type = VIRTIO_NET_HDR_GSO_NONE 411 .hdr.gso_type = VIRTIO_NET_HDR_GSO_NONE
412 }; 412 };
413 size_t total_len = 0; 413 size_t total_len = 0;
414 int err, headcount; 414 int err, headcount, mergeable;
415 size_t vhost_hlen, sock_hlen; 415 size_t vhost_hlen, sock_hlen;
416 size_t vhost_len, sock_len; 416 size_t vhost_len, sock_len;
417 /* TODO: check that we are running from vhost_worker? */ 417 /* TODO: check that we are running from vhost_worker? */
@@ -427,6 +427,7 @@ static void handle_rx_mergeable(struct vhost_net *net)
427 427
428 vq_log = unlikely(vhost_has_feature(&net->dev, VHOST_F_LOG_ALL)) ? 428 vq_log = unlikely(vhost_has_feature(&net->dev, VHOST_F_LOG_ALL)) ?
429 vq->log : NULL; 429 vq->log : NULL;
430 mergeable = vhost_has_feature(&net->dev, VIRTIO_NET_F_MRG_RXBUF);
430 431
431 while ((sock_len = peek_head_len(sock->sk))) { 432 while ((sock_len = peek_head_len(sock->sk))) {
432 sock_len += sock_hlen; 433 sock_len += sock_hlen;
@@ -476,7 +477,7 @@ static void handle_rx_mergeable(struct vhost_net *net)
476 break; 477 break;
477 } 478 }
478 /* TODO: Should check and handle checksum. */ 479 /* TODO: Should check and handle checksum. */
479 if (vhost_has_feature(&net->dev, VIRTIO_NET_F_MRG_RXBUF) && 480 if (likely(mergeable) &&
480 memcpy_toiovecend(vq->hdr, (unsigned char *)&headcount, 481 memcpy_toiovecend(vq->hdr, (unsigned char *)&headcount,
481 offsetof(typeof(hdr), num_buffers), 482 offsetof(typeof(hdr), num_buffers),
482 sizeof hdr.num_buffers)) { 483 sizeof hdr.num_buffers)) {