include/linux/virtio_ring.h
changeset 2 d1f6d8b6f81c
parent 0 aa628870c1d3
equal deleted inserted replaced
1:0056487c491e 2:d1f6d8b6f81c
    81  *	// A ring of available descriptor heads with free-running index.
    81  *	// A ring of available descriptor heads with free-running index.
    82  *	__u16 avail_flags;
    82  *	__u16 avail_flags;
    83  *	__u16 avail_idx;
    83  *	__u16 avail_idx;
    84  *	__u16 available[num];
    84  *	__u16 available[num];
    85  *
    85  *
    86  *	// Padding to the next page boundary.
    86  *	// Padding to the next align boundary.
    87  *	char pad[];
    87  *	char pad[];
    88  *
    88  *
    89  *	// A ring of used descriptor heads with free-running index.
    89  *	// A ring of used descriptor heads with free-running index.
    90  *	__u16 used_flags;
    90  *	__u16 used_flags;
    91  *	__u16 used_idx;
    91  *	__u16 used_idx;
    92  *	struct vring_used_elem used[num];
    92  *	struct vring_used_elem used[num];
    93  * };
    93  * };
    94  */
    94  */
    95 static inline void vring_init(struct vring *vr, unsigned int num, void *p,
    95 static inline void vring_init(struct vring *vr, unsigned int num, void *p,
    96 			      unsigned long pagesize)
    96 			      unsigned long align)
    97 {
    97 {
    98 	vr->num = num;
    98 	vr->num = num;
    99 	vr->desc = p;
    99 	vr->desc = p;
   100 	vr->avail = p + num*sizeof(struct vring_desc);
   100 	vr->avail = p + num*sizeof(struct vring_desc);
   101 	vr->used = (void *)(((unsigned long)&vr->avail->ring[num] + pagesize-1)
   101 	vr->used = (void *)(((unsigned long)&vr->avail->ring[num] + align-1)
   102 			    & ~(pagesize - 1));
   102 			    & ~(align - 1));
   103 }
   103 }
   104 
   104 
   105 static inline unsigned vring_size(unsigned int num, unsigned long pagesize)
   105 static inline unsigned vring_size(unsigned int num, unsigned long align)
   106 {
   106 {
   107 	return ((sizeof(struct vring_desc) * num + sizeof(__u16) * (2 + num)
   107 	return ((sizeof(struct vring_desc) * num + sizeof(__u16) * (2 + num)
   108 		 + pagesize - 1) & ~(pagesize - 1))
   108 		 + align - 1) & ~(align - 1))
   109 		+ sizeof(__u16) * 2 + sizeof(struct vring_used_elem) * num;
   109 		+ sizeof(__u16) * 2 + sizeof(struct vring_used_elem) * num;
   110 }
   110 }
   111 
   111 
   112 #ifdef __KERNEL__
   112 #ifdef __KERNEL__
   113 #include <linux/irqreturn.h>
   113 #include <linux/irqreturn.h>
   114 struct virtio_device;
   114 struct virtio_device;
   115 struct virtqueue;
   115 struct virtqueue;
   116 
   116 
   117 struct virtqueue *vring_new_virtqueue(unsigned int num,
   117 struct virtqueue *vring_new_virtqueue(unsigned int num,
       
   118 				      unsigned int vring_align,
   118 				      struct virtio_device *vdev,
   119 				      struct virtio_device *vdev,
   119 				      void *pages,
   120 				      void *pages,
   120 				      void (*notify)(struct virtqueue *vq),
   121 				      void (*notify)(struct virtqueue *vq),
   121 				      void (*callback)(struct virtqueue *vq));
   122 				      void (*callback)(struct virtqueue *vq));
   122 void vring_del_virtqueue(struct virtqueue *vq);
   123 void vring_del_virtqueue(struct virtqueue *vq);