Re: [PATCH RFC v5 net-next 2/6] virtio_ring: try to disable event index callbacks in virtqueue_disable_cb()
From: "Michael S. Tsirkin" <mst@redhat.com>
Date: 2015-02-10 10:24:23
Also in:
lkml, netdev
On Mon, Feb 09, 2015 at 03:39:21AM -0500, Jason Wang wrote:
Currently, we do nothing to prevent the callbacks in virtqueue_disable_cb() when event index is used. This may cause spurious interrupts which may damage the performance. This patch tries to publish avail event as the used even to prevent the callbacks. Signed-off-by: Jason Wang <jasowang@redhat.com>
I'm surprised that this ever happens though. Normally we call this after getting an interrupt, and interrupts won't trigger again until the rings wraps around. When I tested this, touching an extra cache line was more expensive. Does this really reduce number of interrupts? Could you pls share some numbers with and without this patch?
quoted hunk ↗ jump to hunk
--- drivers/virtio/virtio_ring.c | 2 ++ 1 file changed, 2 insertions(+)diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c index 545fed5..e9ffbfb 100644 --- a/drivers/virtio/virtio_ring.c +++ b/drivers/virtio/virtio_ring.c@@ -539,6 +539,8 @@ void virtqueue_disable_cb(struct virtqueue *_vq) struct vring_virtqueue *vq = to_vvq(_vq); vq->vring.avail->flags |= cpu_to_virtio16(_vq->vdev, VRING_AVAIL_F_NO_INTERRUPT); + vring_used_event(&vq->vring) = cpu_to_virtio16(_vq->vdev, + vq->vring.avail->idx);
Hmm in fact, can't this actually cause an extra interrupt when avail->idx is completed? I think that if you really can show disabling interrupts like this helps, you should set some invalid value like 0xfffff, or move it back to vq->vring.avail->idx - 1. No?
} EXPORT_SYMBOL_GPL(virtqueue_disable_cb); -- 1.8.3.1