git://ftp.safe.ca
/
safe
/
jmp
/
linux-2.6
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
net/9p: Add sysfs mount_tag file for virtio 9P device
[safe/jmp/linux-2.6]
/
include
/
linux
/
virtio_ring.h
diff --git
a/include/linux/virtio_ring.h
b/include/linux/virtio_ring.h
index
ea3be89
..
e4d144b
100644
(file)
--- a/
include/linux/virtio_ring.h
+++ b/
include/linux/virtio_ring.h
@@
-14,15
+14,23
@@
#define VRING_DESC_F_NEXT 1
/* This marks a buffer as write-only (otherwise read-only). */
#define VRING_DESC_F_WRITE 2
#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
-/* 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
#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
#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". */
/* Virtio ring descriptors: 16 bytes. These can chain together via "next". */
-struct vring_desc
-{
+struct vring_desc {
/* Address (guest-physical). */
__u64 addr;
/* Length. */
/* Address (guest-physical). */
__u64 addr;
/* Length. */
@@
-33,24
+41,21
@@
struct vring_desc
__u16 next;
};
__u16 next;
};
-struct vring_avail
-{
+struct vring_avail {
__u16 flags;
__u16 idx;
__u16 ring[];
};
/* u32 is used here for ids for padding reasons. */
__u16 flags;
__u16 idx;
__u16 ring[];
};
/* u32 is used here for ids for padding reasons. */
-struct vring_used_elem
-{
+struct vring_used_elem {
/* Index of start of used descriptor chain. */
__u32 id;
/* Total length of the descriptor chain which was used (written to) */
__u32 len;
};
/* Index of start of used descriptor chain. */
__u32 id;
/* Total length of the descriptor chain which was used (written to) */
__u32 len;
};
-struct vring_used
-{
+struct vring_used {
__u16 flags;
__u16 idx;
struct vring_used_elem ring[];
__u16 flags;
__u16 idx;
struct vring_used_elem ring[];
@@
-79,7
+84,7
@@
struct vring {
* __u16 avail_idx;
* __u16 available[num];
*
* __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.
* char pad[];
*
* // A ring of used descriptor heads with free-running index.
@@
-89,19
+94,19
@@
struct vring {
* };
*/
static inline void vring_init(struct vring *vr, unsigned int num, void *p,
* };
*/
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->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)
{
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;
}
+ sizeof(__u16) * 2 + sizeof(struct vring_used_elem) * num;
}
@@
-111,11
+116,15
@@
struct virtio_device;
struct virtqueue;
struct virtqueue *vring_new_virtqueue(unsigned int num,
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),
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);
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__ */
irqreturn_t vring_interrupt(int irq, void *_vq);
#endif /* __KERNEL__ */