aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRusty Russell <rusty@rustcorp.com.au>2009-06-13 00:27:01 -0400
committerRusty Russell <rusty@rustcorp.com.au>2009-06-12 08:57:02 -0400
commitebf9a5a99c1a464afe0b4dfa64416fc8b273bc5c (patch)
treeb5f0631172db5d97e0a5c6b8a6bc0f83c4a4eed5
parenta6c372de6e4b9a8188b66badcee3e3792eccdd26 (diff)
lguest: remove invalid interrupt forcing logic.
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>
-rw-r--r--Documentation/lguest/lguest.c8
1 files changed, 1 insertions, 7 deletions
diff --git a/Documentation/lguest/lguest.c b/Documentation/lguest/lguest.c
index 1e31d1ec12a3..9f3240c45718 100644
--- a/Documentation/lguest/lguest.c
+++ b/Documentation/lguest/lguest.c
@@ -172,9 +172,6 @@ struct virtqueue
172 /* The routine to call when the Guest pings us, or timeout. */ 172 /* The routine to call when the Guest pings us, or timeout. */
173 void (*handle_output)(struct virtqueue *me, bool timeout); 173 void (*handle_output)(struct virtqueue *me, bool timeout);
174 174
175 /* Outstanding buffers */
176 unsigned int inflight;
177
178 /* Is this blocked awaiting a timer? */ 175 /* Is this blocked awaiting a timer? */
179 bool blocked; 176 bool blocked;
180}; 177};
@@ -699,7 +696,6 @@ static unsigned get_vq_desc(struct virtqueue *vq,
699 errx(1, "Looped descriptor"); 696 errx(1, "Looped descriptor");
700 } while ((i = next_desc(vq, i)) != vq->vring.num); 697 } while ((i = next_desc(vq, i)) != vq->vring.num);
701 698
702 vq->inflight++;
703 return head; 699 return head;
704} 700}
705 701
@@ -717,7 +713,6 @@ static void add_used(struct virtqueue *vq, unsigned int head, int len)
717 /* Make sure buffer is written before we update index. */ 713 /* Make sure buffer is written before we update index. */
718 wmb(); 714 wmb();
719 vq->vring.used->idx++; 715 vq->vring.used->idx++;
720 vq->inflight--;
721} 716}
722 717
723/* This actually sends the interrupt for this virtqueue */ 718/* This actually sends the interrupt for this virtqueue */
@@ -727,7 +722,7 @@ static void trigger_irq(struct virtqueue *vq)
727 722
728 /* If they don't want an interrupt, don't send one, unless empty. */ 723 /* If they don't want an interrupt, don't send one, unless empty. */
729 if ((vq->vring.avail->flags & VRING_AVAIL_F_NO_INTERRUPT) 724 if ((vq->vring.avail->flags & VRING_AVAIL_F_NO_INTERRUPT)
730 && vq->inflight) 725 && lg_last_avail(vq) != vq->vring.avail->idx)
731 return; 726 return;
732 727
733 /* Send the Guest an interrupt tell them we used something up. */ 728 /* 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,
1171 vq->next = NULL; 1166 vq->next = NULL;
1172 vq->last_avail_idx = 0; 1167 vq->last_avail_idx = 0;
1173 vq->dev = dev; 1168 vq->dev = dev;
1174 vq->inflight = 0;
1175 vq->blocked = false; 1169 vq->blocked = false;
1176 1170
1177 /* Initialize the configuration. */ 1171 /* Initialize the configuration. */