lguest: remove invalid interrupt forcing logic.
authorRusty Russell <rusty@rustcorp.com.au>
Sat, 13 Jun 2009 04:27:01 +0000 (22:27 -0600)
committerRusty Russell <rusty@rustcorp.com.au>
Fri, 12 Jun 2009 12:57:02 +0000 (22:27 +0930)
20887611523e749d99cc7d64ff6c97d27529fbae (lguest: notify on empty) introduced
lguest support for the VIRTIO_F_NOTIFY_ON_EMPTY flag, but in fact it turned on
interrupts all the time.

Because we always process one buffer at a time, the inflight count is always 0
when call trigger_irq and so we always ignore VRING_AVAIL_F_NO_INTERRUPT from
the Guest.

It should be looking to see if there are more buffers in the Guest's queue:
if it's empty, then we force an interrupt.

This makes little difference, since we usually have an empty queue; but
that's the subject of another patch.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Documentation/lguest/lguest.c

index 1e31d1ec12a38e69d2dfc3e723ead31611e70275..9f3240c45718a38e43f68d0e25edc38f09379c39 100644 (file)
@@ -172,9 +172,6 @@ struct virtqueue
        /* The routine to call when the Guest pings us, or timeout. */
        void (*handle_output)(struct virtqueue *me, bool timeout);
 
-       /* Outstanding buffers */
-       unsigned int inflight;
-
        /* Is this blocked awaiting a timer? */
        bool blocked;
 };
@@ -699,7 +696,6 @@ static unsigned get_vq_desc(struct virtqueue *vq,
                        errx(1, "Looped descriptor");
        } while ((i = next_desc(vq, i)) != vq->vring.num);
 
-       vq->inflight++;
        return head;
 }
 
@@ -717,7 +713,6 @@ static void add_used(struct virtqueue *vq, unsigned int head, int len)
        /* Make sure buffer is written before we update index. */
        wmb();
        vq->vring.used->idx++;
-       vq->inflight--;
 }
 
 /* This actually sends the interrupt for this virtqueue */
@@ -727,7 +722,7 @@ static void trigger_irq(struct virtqueue *vq)
 
        /* If they don't want an interrupt, don't send one, unless empty. */
        if ((vq->vring.avail->flags & VRING_AVAIL_F_NO_INTERRUPT)
-           && vq->inflight)
+           && lg_last_avail(vq) != vq->vring.avail->idx)
                return;
 
        /* Send the Guest an interrupt tell them we used something up. */
@@ -1171,7 +1166,6 @@ static void add_virtqueue(struct device *dev, unsigned int num_descs,
        vq->next = NULL;
        vq->last_avail_idx = 0;
        vq->dev = dev;
-       vq->inflight = 0;
        vq->blocked = false;
 
        /* Initialize the configuration. */