virtio: remove overzealous BUG_ON.
PATCH 1/1 virtio: remove overzealous BUG_ON.
The 'disable_cb' callback is designed as an optimization to tell the host we don't need callbacks now. As it is not reliable, the debug check is
overzealous: it can happen on two CPUs at the same time. Document this.
Even if it were reliable, the virtio_net driver doesn't disable callbacks on transmit so the START_USE/END_USE debugging reentrance protection can be easily tripped even on UP.
Thanks to Balaji Rao for the bug report and testing.
Signed-off-by Rusty Russell <[email protected]>
CC Balaji Rao <[email protected]>
drivers/virtio/virtio_ring.c +0 -3
@@ -214,10 +215,7 @@ static void vring_disable_cb(struct virt {struct vring_virtqueue *vq =to_vvq (_vq); -START_USE (vq); -BUG_ON (vq->vring.avail->flags &VRING_AVAIL_F_NO_INTERRUPT ); vq->vring.avail->flags |=VRING_AVAIL_F_NO_INTERRUPT ; -END_USE (vq); }static bool vring_enable_cb (struct virtqueue *_vq)
include/linux/virtio.h +4 -1
@@ -41,6 +41,8 @@ struct virtqueue* Returns NULL or the "data" token handed to add_buf. * @disable_cb: disable callbacks * vq: the struct virtqueue we're talking about. +* Note that this is not necessarily synchronous, hence unreliable and only +* useful as an optimization. * @enable_cb: restart callbacks after disable_cb. * vq: the struct virtqueue we're talking about. * This re-enables callbacks; it returns "false" if there are pending
@@ -48,7 +50,8 @@ struct virtqueue* checking for more work, and enabling callbacks. * * Locking rules are straightforward: the driver is responsible for -* locking. No two operations may be invoked simultaneously. +* locking. No two operations may be invoked simultaneously, with the exception +* of @disable_cb. * * All operations can be called in any context. */