Index: sys/dev/virtio/virtqueue.h =================================================================== --- sys/dev/virtio/virtqueue.h +++ sys/dev/virtio/virtqueue.h @@ -92,7 +92,9 @@ int virtqueue_size(struct virtqueue *vq); int virtqueue_nfree(struct virtqueue *vq); int virtqueue_nused(struct virtqueue *vq); -void virtqueue_notify(struct virtqueue *vq); +bool vq_ring_must_notify_host(struct virtqueue *vq); +bool vq_ring_notify_host(struct virtqueue *vq); +bool virtqueue_notify(struct virtqueue *vq); void virtqueue_dump(struct virtqueue *vq); int virtqueue_enqueue(struct virtqueue *vq, void *cookie, Index: sys/dev/virtio/virtqueue.c =================================================================== --- sys/dev/virtio/virtqueue.c +++ sys/dev/virtio/virtqueue.c @@ -134,8 +134,6 @@ static void vq_ring_enqueue_indirect(struct virtqueue *, void *, struct sglist *, int, int); static int vq_ring_enable_interrupt(struct virtqueue *, uint16_t); -static int vq_ring_must_notify_host(struct virtqueue *); -static void vq_ring_notify_host(struct virtqueue *); static void vq_ring_free_chain(struct virtqueue *, uint16_t); SDT_PROVIDER_DEFINE(virtqueue); @@ -434,7 +432,7 @@ return (vq->vq_free_cnt == 0); } -void +bool virtqueue_notify(struct virtqueue *vq) { @@ -444,6 +442,8 @@ if (vq_ring_must_notify_host(vq)) vq_ring_notify_host(vq); vq->vq_queued_cnt = 0; + /* Unlike the Linux API, we currently never report failure. */ + return true; } int @@ -820,7 +820,7 @@ return (0); } -static int +bool vq_ring_must_notify_host(struct virtqueue *vq) { uint16_t new_idx, prev_idx, event_idx, flags; @@ -837,12 +837,13 @@ return ((flags & vq_gtoh16(vq, VRING_USED_F_NO_NOTIFY)) == 0); } -static void +bool vq_ring_notify_host(struct virtqueue *vq) { - + /* TODO: return success/failure */ VIRTIO_BUS_NOTIFY_VQ(vq->vq_dev, vq->vq_queue_index, vq->vq_notify_offset); + return true; } static void