[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH RFC 3/3] vhost_net: mergeable buffers support
From: |
Michael S. Tsirkin |
Subject: |
[Qemu-devel] [PATCH RFC 3/3] vhost_net: mergeable buffers support |
Date: |
Fri, 16 Jul 2010 12:04:47 +0300 |
User-agent: |
Mutt/1.5.20 (2009-12-10) |
use the new tap APIs to set header length
Signed-off-by: Michael S. Tsirkin <address@hidden>
---
hw/vhost_net.c | 23 ++++++++++++++++++++++-
1 files changed, 22 insertions(+), 1 deletions(-)
diff --git a/hw/vhost_net.c b/hw/vhost_net.c
index 606aa0c..1693090 100644
--- a/hw/vhost_net.c
+++ b/hw/vhost_net.c
@@ -51,7 +51,9 @@ unsigned vhost_net_get_features(struct vhost_net *net,
unsigned features)
if (!(net->dev.features & (1 << VIRTIO_RING_F_INDIRECT_DESC))) {
features &= ~(1 << VIRTIO_RING_F_INDIRECT_DESC);
}
- features &= ~(1 << VIRTIO_NET_F_MRG_RXBUF);
+ if (!(net->dev.features & (1 << VIRTIO_NET_F_MRG_RXBUF))) {
+ features &= ~(1 << VIRTIO_NET_F_MRG_RXBUF);
+ }
return features;
}
@@ -64,6 +66,9 @@ void vhost_net_ack_features(struct vhost_net *net, unsigned
features)
if (features & (1 << VIRTIO_RING_F_INDIRECT_DESC)) {
net->dev.acked_features |= (1 << VIRTIO_RING_F_INDIRECT_DESC);
}
+ if (features & (1 << VIRTIO_NET_F_MRG_RXBUF)) {
+ net->dev.acked_features |= (1 << VIRTIO_NET_F_MRG_RXBUF);
+ }
}
static int vhost_net_get_fd(VLANClientState *backend)
@@ -98,6 +103,10 @@ struct vhost_net *vhost_net_init(VLANClientState *backend,
int devfd)
if (r < 0) {
goto fail;
}
+ if (!tap_has_vnet_hdr_len(backend,
+ sizeof(struct virtio_net_hdr_mrg_rxbuf))) {
+ net->dev.features &= ~(1 << VIRTIO_NET_F_MRG_RXBUF);
+ }
if (~net->dev.features & net->dev.backend_features) {
fprintf(stderr, "vhost lacks feature mask %" PRIu64 " for backend\n",
(uint64_t)(~net->dev.features & net->dev.backend_features));
@@ -118,6 +127,9 @@ int vhost_net_start(struct vhost_net *net,
{
struct vhost_vring_file file = { };
int r;
+ if (net->dev.acked_features & VIRTIO_NET_F_MRG_RXBUF) {
+ tap_set_vnet_hdr_len(net->backend, sizeof(virtio_net_hdr_mrg_rxbuf));
+ }
net->dev.nvqs = 2;
net->dev.vqs = net->vqs;
@@ -145,6 +157,9 @@ fail:
}
net->vc->info->poll(net->vc, true);
vhost_dev_stop(&net->dev, dev);
+ if (net->dev.acked_features & VIRTIO_NET_F_MRG_RXBUF) {
+ tap_set_vnet_hdr_len(net->backend, sizeof(virtio_net_hdr));
+ }
return r;
}
@@ -159,11 +174,17 @@ void vhost_net_stop(struct vhost_net *net,
}
net->vc->info->poll(net->vc, true);
vhost_dev_stop(&net->dev, dev);
+ if (net->dev.acked_features & VIRTIO_NET_F_MRG_RXBUF) {
+ tap_set_vnet_hdr_len(net->backend, sizeof(virtio_net_hdr));
+ }
}
void vhost_net_cleanup(struct vhost_net *net)
{
vhost_dev_cleanup(&net->dev);
+ if (net->dev.acked_features & VIRTIO_NET_F_MRG_RXBUF) {
+ tap_set_vnet_hdr_len(net->backend, sizeof(virtio_net_hdr));
+ }
qemu_free(net);
}
#else
--
1.7.2.rc0.14.g41c1c