|
@@ -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;
|