Go to the source code of this file.
Data Structures | |
| struct | vring_desc |
| struct | vring_avail |
| struct | vring_used_elem |
| struct | vring_used |
| struct | vring |
| struct | vring_virtqueue |
| struct | vring_list |
Defines | |
| #define | PAGE_SHIFT (12) |
| #define | PAGE_SIZE (1<<PAGE_SHIFT) |
| #define | PAGE_MASK (PAGE_SIZE-1) |
| #define | VIRTIO_CONFIG_S_ACKNOWLEDGE 1 |
| #define | VIRTIO_CONFIG_S_DRIVER 2 |
| #define | VIRTIO_CONFIG_S_DRIVER_OK 4 |
| #define | VIRTIO_CONFIG_S_FAILED 0x80 |
| #define | MAX_QUEUE_NUM (512) |
| #define | VRING_DESC_F_NEXT 1 |
| #define | VRING_DESC_F_WRITE 2 |
| #define | VRING_AVAIL_F_NO_INTERRUPT 1 |
| #define | VRING_USED_F_NO_NOTIFY 1 |
| #define | vring_size(num) |
Typedefs | |
| typedef unsigned char | virtio_queue_t [PAGE_MASK+vring_size(MAX_QUEUE_NUM)] |
Functions | |
| static void | vring_init (struct vring *vr, unsigned int num, unsigned char *queue) |
| static void | vring_enable_cb (struct vring_virtqueue *vq) |
| static void | vring_disable_cb (struct vring_virtqueue *vq) |
| static int | vring_more_used (struct vring_virtqueue *vq) |
| void | vring_detach (struct vring_virtqueue *vq, unsigned int head) |
| int | vring_get_buf (struct vring_virtqueue *vq, unsigned int *len) |
| void | vring_add_buf (struct vring_virtqueue *vq, struct vring_list list[], unsigned int out, unsigned int in, int index, int num_added) |
| void | vring_kick (unsigned int ioaddr, struct vring_virtqueue *vq, int num_added) |
| #define PAGE_SHIFT (12) |
Definition at line 3 of file virtio-ring.h.
| #define PAGE_SIZE (1<<PAGE_SHIFT) |
Definition at line 4 of file virtio-ring.h.
| #define PAGE_MASK (PAGE_SIZE-1) |
Definition at line 5 of file virtio-ring.h.
| #define VIRTIO_CONFIG_S_ACKNOWLEDGE 1 |
Definition at line 9 of file virtio-ring.h.
| #define VIRTIO_CONFIG_S_DRIVER 2 |
| #define VIRTIO_CONFIG_S_DRIVER_OK 4 |
| #define VIRTIO_CONFIG_S_FAILED 0x80 |
Definition at line 15 of file virtio-ring.h.
| #define MAX_QUEUE_NUM (512) |
| #define VRING_DESC_F_NEXT 1 |
| #define VRING_DESC_F_WRITE 2 |
| #define VRING_AVAIL_F_NO_INTERRUPT 1 |
Definition at line 22 of file virtio-ring.h.
Referenced by vring_disable_cb(), and vring_enable_cb().
| #define VRING_USED_F_NO_NOTIFY 1 |
| #define vring_size | ( | num | ) |
Value:
(((((sizeof(struct vring_desc) * num) + \ (sizeof(struct vring_avail) + sizeof(u16) * num)) \ + PAGE_MASK) & ~PAGE_MASK) + \ (sizeof(struct vring_used) + sizeof(struct vring_used_elem) * num))
Definition at line 61 of file virtio-ring.h.
| typedef unsigned char virtio_queue_t[PAGE_MASK+vring_size(MAX_QUEUE_NUM)] |
Definition at line 67 of file virtio-ring.h.
| static void vring_init | ( | struct vring * | vr, | |
| unsigned int | num, | |||
| unsigned char * | queue | |||
| ) | [inline, static] |
Definition at line 84 of file virtio-ring.h.
References vring::avail, vring::desc, vring_desc::next, vring::num, PAGE_MASK, phys_to_virt(), vring_avail::ring, vring::used, and virt_to_phys().
Referenced by vp_find_vq().
00086 { 00087 unsigned int i; 00088 unsigned long pa; 00089 00090 vr->num = num; 00091 00092 /* physical address of desc must be page aligned */ 00093 00094 pa = virt_to_phys(queue); 00095 pa = (pa + PAGE_MASK) & ~PAGE_MASK; 00096 vr->desc = phys_to_virt(pa); 00097 00098 vr->avail = (struct vring_avail *)&vr->desc[num]; 00099 00100 /* physical address of used must be page aligned */ 00101 00102 pa = virt_to_phys(&vr->avail->ring[num]); 00103 pa = (pa + PAGE_MASK) & ~PAGE_MASK; 00104 vr->used = phys_to_virt(pa); 00105 00106 for (i = 0; i < num - 1; i++) 00107 vr->desc[i].next = i + 1; 00108 vr->desc[i].next = 0; 00109 }
| static void vring_enable_cb | ( | struct vring_virtqueue * | vq | ) | [inline, static] |
Definition at line 111 of file virtio-ring.h.
References vring::avail, vring_avail::flags, vring_virtqueue::vring, and VRING_AVAIL_F_NO_INTERRUPT.
Referenced by virtnet_irq().
00112 { 00113 vq->vring.avail->flags &= ~VRING_AVAIL_F_NO_INTERRUPT; 00114 }
| static void vring_disable_cb | ( | struct vring_virtqueue * | vq | ) | [inline, static] |
Definition at line 116 of file virtio-ring.h.
References vring::avail, vring_avail::flags, vring_virtqueue::vring, and VRING_AVAIL_F_NO_INTERRUPT.
Referenced by virtnet_disable(), and virtnet_irq().
00117 { 00118 vq->vring.avail->flags |= VRING_AVAIL_F_NO_INTERRUPT; 00119 }
| static int vring_more_used | ( | struct vring_virtqueue * | vq | ) | [inline, static] |
Definition at line 129 of file virtio-ring.h.
References vring_used::idx, vring_virtqueue::last_used_idx, vring::used, vring_virtqueue::vring, and wmb.
Referenced by virtnet_poll(), virtnet_transmit(), and vring_get_buf().
00130 { 00131 wmb(); 00132 return vq->last_used_idx != vq->vring.used->idx; 00133 }
| void vring_detach | ( | struct vring_virtqueue * | vq, | |
| unsigned int | head | |||
| ) |
Definition at line 35 of file virtio-ring.c.
References vring::desc, vring_desc::flags, vring_virtqueue::free_head, vring_desc::next, vring_virtqueue::vring, VRING_DESC_F_NEXT, and wmb.
Referenced by vring_get_buf().
00036 { 00037 struct vring *vr = &vq->vring; 00038 unsigned int i; 00039 00040 /* find end of given descriptor */ 00041 00042 i = head; 00043 while (vr->desc[i].flags & VRING_DESC_F_NEXT) 00044 i = vr->desc[i].next; 00045 00046 /* link it with free list and point to it */ 00047 00048 vr->desc[i].next = vq->free_head; 00049 wmb(); 00050 vq->free_head = head; 00051 }
| int vring_get_buf | ( | struct vring_virtqueue * | vq, | |
| unsigned int * | len | |||
| ) |
Definition at line 60 of file virtio-ring.c.
References BUG_ON, vring_used_elem::id, id, vring_virtqueue::last_used_idx, vring_used_elem::len, NULL, vring::num, vring_used::ring, u32, vring::used, vring_virtqueue::vdata, vring_virtqueue::vring, vring_detach(), vring_more_used(), and wmb.
Referenced by virtnet_poll(), and virtnet_transmit().
00061 { 00062 struct vring *vr = &vq->vring; 00063 struct vring_used_elem *elem; 00064 u32 id; 00065 int ret; 00066 00067 BUG_ON(!vring_more_used(vq)); 00068 00069 elem = &vr->used->ring[vq->last_used_idx % vr->num]; 00070 wmb(); 00071 id = elem->id; 00072 if (len != NULL) 00073 *len = elem->len; 00074 00075 ret = vq->vdata[id]; 00076 00077 vring_detach(vq, id); 00078 00079 vq->last_used_idx++; 00080 00081 return ret; 00082 }
| void vring_add_buf | ( | struct vring_virtqueue * | vq, | |
| struct vring_list | list[], | |||
| unsigned int | out, | |||
| unsigned int | in, | |||
| int | index, | |||
| int | num_added | |||
| ) |
Definition at line 84 of file virtio-ring.c.
References vring_list::addr, vring_desc::addr, vring::avail, BUG_ON, vring::desc, vring_desc::flags, vring_virtqueue::free_head, vring_avail::idx, vring_desc::len, vring_list::length, vring_desc::next, vring::num, vring_avail::ring, vring_virtqueue::vdata, virt_to_phys(), vring_virtqueue::vring, VRING_DESC_F_NEXT, VRING_DESC_F_WRITE, and wmb.
Referenced by provide_buffers(), virtnet_poll(), and virtnet_transmit().
00088 { 00089 struct vring *vr = &vq->vring; 00090 int i, avail, head, prev; 00091 00092 BUG_ON(out + in == 0); 00093 00094 prev = 0; 00095 head = vq->free_head; 00096 for (i = head; out; i = vr->desc[i].next, out--) { 00097 00098 vr->desc[i].flags = VRING_DESC_F_NEXT; 00099 vr->desc[i].addr = (u64)virt_to_phys(list->addr); 00100 vr->desc[i].len = list->length; 00101 prev = i; 00102 list++; 00103 } 00104 for ( ; in; i = vr->desc[i].next, in--) { 00105 00106 vr->desc[i].flags = VRING_DESC_F_NEXT|VRING_DESC_F_WRITE; 00107 vr->desc[i].addr = (u64)virt_to_phys(list->addr); 00108 vr->desc[i].len = list->length; 00109 prev = i; 00110 list++; 00111 } 00112 vr->desc[prev].flags &= ~VRING_DESC_F_NEXT; 00113 00114 vq->free_head = i; 00115 00116 vq->vdata[head] = index; 00117 00118 avail = (vr->avail->idx + num_added) % vr->num; 00119 vr->avail->ring[avail] = head; 00120 wmb(); 00121 }
| void vring_kick | ( | unsigned int | ioaddr, | |
| struct vring_virtqueue * | vq, | |||
| int | num_added | |||
| ) |
Definition at line 123 of file virtio-ring.c.
References vring::avail, vring_used::flags, vring_avail::idx, mb(), vring_virtqueue::queue_index, vring::used, vp_notify(), vring_virtqueue::vring, VRING_USED_F_NO_NOTIFY, and wmb.
Referenced by provide_buffers(), virtnet_poll(), and virtnet_transmit().
00124 { 00125 struct vring *vr = &vq->vring; 00126 00127 wmb(); 00128 vr->avail->idx += num_added; 00129 00130 mb(); 00131 if (!(vr->used->flags & VRING_USED_F_NO_NOTIFY)) 00132 vp_notify(ioaddr, vq->queue_index); 00133 }
1.5.7.1