On Sat, Sep 23, 2017 at 08:31:37PM +0000, Jan Scheurich wrote: ... > +int rte_vhost_tx_interrupt_requested(int vid, uint16_t qid) > +{ > + struct virtio_net *dev; > + struct vhost_virtqueue *vq; > + > + dev = get_device(vid); > + if (dev == NULL) > + return 0; > + > + vq = dev->virtqueue[qid]; > + if (vq == NULL) > + return 0; > + > + if (unlikely(vq->enabled == 0 || vq->avail == NULL)) > + return 0; > + > + return !(vq->avail->flags & VRING_AVAIL_F_NO_INTERRUPT);
Two comments here: - as you see, the flags is stored at vq->avail, which is stored at the shared memory. That means, the virtio driver could change the value at any time. That said, this API should not be intended to be invoked once. Then you have to invoke it repeatedly, which might be a bit costy. - OTOH, you might want to try "rte_vhost_get_vhost_vring" API, which exposes the vq->avail, therefore, the interrupt flag is also exposed. --yliu