Lines Matching refs:queue
51 void *ipz_qpageit_get_inc(struct ipz_queue *queue) in ipz_qpageit_get_inc() argument
53 void *ret = ipz_qeit_get(queue); in ipz_qpageit_get_inc()
54 queue->current_q_offset += queue->pagesize; in ipz_qpageit_get_inc()
55 if (queue->current_q_offset > queue->queue_length) { in ipz_qpageit_get_inc()
56 queue->current_q_offset -= queue->pagesize; in ipz_qpageit_get_inc()
59 if (((u64)ret) % queue->pagesize) { in ipz_qpageit_get_inc()
66 void *ipz_qeit_eq_get_inc(struct ipz_queue *queue) in ipz_qeit_eq_get_inc() argument
68 void *ret = ipz_qeit_get(queue); in ipz_qeit_eq_get_inc()
69 u64 last_entry_in_q = queue->queue_length - queue->qe_size; in ipz_qeit_eq_get_inc()
71 queue->current_q_offset += queue->qe_size; in ipz_qeit_eq_get_inc()
72 if (queue->current_q_offset > last_entry_in_q) { in ipz_qeit_eq_get_inc()
73 queue->current_q_offset = 0; in ipz_qeit_eq_get_inc()
74 queue->toggle_state = (~queue->toggle_state) & 1; in ipz_qeit_eq_get_inc()
80 int ipz_queue_abs_to_offset(struct ipz_queue *queue, u64 addr, u64 *q_offset) in ipz_queue_abs_to_offset() argument
83 for (i = 0; i < queue->queue_length / queue->pagesize; i++) { in ipz_queue_abs_to_offset()
84 u64 page = __pa(queue->queue_pages[i]); in ipz_queue_abs_to_offset()
85 if (addr >= page && addr < page + queue->pagesize) { in ipz_queue_abs_to_offset()
86 *q_offset = addr - page + i * queue->pagesize; in ipz_queue_abs_to_offset()
102 static int alloc_queue_pages(struct ipz_queue *queue, const u32 nr_of_pages) in alloc_queue_pages() argument
113 queue->queue_pages[f] = (struct ipz_page *)kpage; in alloc_queue_pages()
121 for (f = 0; f < nr_of_pages && queue->queue_pages[f]; in alloc_queue_pages()
123 free_page((unsigned long)(queue->queue_pages)[f]); in alloc_queue_pages()
127 static int alloc_small_queue_page(struct ipz_queue *queue, struct ehca_pd *pd) in alloc_small_queue_page() argument
129 int order = ilog2(queue->pagesize) - 9; in alloc_small_queue_page()
161 queue->queue_pages[0] = (void *)(page->page | (bit << (order + 9))); in alloc_small_queue_page()
162 queue->small_page = page; in alloc_small_queue_page()
163 queue->offset = bit << (order + 9); in alloc_small_queue_page()
172 static void free_small_queue_page(struct ipz_queue *queue, struct ehca_pd *pd) in free_small_queue_page() argument
174 int order = ilog2(queue->pagesize) - 9; in free_small_queue_page()
175 struct ipz_small_queue_page *page = queue->small_page; in free_small_queue_page()
179 bit = ((unsigned long)queue->queue_pages[0] & ~PAGE_MASK) in free_small_queue_page()
204 int ipz_queue_ctor(struct ehca_pd *pd, struct ipz_queue *queue, in ipz_queue_ctor() argument
216 queue->queue_length = nr_of_pages * pagesize; in ipz_queue_ctor()
217 queue->pagesize = pagesize; in ipz_queue_ctor()
218 queue->qe_size = qe_size; in ipz_queue_ctor()
219 queue->act_nr_of_sg = nr_of_sg; in ipz_queue_ctor()
220 queue->current_q_offset = 0; in ipz_queue_ctor()
221 queue->toggle_state = 1; in ipz_queue_ctor()
222 queue->small_page = NULL; in ipz_queue_ctor()
225 queue->queue_pages = kzalloc(nr_of_pages * sizeof(void *), in ipz_queue_ctor()
227 if (!queue->queue_pages) { in ipz_queue_ctor()
228 queue->queue_pages = vzalloc(nr_of_pages * sizeof(void *)); in ipz_queue_ctor()
229 if (!queue->queue_pages) { in ipz_queue_ctor()
237 if (!alloc_small_queue_page(queue, pd)) in ipz_queue_ctor()
240 if (!alloc_queue_pages(queue, nr_of_pages)) in ipz_queue_ctor()
247 "nr_of_pages=%x", queue, nr_of_pages); in ipz_queue_ctor()
248 if (is_vmalloc_addr(queue->queue_pages)) in ipz_queue_ctor()
249 vfree(queue->queue_pages); in ipz_queue_ctor()
251 kfree(queue->queue_pages); in ipz_queue_ctor()
256 int ipz_queue_dtor(struct ehca_pd *pd, struct ipz_queue *queue) in ipz_queue_dtor() argument
260 if (!queue || !queue->queue_pages) { in ipz_queue_dtor()
265 if (queue->small_page) in ipz_queue_dtor()
266 free_small_queue_page(queue, pd); in ipz_queue_dtor()
268 nr_pages = queue->queue_length / queue->pagesize; in ipz_queue_dtor()
270 free_page((unsigned long)queue->queue_pages[i]); in ipz_queue_dtor()
273 if (is_vmalloc_addr(queue->queue_pages)) in ipz_queue_dtor()
274 vfree(queue->queue_pages); in ipz_queue_dtor()
276 kfree(queue->queue_pages); in ipz_queue_dtor()