Rusty Russell wrote:
These helper routines supply most of the virtqueue_ops for hypervisors which want to use a ring for virtio. Unlike the previous lguest implementation: 1) The rings are variable sized (2^n-1 elements). 2) They have an unfortunate limit of 65535 bytes per sg element. 3) The page numbers are always 64 bit (PAE anyone?) 4) They no longer place used[] on a separate page, just a separate cacheline. 5) We do a modulo on a variable. We could be tricky if we cared. 6) Interrupts and notifies are suppressed using flags within the rings. Users need only implement the new_vq and free_vq hooks (KVM wants the guest to allocate the rings, lguest does it sanely). Signed-off-by: Rusty Russell <[EMAIL PROTECTED]>
[snip]
Seems like there is a problem with shared irq line, the interrupt handler always returns IRQ_HANDLED (except for the trivial case+irqreturn_t vring_interrupt(int irq, void *_vq) +{ + struct vring_virtqueue *vq = to_vvq(_vq); + + pr_debug("virtqueue interrupt for %p\n", vq); + + if (unlikely(vq->broken)) + return IRQ_HANDLED; + + if (more_used(vq)) { + pr_debug("virtqueue callback for %p (%p)\n", + vq, vq->vq.callback); + if (!vq->vq.callback) + return IRQ_NONE; + if (!vq->vq.callback(&vq->vq))+ vq->vring.avail->flags |= VRING_AVAIL_F_NO_INTERRUPT;+ } else + pr_debug("virtqueue %p no more used\n", vq); + + return IRQ_HANDLED; +} +
were the callback is null).It can be solved by having a host irq counter (in the shared ring) and a guest irq counter and return
mb(); return (host_counter!=guest_counter)? IRQ_HANDLED:IRQ_NONE; Dor.
------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2005. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________ kvm-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/kvm-devel
