Merge branch 'for-linus' of git://git.kernel.dk/linux-2.6-block
[safe/jmp/linux-2.6] / include / linux / virtio_ring.h
index abe481e..693e0ec 100644 (file)
@@ -14,6 +14,8 @@
 #define VRING_DESC_F_NEXT      1
 /* This marks a buffer as write-only (otherwise read-only). */
 #define VRING_DESC_F_WRITE     2
+/* This means the buffer contains a list of buffer descriptors. */
+#define VRING_DESC_F_INDIRECT  4
 
 /* 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
@@ -24,6 +26,9 @@
  * optimization.  */
 #define VRING_AVAIL_F_NO_INTERRUPT     1
 
+/* We support indirect buffer descriptors */
+#define VIRTIO_RING_F_INDIRECT_DESC    28
+
 /* Virtio ring descriptors: 16 bytes.  These can chain together via "next". */
 struct vring_desc
 {
@@ -83,7 +88,7 @@ struct vring {
  *     __u16 avail_idx;
  *     __u16 available[num];
  *
- *     // Padding to the next page boundary.
+ *     // Padding to the next align boundary.
  *     char pad[];
  *
  *     // A ring of used descriptor heads with free-running index.
@@ -93,19 +98,19 @@ struct vring {
  * };
  */
 static inline void vring_init(struct vring *vr, unsigned int num, void *p,
-                             unsigned long pagesize)
+                             unsigned long align)
 {
        vr->num = num;
        vr->desc = p;
        vr->avail = p + num*sizeof(struct vring_desc);
-       vr->used = (void *)(((unsigned long)&vr->avail->ring[num] + pagesize-1)
-                           & ~(pagesize - 1));
+       vr->used = (void *)(((unsigned long)&vr->avail->ring[num] + align-1)
+                           & ~(align - 1));
 }
 
-static inline unsigned vring_size(unsigned int num, unsigned long pagesize)
+static inline unsigned vring_size(unsigned int num, unsigned long align)
 {
        return ((sizeof(struct vring_desc) * num + sizeof(__u16) * (2 + num)
-                + pagesize - 1) & ~(pagesize - 1))
+                + align - 1) & ~(align - 1))
                + sizeof(__u16) * 2 + sizeof(struct vring_used_elem) * num;
 }
 
@@ -115,11 +120,15 @@ struct virtio_device;
 struct virtqueue;
 
 struct virtqueue *vring_new_virtqueue(unsigned int num,
+                                     unsigned int vring_align,
                                      struct virtio_device *vdev,
                                      void *pages,
                                      void (*notify)(struct virtqueue *vq),
-                                     void (*callback)(struct virtqueue *vq));
+                                     void (*callback)(struct virtqueue *vq),
+                                     const char *name);
 void vring_del_virtqueue(struct virtqueue *vq);
+/* Filter out transport-specific feature bits. */
+void vring_transport_features(struct virtio_device *vdev);
 
 irqreturn_t vring_interrupt(int irq, void *_vq);
 #endif /* __KERNEL__ */