xref: /openbmc/linux/lib/genalloc.c (revision 861e10be)
1 /*
2  * Basic general purpose allocator for managing special purpose
3  * memory, for example, memory that is not managed by the regular
4  * kmalloc/kfree interface.  Uses for this includes on-device special
5  * memory, uncached memory etc.
6  *
7  * It is safe to use the allocator in NMI handlers and other special
8  * unblockable contexts that could otherwise deadlock on locks.  This
9  * is implemented by using atomic operations and retries on any
10  * conflicts.  The disadvantage is that there may be livelocks in
11  * extreme cases.  For better scalability, one allocator can be used
12  * for each CPU.
13  *
14  * The lockless operation only works if there is enough memory
15  * available.  If new memory is added to the pool a lock has to be
16  * still taken.  So any user relying on locklessness has to ensure
17  * that sufficient memory is preallocated.
18  *
19  * The basic atomic operation of this allocator is cmpxchg on long.
20  * On architectures that don't have NMI-safe cmpxchg implementation,
21  * the allocator can NOT be used in NMI handler.  So code uses the
22  * allocator in NMI handler should depend on
23  * CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG.
24  *
25  * Copyright 2005 (C) Jes Sorensen <jes@trained-monkey.org>
26  *
27  * This source code is licensed under the GNU General Public License,
28  * Version 2.  See the file COPYING for more details.
29  */
30 
31 #include <linux/slab.h>
32 #include <linux/export.h>
33 #include <linux/bitmap.h>
34 #include <linux/rculist.h>
35 #include <linux/interrupt.h>
36 #include <linux/genalloc.h>
37 
38 static int set_bits_ll(unsigned long *addr, unsigned long mask_to_set)
39 {
40 	unsigned long val, nval;
41 
42 	nval = *addr;
43 	do {
44 		val = nval;
45 		if (val & mask_to_set)
46 			return -EBUSY;
47 		cpu_relax();
48 	} while ((nval = cmpxchg(addr, val, val | mask_to_set)) != val);
49 
50 	return 0;
51 }
52 
53 static int clear_bits_ll(unsigned long *addr, unsigned long mask_to_clear)
54 {
55 	unsigned long val, nval;
56 
57 	nval = *addr;
58 	do {
59 		val = nval;
60 		if ((val & mask_to_clear) != mask_to_clear)
61 			return -EBUSY;
62 		cpu_relax();
63 	} while ((nval = cmpxchg(addr, val, val & ~mask_to_clear)) != val);
64 
65 	return 0;
66 }
67 
68 /*
69  * bitmap_set_ll - set the specified number of bits at the specified position
70  * @map: pointer to a bitmap
71  * @start: a bit position in @map
72  * @nr: number of bits to set
73  *
74  * Set @nr bits start from @start in @map lock-lessly. Several users
75  * can set/clear the same bitmap simultaneously without lock. If two
76  * users set the same bit, one user will return remain bits, otherwise
77  * return 0.
78  */
79 static int bitmap_set_ll(unsigned long *map, int start, int nr)
80 {
81 	unsigned long *p = map + BIT_WORD(start);
82 	const int size = start + nr;
83 	int bits_to_set = BITS_PER_LONG - (start % BITS_PER_LONG);
84 	unsigned long mask_to_set = BITMAP_FIRST_WORD_MASK(start);
85 
86 	while (nr - bits_to_set >= 0) {
87 		if (set_bits_ll(p, mask_to_set))
88 			return nr;
89 		nr -= bits_to_set;
90 		bits_to_set = BITS_PER_LONG;
91 		mask_to_set = ~0UL;
92 		p++;
93 	}
94 	if (nr) {
95 		mask_to_set &= BITMAP_LAST_WORD_MASK(size);
96 		if (set_bits_ll(p, mask_to_set))
97 			return nr;
98 	}
99 
100 	return 0;
101 }
102 
103 /*
104  * bitmap_clear_ll - clear the specified number of bits at the specified position
105  * @map: pointer to a bitmap
106  * @start: a bit position in @map
107  * @nr: number of bits to set
108  *
109  * Clear @nr bits start from @start in @map lock-lessly. Several users
110  * can set/clear the same bitmap simultaneously without lock. If two
111  * users clear the same bit, one user will return remain bits,
112  * otherwise return 0.
113  */
114 static int bitmap_clear_ll(unsigned long *map, int start, int nr)
115 {
116 	unsigned long *p = map + BIT_WORD(start);
117 	const int size = start + nr;
118 	int bits_to_clear = BITS_PER_LONG - (start % BITS_PER_LONG);
119 	unsigned long mask_to_clear = BITMAP_FIRST_WORD_MASK(start);
120 
121 	while (nr - bits_to_clear >= 0) {
122 		if (clear_bits_ll(p, mask_to_clear))
123 			return nr;
124 		nr -= bits_to_clear;
125 		bits_to_clear = BITS_PER_LONG;
126 		mask_to_clear = ~0UL;
127 		p++;
128 	}
129 	if (nr) {
130 		mask_to_clear &= BITMAP_LAST_WORD_MASK(size);
131 		if (clear_bits_ll(p, mask_to_clear))
132 			return nr;
133 	}
134 
135 	return 0;
136 }
137 
138 /**
139  * gen_pool_create - create a new special memory pool
140  * @min_alloc_order: log base 2 of number of bytes each bitmap bit represents
141  * @nid: node id of the node the pool structure should be allocated on, or -1
142  *
143  * Create a new special memory pool that can be used to manage special purpose
144  * memory not managed by the regular kmalloc/kfree interface.
145  */
146 struct gen_pool *gen_pool_create(int min_alloc_order, int nid)
147 {
148 	struct gen_pool *pool;
149 
150 	pool = kmalloc_node(sizeof(struct gen_pool), GFP_KERNEL, nid);
151 	if (pool != NULL) {
152 		spin_lock_init(&pool->lock);
153 		INIT_LIST_HEAD(&pool->chunks);
154 		pool->min_alloc_order = min_alloc_order;
155 		pool->algo = gen_pool_first_fit;
156 		pool->data = NULL;
157 	}
158 	return pool;
159 }
160 EXPORT_SYMBOL(gen_pool_create);
161 
162 /**
163  * gen_pool_add_virt - add a new chunk of special memory to the pool
164  * @pool: pool to add new memory chunk to
165  * @virt: virtual starting address of memory chunk to add to pool
166  * @phys: physical starting address of memory chunk to add to pool
167  * @size: size in bytes of the memory chunk to add to pool
168  * @nid: node id of the node the chunk structure and bitmap should be
169  *       allocated on, or -1
170  *
171  * Add a new chunk of special memory to the specified pool.
172  *
173  * Returns 0 on success or a -ve errno on failure.
174  */
175 int gen_pool_add_virt(struct gen_pool *pool, unsigned long virt, phys_addr_t phys,
176 		 size_t size, int nid)
177 {
178 	struct gen_pool_chunk *chunk;
179 	int nbits = size >> pool->min_alloc_order;
180 	int nbytes = sizeof(struct gen_pool_chunk) +
181 				BITS_TO_LONGS(nbits) * sizeof(long);
182 
183 	chunk = kmalloc_node(nbytes, GFP_KERNEL | __GFP_ZERO, nid);
184 	if (unlikely(chunk == NULL))
185 		return -ENOMEM;
186 
187 	chunk->phys_addr = phys;
188 	chunk->start_addr = virt;
189 	chunk->end_addr = virt + size;
190 	atomic_set(&chunk->avail, size);
191 
192 	spin_lock(&pool->lock);
193 	list_add_rcu(&chunk->next_chunk, &pool->chunks);
194 	spin_unlock(&pool->lock);
195 
196 	return 0;
197 }
198 EXPORT_SYMBOL(gen_pool_add_virt);
199 
200 /**
201  * gen_pool_virt_to_phys - return the physical address of memory
202  * @pool: pool to allocate from
203  * @addr: starting address of memory
204  *
205  * Returns the physical address on success, or -1 on error.
206  */
207 phys_addr_t gen_pool_virt_to_phys(struct gen_pool *pool, unsigned long addr)
208 {
209 	struct gen_pool_chunk *chunk;
210 	phys_addr_t paddr = -1;
211 
212 	rcu_read_lock();
213 	list_for_each_entry_rcu(chunk, &pool->chunks, next_chunk) {
214 		if (addr >= chunk->start_addr && addr < chunk->end_addr) {
215 			paddr = chunk->phys_addr + (addr - chunk->start_addr);
216 			break;
217 		}
218 	}
219 	rcu_read_unlock();
220 
221 	return paddr;
222 }
223 EXPORT_SYMBOL(gen_pool_virt_to_phys);
224 
225 /**
226  * gen_pool_destroy - destroy a special memory pool
227  * @pool: pool to destroy
228  *
229  * Destroy the specified special memory pool. Verifies that there are no
230  * outstanding allocations.
231  */
232 void gen_pool_destroy(struct gen_pool *pool)
233 {
234 	struct list_head *_chunk, *_next_chunk;
235 	struct gen_pool_chunk *chunk;
236 	int order = pool->min_alloc_order;
237 	int bit, end_bit;
238 
239 	list_for_each_safe(_chunk, _next_chunk, &pool->chunks) {
240 		chunk = list_entry(_chunk, struct gen_pool_chunk, next_chunk);
241 		list_del(&chunk->next_chunk);
242 
243 		end_bit = (chunk->end_addr - chunk->start_addr) >> order;
244 		bit = find_next_bit(chunk->bits, end_bit, 0);
245 		BUG_ON(bit < end_bit);
246 
247 		kfree(chunk);
248 	}
249 	kfree(pool);
250 	return;
251 }
252 EXPORT_SYMBOL(gen_pool_destroy);
253 
254 /**
255  * gen_pool_alloc - allocate special memory from the pool
256  * @pool: pool to allocate from
257  * @size: number of bytes to allocate from the pool
258  *
259  * Allocate the requested number of bytes from the specified pool.
260  * Uses the pool allocation function (with first-fit algorithm by default).
261  * Can not be used in NMI handler on architectures without
262  * NMI-safe cmpxchg implementation.
263  */
264 unsigned long gen_pool_alloc(struct gen_pool *pool, size_t size)
265 {
266 	struct gen_pool_chunk *chunk;
267 	unsigned long addr = 0;
268 	int order = pool->min_alloc_order;
269 	int nbits, start_bit = 0, end_bit, remain;
270 
271 #ifndef CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG
272 	BUG_ON(in_nmi());
273 #endif
274 
275 	if (size == 0)
276 		return 0;
277 
278 	nbits = (size + (1UL << order) - 1) >> order;
279 	rcu_read_lock();
280 	list_for_each_entry_rcu(chunk, &pool->chunks, next_chunk) {
281 		if (size > atomic_read(&chunk->avail))
282 			continue;
283 
284 		end_bit = (chunk->end_addr - chunk->start_addr) >> order;
285 retry:
286 		start_bit = pool->algo(chunk->bits, end_bit, start_bit, nbits,
287 				pool->data);
288 		if (start_bit >= end_bit)
289 			continue;
290 		remain = bitmap_set_ll(chunk->bits, start_bit, nbits);
291 		if (remain) {
292 			remain = bitmap_clear_ll(chunk->bits, start_bit,
293 						 nbits - remain);
294 			BUG_ON(remain);
295 			goto retry;
296 		}
297 
298 		addr = chunk->start_addr + ((unsigned long)start_bit << order);
299 		size = nbits << order;
300 		atomic_sub(size, &chunk->avail);
301 		break;
302 	}
303 	rcu_read_unlock();
304 	return addr;
305 }
306 EXPORT_SYMBOL(gen_pool_alloc);
307 
308 /**
309  * gen_pool_free - free allocated special memory back to the pool
310  * @pool: pool to free to
311  * @addr: starting address of memory to free back to pool
312  * @size: size in bytes of memory to free
313  *
314  * Free previously allocated special memory back to the specified
315  * pool.  Can not be used in NMI handler on architectures without
316  * NMI-safe cmpxchg implementation.
317  */
318 void gen_pool_free(struct gen_pool *pool, unsigned long addr, size_t size)
319 {
320 	struct gen_pool_chunk *chunk;
321 	int order = pool->min_alloc_order;
322 	int start_bit, nbits, remain;
323 
324 #ifndef CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG
325 	BUG_ON(in_nmi());
326 #endif
327 
328 	nbits = (size + (1UL << order) - 1) >> order;
329 	rcu_read_lock();
330 	list_for_each_entry_rcu(chunk, &pool->chunks, next_chunk) {
331 		if (addr >= chunk->start_addr && addr < chunk->end_addr) {
332 			BUG_ON(addr + size > chunk->end_addr);
333 			start_bit = (addr - chunk->start_addr) >> order;
334 			remain = bitmap_clear_ll(chunk->bits, start_bit, nbits);
335 			BUG_ON(remain);
336 			size = nbits << order;
337 			atomic_add(size, &chunk->avail);
338 			rcu_read_unlock();
339 			return;
340 		}
341 	}
342 	rcu_read_unlock();
343 	BUG();
344 }
345 EXPORT_SYMBOL(gen_pool_free);
346 
347 /**
348  * gen_pool_for_each_chunk - call func for every chunk of generic memory pool
349  * @pool:	the generic memory pool
350  * @func:	func to call
351  * @data:	additional data used by @func
352  *
353  * Call @func for every chunk of generic memory pool.  The @func is
354  * called with rcu_read_lock held.
355  */
356 void gen_pool_for_each_chunk(struct gen_pool *pool,
357 	void (*func)(struct gen_pool *pool, struct gen_pool_chunk *chunk, void *data),
358 	void *data)
359 {
360 	struct gen_pool_chunk *chunk;
361 
362 	rcu_read_lock();
363 	list_for_each_entry_rcu(chunk, &(pool)->chunks, next_chunk)
364 		func(pool, chunk, data);
365 	rcu_read_unlock();
366 }
367 EXPORT_SYMBOL(gen_pool_for_each_chunk);
368 
369 /**
370  * gen_pool_avail - get available free space of the pool
371  * @pool: pool to get available free space
372  *
373  * Return available free space of the specified pool.
374  */
375 size_t gen_pool_avail(struct gen_pool *pool)
376 {
377 	struct gen_pool_chunk *chunk;
378 	size_t avail = 0;
379 
380 	rcu_read_lock();
381 	list_for_each_entry_rcu(chunk, &pool->chunks, next_chunk)
382 		avail += atomic_read(&chunk->avail);
383 	rcu_read_unlock();
384 	return avail;
385 }
386 EXPORT_SYMBOL_GPL(gen_pool_avail);
387 
388 /**
389  * gen_pool_size - get size in bytes of memory managed by the pool
390  * @pool: pool to get size
391  *
392  * Return size in bytes of memory managed by the pool.
393  */
394 size_t gen_pool_size(struct gen_pool *pool)
395 {
396 	struct gen_pool_chunk *chunk;
397 	size_t size = 0;
398 
399 	rcu_read_lock();
400 	list_for_each_entry_rcu(chunk, &pool->chunks, next_chunk)
401 		size += chunk->end_addr - chunk->start_addr;
402 	rcu_read_unlock();
403 	return size;
404 }
405 EXPORT_SYMBOL_GPL(gen_pool_size);
406 
407 /**
408  * gen_pool_set_algo - set the allocation algorithm
409  * @pool: pool to change allocation algorithm
410  * @algo: custom algorithm function
411  * @data: additional data used by @algo
412  *
413  * Call @algo for each memory allocation in the pool.
414  * If @algo is NULL use gen_pool_first_fit as default
415  * memory allocation function.
416  */
417 void gen_pool_set_algo(struct gen_pool *pool, genpool_algo_t algo, void *data)
418 {
419 	rcu_read_lock();
420 
421 	pool->algo = algo;
422 	if (!pool->algo)
423 		pool->algo = gen_pool_first_fit;
424 
425 	pool->data = data;
426 
427 	rcu_read_unlock();
428 }
429 EXPORT_SYMBOL(gen_pool_set_algo);
430 
431 /**
432  * gen_pool_first_fit - find the first available region
433  * of memory matching the size requirement (no alignment constraint)
434  * @map: The address to base the search on
435  * @size: The bitmap size in bits
436  * @start: The bitnumber to start searching at
437  * @nr: The number of zeroed bits we're looking for
438  * @data: additional data - unused
439  */
440 unsigned long gen_pool_first_fit(unsigned long *map, unsigned long size,
441 		unsigned long start, unsigned int nr, void *data)
442 {
443 	return bitmap_find_next_zero_area(map, size, start, nr, 0);
444 }
445 EXPORT_SYMBOL(gen_pool_first_fit);
446 
447 /**
448  * gen_pool_best_fit - find the best fitting region of memory
449  * macthing the size requirement (no alignment constraint)
450  * @map: The address to base the search on
451  * @size: The bitmap size in bits
452  * @start: The bitnumber to start searching at
453  * @nr: The number of zeroed bits we're looking for
454  * @data: additional data - unused
455  *
456  * Iterate over the bitmap to find the smallest free region
457  * which we can allocate the memory.
458  */
459 unsigned long gen_pool_best_fit(unsigned long *map, unsigned long size,
460 		unsigned long start, unsigned int nr, void *data)
461 {
462 	unsigned long start_bit = size;
463 	unsigned long len = size + 1;
464 	unsigned long index;
465 
466 	index = bitmap_find_next_zero_area(map, size, start, nr, 0);
467 
468 	while (index < size) {
469 		int next_bit = find_next_bit(map, size, index + nr);
470 		if ((next_bit - index) < len) {
471 			len = next_bit - index;
472 			start_bit = index;
473 			if (len == nr)
474 				return start_bit;
475 		}
476 		index = bitmap_find_next_zero_area(map, size,
477 						   next_bit + 1, nr, 0);
478 	}
479 
480 	return start_bit;
481 }
482 EXPORT_SYMBOL(gen_pool_best_fit);
483