genalloc.h 1.1 KB
Newer Older
J
Jes Sorensen 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
/*
 * Basic general purpose allocator for managing special purpose memory
 * not managed by the regular kmalloc/kfree interface.
 * Uses for this includes on-device special memory, uncached memory
 * etc.
 *
 * This code is based on the buddy allocator found in the sym53c8xx_2
 * driver, adapted for general purpose use.
 *
 * This source code is licensed under the GNU General Public License,
 * Version 2.  See the file COPYING for more details.
 */

#include <linux/spinlock.h>

#define ALLOC_MIN_SHIFT		5 /* 32 bytes minimum */
/*
 *  Link between free memory chunks of a given size.
 */
struct gen_pool_link {
	struct gen_pool_link *next;
};

/*
 *  Memory pool descriptor.
 */
struct gen_pool {
	spinlock_t lock;
	unsigned long (*get_new_chunk)(struct gen_pool *);
	struct gen_pool *next;
	struct gen_pool_link *h;
	unsigned long private;
	int max_chunk_shift;
};

unsigned long gen_pool_alloc(struct gen_pool *poolp, int size);
void gen_pool_free(struct gen_pool *mp, unsigned long ptr, int size);
struct gen_pool *gen_pool_create(int nr_chunks, int max_chunk_shift,
				 unsigned long (*fp)(struct gen_pool *),
				 unsigned long data);