Commit 5dae785a authored by Rusty Russell's avatar Rusty Russell

lguest: net block unneeded receive queue update notifications

Number of exits transmitting 10GB Guest->Host before:
	network xmit 7858610 recv 118136

After:
	network xmit 7750233 recv 1
Signed-off-by: default avatarRusty Russell <rusty@rustcorp.com.au>
parent b5111790
...@@ -933,6 +933,11 @@ static bool handle_tun_input(int fd, struct device *dev) ...@@ -933,6 +933,11 @@ static bool handle_tun_input(int fd, struct device *dev)
/* FIXME: Actually want DRIVER_ACTIVE here. */ /* FIXME: Actually want DRIVER_ACTIVE here. */
if (dev->desc->status & VIRTIO_CONFIG_S_DRIVER_OK) if (dev->desc->status & VIRTIO_CONFIG_S_DRIVER_OK)
warn("network: no dma buffer!"); warn("network: no dma buffer!");
/* Now tell it we want to know if new things appear. */
dev->vq->vring.used->flags &= ~VRING_USED_F_NO_NOTIFY;
wmb();
/* We'll turn this back on if input buffers are registered. */ /* We'll turn this back on if input buffers are registered. */
return false; return false;
} else if (out_num) } else if (out_num)
...@@ -969,6 +974,13 @@ static void enable_fd(int fd, struct virtqueue *vq) ...@@ -969,6 +974,13 @@ static void enable_fd(int fd, struct virtqueue *vq)
write(waker_fd, &vq->dev->fd, sizeof(vq->dev->fd)); write(waker_fd, &vq->dev->fd, sizeof(vq->dev->fd));
} }
static void net_enable_fd(int fd, struct virtqueue *vq)
{
/* We don't need to know again when Guest refills receive buffer. */
vq->vring.used->flags |= VRING_USED_F_NO_NOTIFY;
enable_fd(fd, vq);
}
/* When the Guest tells us they updated the status field, we handle it. */ /* When the Guest tells us they updated the status field, we handle it. */
static void update_device_status(struct device *dev) static void update_device_status(struct device *dev)
{ {
...@@ -1426,7 +1438,7 @@ static void setup_tun_net(char *arg) ...@@ -1426,7 +1438,7 @@ static void setup_tun_net(char *arg)
/* Network devices need a receive and a send queue, just like /* Network devices need a receive and a send queue, just like
* console. */ * console. */
add_virtqueue(dev, VIRTQUEUE_NUM, enable_fd); add_virtqueue(dev, VIRTQUEUE_NUM, net_enable_fd);
add_virtqueue(dev, VIRTQUEUE_NUM, handle_net_output); add_virtqueue(dev, VIRTQUEUE_NUM, handle_net_output);
/* We need a socket to perform the magic network ioctls to bring up the /* We need a socket to perform the magic network ioctls to bring up the
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment