Lines Matching refs:iv

130 	struct airq_iv *iv;  in airq_iv_create()  local
133 iv = kzalloc(sizeof(*iv), GFP_KERNEL); in airq_iv_create()
134 if (!iv) in airq_iv_create()
136 iv->bits = bits; in airq_iv_create()
137 iv->flags = flags; in airq_iv_create()
145 iv->vector = dma_pool_zalloc(airq_iv_cache, GFP_KERNEL, in airq_iv_create()
146 &iv->vector_dma); in airq_iv_create()
147 if (!iv->vector) in airq_iv_create()
150 iv->vector = cio_dma_zalloc(size); in airq_iv_create()
151 if (!iv->vector) in airq_iv_create()
155 iv->avail = kmalloc(size, GFP_KERNEL); in airq_iv_create()
156 if (!iv->avail) in airq_iv_create()
158 memset(iv->avail, 0xff, size); in airq_iv_create()
159 iv->end = 0; in airq_iv_create()
161 iv->end = bits; in airq_iv_create()
163 iv->bitlock = kzalloc(size, GFP_KERNEL); in airq_iv_create()
164 if (!iv->bitlock) in airq_iv_create()
169 iv->ptr = kzalloc(size, GFP_KERNEL); in airq_iv_create()
170 if (!iv->ptr) in airq_iv_create()
175 iv->data = kzalloc(size, GFP_KERNEL); in airq_iv_create()
176 if (!iv->data) in airq_iv_create()
179 spin_lock_init(&iv->lock); in airq_iv_create()
180 return iv; in airq_iv_create()
183 kfree(iv->ptr); in airq_iv_create()
184 kfree(iv->bitlock); in airq_iv_create()
185 kfree(iv->avail); in airq_iv_create()
186 if (iv->flags & AIRQ_IV_CACHELINE && iv->vector) in airq_iv_create()
187 dma_pool_free(airq_iv_cache, iv->vector, iv->vector_dma); in airq_iv_create()
189 cio_dma_free(iv->vector, size); in airq_iv_create()
190 kfree(iv); in airq_iv_create()
200 void airq_iv_release(struct airq_iv *iv) in airq_iv_release() argument
202 kfree(iv->data); in airq_iv_release()
203 kfree(iv->ptr); in airq_iv_release()
204 kfree(iv->bitlock); in airq_iv_release()
205 if (iv->flags & AIRQ_IV_CACHELINE) in airq_iv_release()
206 dma_pool_free(airq_iv_cache, iv->vector, iv->vector_dma); in airq_iv_release()
208 cio_dma_free(iv->vector, iv_size(iv->bits)); in airq_iv_release()
209 kfree(iv->avail); in airq_iv_release()
210 kfree(iv); in airq_iv_release()
223 unsigned long airq_iv_alloc(struct airq_iv *iv, unsigned long num) in airq_iv_alloc() argument
227 if (!iv->avail || num == 0) in airq_iv_alloc()
229 spin_lock_irqsave(&iv->lock, flags); in airq_iv_alloc()
230 bit = find_first_bit_inv(iv->avail, iv->bits); in airq_iv_alloc()
231 while (bit + num <= iv->bits) { in airq_iv_alloc()
233 if (!test_bit_inv(bit + i, iv->avail)) in airq_iv_alloc()
238 clear_bit_inv(bit + i, iv->avail); in airq_iv_alloc()
239 if (bit + num >= iv->end) in airq_iv_alloc()
240 iv->end = bit + num + 1; in airq_iv_alloc()
243 bit = find_next_bit_inv(iv->avail, iv->bits, bit + i + 1); in airq_iv_alloc()
245 if (bit + num > iv->bits) in airq_iv_alloc()
247 spin_unlock_irqrestore(&iv->lock, flags); in airq_iv_alloc()
258 void airq_iv_free(struct airq_iv *iv, unsigned long bit, unsigned long num) in airq_iv_free() argument
262 if (!iv->avail || num == 0) in airq_iv_free()
264 spin_lock_irqsave(&iv->lock, flags); in airq_iv_free()
267 clear_bit_inv(bit + i, iv->vector); in airq_iv_free()
269 set_bit_inv(bit + i, iv->avail); in airq_iv_free()
271 if (bit + num >= iv->end) { in airq_iv_free()
273 while (iv->end > 0 && !test_bit_inv(iv->end - 1, iv->avail)) in airq_iv_free()
274 iv->end--; in airq_iv_free()
276 spin_unlock_irqrestore(&iv->lock, flags); in airq_iv_free()
289 unsigned long airq_iv_scan(struct airq_iv *iv, unsigned long start, in airq_iv_scan() argument
295 bit = find_next_bit_inv(iv->vector, end, start); in airq_iv_scan()
298 clear_bit_inv(bit, iv->vector); in airq_iv_scan()