/* SPDX-License-Identifier: GPL-2.0-only */ /* * Basic general purpose allocator for managing special purpose * memory, for example, memory that is not managed by the regular * kmalloc/kfree interface. Uses for this includes on-device special * memory, uncached memory etc. * * It is safe to use the allocator in NMI handlers and other special * unblockable contexts that could otherwise deadlock on locks. This * is implemented by using atomic operations and retries on any * conflicts. The disadvantage is that there may be livelocks in * extreme cases. For better scalability, one allocator can be used * for each CPU. * * The lockless operation only works if there is enough memory * available. If new memory is added to the pool a lock has to be * still taken. So any user relying on locklessness has to ensure * that sufficient memory is preallocated. * * The basic atomic operation of this allocator is cmpxchg on long. * On architectures that don't have NMI-safe cmpxchg implementation, * the allocator can NOT be used in NMI handler. So code uses the * allocator in NMI handler should depend on * CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG.
*/
/** * typedef genpool_algo_t: Allocation callback function type definition * @map: Pointer to bitmap * @size: The bitmap size in bits * @start: The bitnumber to start searching at * @nr: The number of zeroed bits we're looking for * @data: optional additional data used by the callback * @pool: the pool being allocated from
*/ typedefunsignedlong (*genpool_algo_t)(unsignedlong *map, unsignedlong size, unsignedlong start, unsignedint nr, void *data, struct gen_pool *pool, unsignedlong start_addr);
/* * General purpose special memory pool descriptor.
*/ struct gen_pool {
spinlock_t lock; struct list_head chunks; /* list of chunks in this pool */ int min_alloc_order; /* minimum allocation order */
genpool_algo_t algo; /* allocation function */ void *data;
constchar *name;
};
/* * General purpose special memory pool chunk descriptor.
*/ struct gen_pool_chunk { struct list_head next_chunk; /* next chunk in pool */
atomic_long_t avail;
phys_addr_t phys_addr; /* physical starting address of memory chunk */ void *owner; /* private data to retrieve at alloc time */ unsignedlong start_addr; /* start address of memory chunk */ unsignedlong end_addr; /* end address of memory chunk (inclusive) */ unsignedlong bits[]; /* bitmap for allocating memory chunk */
};
/* * gen_pool data descriptor for gen_pool_first_fit_align.
*/ struct genpool_data_align { int align; /* alignment by bytes for starting address */
};
/* * gen_pool data descriptor for gen_pool_fixed_alloc.
*/ struct genpool_data_fixed { unsignedlong offset; /* The offset of the specific region */
};
/** * gen_pool_add - add a new chunk of special memory to the pool * @pool: pool to add new memory chunk to * @addr: starting address of memory chunk to add to pool * @size: size in bytes of the memory chunk to add to pool * @nid: node id of the node the chunk structure and bitmap should be * allocated on, or -1 * * Add a new chunk of special memory to the specified pool. * * Returns 0 on success or a -ve errno on failure.
*/ staticinlineint gen_pool_add(struct gen_pool *pool, unsignedlong addr,
size_t size, int nid)
{ return gen_pool_add_virt(pool, addr, -1, size, nid);
} externvoid gen_pool_destroy(struct gen_pool *); unsignedlong gen_pool_alloc_algo_owner(struct gen_pool *pool, size_t size,
genpool_algo_t algo, void *data, void **owner);
/** * gen_pool_alloc - allocate special memory from the pool * @pool: pool to allocate from * @size: number of bytes to allocate from the pool * * Allocate the requested number of bytes from the specified pool. * Uses the pool allocation function (with first-fit algorithm by default). * Can not be used in NMI handler on architectures without * NMI-safe cmpxchg implementation.
*/ staticinlineunsignedlong gen_pool_alloc(struct gen_pool *pool, size_t size)
{ return gen_pool_alloc_algo(pool, size, pool->algo, pool->data);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.