]> Pileus Git - ~andy/linux/blobdiff - include/linux/virtio_ring.h
Merge branch 'for-3.0-important' of git://git.drbd.org/linux-2.6-drbd into for-linus
[~andy/linux] / include / linux / virtio_ring.h
index c4eef73deb3fc1642fd0c567d5758888ad04bd70..4a32cb6da425abe92c9eaa019121f4710171c77a 100644 (file)
@@ -146,6 +146,20 @@ static inline unsigned vring_size(unsigned int num, unsigned long align)
                + sizeof(__u16) * 3 + sizeof(struct vring_used_elem) * num;
 }
 
+/* The following is used with USED_EVENT_IDX and AVAIL_EVENT_IDX */
+/* Assuming a given event_idx value from the other size, if
+ * we have just incremented index from old to new_idx,
+ * should we trigger an event? */
+static inline int vring_need_event(__u16 event_idx, __u16 new_idx, __u16 old)
+{
+       /* Note: Xen has similar logic for notification hold-off
+        * in include/xen/interface/io/ring.h with req_event and req_prod
+        * corresponding to event_idx + 1 and new_idx respectively.
+        * Note also that req_event and req_prod in Xen start at 1,
+        * event indexes in virtio start at 0. */
+       return (__u16)(new_idx - event_idx - 1) < (__u16)(new_idx - old);
+}
+
 #ifdef __KERNEL__
 #include <linux/irqreturn.h>
 struct virtio_device;