Lines Matching refs:qpt
47 static inline unsigned mk_qpn(struct qib_qpn_table *qpt, in mk_qpn() argument
50 return (map - qpt->map) * BITS_PER_PAGE + off; in mk_qpn()
53 static inline unsigned find_next_offset(struct qib_qpn_table *qpt, in find_next_offset() argument
57 if (qpt->mask) { in find_next_offset()
59 if (((off & qpt->mask) >> 1) >= n) in find_next_offset()
60 off = (off | qpt->mask) + 2; in find_next_offset()
103 static void get_map_page(struct qib_qpn_table *qpt, struct qpn_map *map, in get_map_page() argument
112 spin_lock(&qpt->lock); in get_map_page()
117 spin_unlock(&qpt->lock); in get_map_page()
124 static int alloc_qpn(struct qib_devdata *dd, struct qib_qpn_table *qpt, in alloc_qpn() argument
136 spin_lock(&qpt->lock); in alloc_qpn()
137 if (qpt->flags & n) in alloc_qpn()
140 qpt->flags |= n; in alloc_qpn()
141 spin_unlock(&qpt->lock); in alloc_qpn()
145 qpn = qpt->last + 2; in alloc_qpn()
148 if (qpt->mask && ((qpn & qpt->mask) >> 1) >= dd->n_krcv_queues) in alloc_qpn()
149 qpn = (qpn | qpt->mask) + 2; in alloc_qpn()
151 map = &qpt->map[qpn / BITS_PER_PAGE]; in alloc_qpn()
152 max_scan = qpt->nmaps - !offset; in alloc_qpn()
155 get_map_page(qpt, map, gfp); in alloc_qpn()
161 qpt->last = qpn; in alloc_qpn()
165 offset = find_next_offset(qpt, map, offset, in alloc_qpn()
167 qpn = mk_qpn(qpt, map, offset); in alloc_qpn()
183 if (qpt->nmaps == QPNMAP_ENTRIES) in alloc_qpn()
185 map = &qpt->map[qpt->nmaps++]; in alloc_qpn()
187 } else if (map < &qpt->map[qpt->nmaps]) { in alloc_qpn()
191 map = &qpt->map[0]; in alloc_qpn()
194 qpn = mk_qpn(qpt, map, offset); in alloc_qpn()
203 static void free_qpn(struct qib_qpn_table *qpt, u32 qpn) in free_qpn() argument
207 map = qpt->map + qpn / BITS_PER_PAGE; in free_qpn()
1255 void qib_init_qpn_table(struct qib_devdata *dd, struct qib_qpn_table *qpt) in qib_init_qpn_table() argument
1257 spin_lock_init(&qpt->lock); in qib_init_qpn_table()
1258 qpt->last = 1; /* start with QPN 2 */ in qib_init_qpn_table()
1259 qpt->nmaps = 1; in qib_init_qpn_table()
1260 qpt->mask = dd->qpn_mask; in qib_init_qpn_table()
1267 void qib_free_qpn_table(struct qib_qpn_table *qpt) in qib_free_qpn_table() argument
1271 for (i = 0; i < ARRAY_SIZE(qpt->map); i++) in qib_free_qpn_table()
1272 if (qpt->map[i].page) in qib_free_qpn_table()
1273 free_page((unsigned long) qpt->map[i].page); in qib_free_qpn_table()