Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=426e3e0af5d2473e67d4256fc1340b7faebd1cc7
Commit:     426e3e0af5d2473e67d4256fc1340b7faebd1cc7
Parent:     3309daaad724dd08eb598bf9c12b7bb9daddd706
Author:     Rusty Russell <[EMAIL PROTECTED]>
AuthorDate: Mon Feb 4 23:49:59 2008 -0500
Committer:  Rusty Russell <[EMAIL PROTECTED]>
CommitDate: Mon Feb 4 23:50:00 2008 +1100

    virtio: clarify NO_NOTIFY flag usage
    
    The other side (host) can set the NO_NOTIFY flag as an optimization,
    to say "no need to kick me when you add things".  Make it clear that
    this is advisory only; especially that we should always notify when
    the ring is full.
    
    Signed-off-by: Rusty Russell <[EMAIL PROTECTED]>
---
 Documentation/lguest/lguest.c |    9 +++++----
 drivers/virtio/virtio_ring.c  |    2 ++
 include/linux/virtio_ring.h   |    8 ++++++--
 3 files changed, 13 insertions(+), 6 deletions(-)

diff --git a/Documentation/lguest/lguest.c b/Documentation/lguest/lguest.c
index 4df1804..8ff2d8b 100644
--- a/Documentation/lguest/lguest.c
+++ b/Documentation/lguest/lguest.c
@@ -923,10 +923,10 @@ static void handle_output(int fd, unsigned long addr)
        /* Check each virtqueue. */
        for (i = devices.dev; i; i = i->next) {
                for (vq = i->vq; vq; vq = vq->next) {
-                       if (vq->config.pfn == addr/getpagesize()
-                           && vq->handle_output) {
+                       if (vq->config.pfn == addr/getpagesize()) {
                                verbose("Output to %s\n", vq->dev->name);
-                               vq->handle_output(fd, vq);
+                               if (vq->handle_output)
+                                       vq->handle_output(fd, vq);
                                return;
                        }
                }
@@ -1068,7 +1068,8 @@ static void add_virtqueue(struct device *dev, unsigned 
int num_descs,
         * virtqueue. */
        vq->handle_output = handle_output;
 
-       /* Set the "Don't Notify Me" flag if we don't have a handler */
+       /* As an optimization, set the advisory "Don't Notify Me" flag if we
+        * don't have a handler */
        if (!handle_output)
                vq->vring.used->flags = VRING_USED_F_NO_NOTIFY;
 }
diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
index 342bb03..dbe1d35 100644
--- a/drivers/virtio/virtio_ring.c
+++ b/drivers/virtio/virtio_ring.c
@@ -87,6 +87,8 @@ static int vring_add_buf(struct virtqueue *_vq,
        if (vq->num_free < out + in) {
                pr_debug("Can't add buf len %i - avail = %i\n",
                         out + in, vq->num_free);
+               /* We notify *even if* VRING_USED_F_NO_NOTIFY is set here. */
+               vq->notify(&vq->vq);
                END_USE(vq);
                return -ENOSPC;
        }
diff --git a/include/linux/virtio_ring.h b/include/linux/virtio_ring.h
index ea3be89..abe481e 100644
--- a/include/linux/virtio_ring.h
+++ b/include/linux/virtio_ring.h
@@ -15,9 +15,13 @@
 /* This marks a buffer as write-only (otherwise read-only). */
 #define VRING_DESC_F_WRITE     2
 
-/* This means don't notify other side when buffer added. */
+/* The Host uses this in used->flags to advise the Guest: don't kick me when
+ * you add a buffer.  It's unreliable, so it's simply an optimization.  Guest
+ * will still kick if it's out of buffers. */
 #define VRING_USED_F_NO_NOTIFY 1
-/* This means don't interrupt guest when buffer consumed. */
+/* The Guest uses this in avail->flags to advise the Host: don't interrupt me
+ * when you consume a buffer.  It's unreliable, so it's simply an
+ * optimization.  */
 #define VRING_AVAIL_F_NO_INTERRUPT     1
 
 /* Virtio ring descriptors: 16 bytes.  These can chain together via "next". */
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to