Lines Matching refs:ring
33 struct ring { struct
39 struct ring *ring; argument
47 void qxl_ring_free(struct qxl_ring *ring) in qxl_ring_free() argument
49 kfree(ring); in qxl_ring_free()
52 void qxl_ring_init_hdr(struct qxl_ring *ring) in qxl_ring_init_hdr() argument
54 ring->ring->header.notify_on_prod = ring->n_elements; in qxl_ring_init_hdr()
65 struct qxl_ring *ring; in qxl_ring_create() local
67 ring = kmalloc(sizeof(*ring), GFP_KERNEL); in qxl_ring_create()
68 if (!ring) in qxl_ring_create()
71 ring->ring = (struct ring *)header; in qxl_ring_create()
72 ring->element_size = element_size; in qxl_ring_create()
73 ring->n_elements = n_elements; in qxl_ring_create()
74 ring->prod_notify = prod_notify; in qxl_ring_create()
75 ring->push_event = push_event; in qxl_ring_create()
77 qxl_ring_init_hdr(ring); in qxl_ring_create()
78 spin_lock_init(&ring->lock); in qxl_ring_create()
79 return ring; in qxl_ring_create()
82 static int qxl_check_header(struct qxl_ring *ring) in qxl_check_header() argument
85 struct qxl_ring_header *header = &(ring->ring->header); in qxl_check_header()
87 spin_lock_irqsave(&ring->lock, flags); in qxl_check_header()
91 spin_unlock_irqrestore(&ring->lock, flags); in qxl_check_header()
95 int qxl_check_idle(struct qxl_ring *ring) in qxl_check_idle() argument
98 struct qxl_ring_header *header = &(ring->ring->header); in qxl_check_idle()
100 spin_lock_irqsave(&ring->lock, flags); in qxl_check_idle()
102 spin_unlock_irqrestore(&ring->lock, flags); in qxl_check_idle()
106 int qxl_ring_push(struct qxl_ring *ring, in qxl_ring_push() argument
109 struct qxl_ring_header *header = &(ring->ring->header); in qxl_ring_push()
113 spin_lock_irqsave(&ring->lock, flags); in qxl_ring_push()
117 spin_unlock_irqrestore(&ring->lock, flags); in qxl_ring_push()
119 while (!qxl_check_header(ring)) in qxl_ring_push()
123 ret = wait_event_interruptible(*ring->push_event, in qxl_ring_push()
124 qxl_check_header(ring)); in qxl_ring_push()
128 wait_event(*ring->push_event, in qxl_ring_push()
129 qxl_check_header(ring)); in qxl_ring_push()
133 spin_lock_irqsave(&ring->lock, flags); in qxl_ring_push()
136 idx = header->prod & (ring->n_elements - 1); in qxl_ring_push()
137 elt = ring->ring->elements + idx * ring->element_size; in qxl_ring_push()
139 memcpy((void *)elt, new_elt, ring->element_size); in qxl_ring_push()
146 outb(0, ring->prod_notify); in qxl_ring_push()
148 spin_unlock_irqrestore(&ring->lock, flags); in qxl_ring_push()
152 static bool qxl_ring_pop(struct qxl_ring *ring, in qxl_ring_pop() argument
155 volatile struct qxl_ring_header *header = &(ring->ring->header); in qxl_ring_pop()
159 spin_lock_irqsave(&ring->lock, flags); in qxl_ring_pop()
162 spin_unlock_irqrestore(&ring->lock, flags); in qxl_ring_pop()
166 idx = header->cons & (ring->n_elements - 1); in qxl_ring_pop()
167 ring_elt = ring->ring->elements + idx * ring->element_size; in qxl_ring_pop()
169 memcpy(element, (void *)ring_elt, ring->element_size); in qxl_ring_pop()
173 spin_unlock_irqrestore(&ring->lock, flags); in qxl_ring_pop()