qcacmn: Add QDF Kmem cache support

Introduce QDF abstraction APIs for handling kmem cache
create/destroy/alloc/free

Change-Id: I46fa8e5e3891a3665fb230b737ef66ff65b5135e
CRs-Fixed: 3274919
This commit is contained in:
Amir Patel
2022-08-29 11:45:18 +05:30
committed by Madan Koyyalamudi
parent f9c54b61a3
commit 8983dd04f8
3 changed files with 131 additions and 0 deletions

View File

@@ -648,6 +648,59 @@ static inline void qdf_mempool_free(qdf_device_t osdev, qdf_mempool_t pool,
__qdf_mempool_free(osdev, pool, buf);
}
/**
* qdf_kmem_cache_create() - OS abstraction for cache creation
*
* @cache_name: Cache name
* @size: Size of the object to be created
*
* Return: Cache address on successful creation, else NULL
*/
static inline qdf_kmem_cache_t
qdf_kmem_cache_create(const char *cache_name,
qdf_size_t size)
{
return __qdf_kmem_cache_create(cache_name, size);
}
/**
* qdf_kmem_cache_destroy() - OS abstraction for cache destructin
*
* @cache: Cache pointer
*
* Return: void
*/
static inline void qdf_kmem_cache_destroy(qdf_kmem_cache_t cache)
{
__qdf_kmem_cache_destroy(cache);
}
/**
* qdf_kmem_cache_alloc() - Function to allocation object from a cache
*
* @cache: Cache address
*
* Return: Object from cache
*
*/
static inline void *qdf_kmem_cache_alloc(qdf_kmem_cache_t cache)
{
return __qdf_kmem_cache_alloc(cache);
}
/**
* qdf_kmem_cache_free() - Function to free cache object
*
* @cache: Cache address
* @object: Object to be returned to cache
*
* Return: void
*/
static inline void qdf_kmem_cache_free(qdf_kmem_cache_t cache, void *node)
{
__qdf_kmem_cache_free(cache, node);
}
void qdf_mem_dma_sync_single_for_device(qdf_device_t osdev,
qdf_dma_addr_t bus_addr,
qdf_size_t size,

View File

@@ -102,6 +102,7 @@ typedef struct __qdf_mempool_ctxt {
u_int32_t free_cnt;
} __qdf_mempool_ctxt_t;
typedef struct kmem_cache *qdf_kmem_cache_t;
#endif /* __KERNEL__ */
#define __page_size ((size_t)PAGE_SIZE)
@@ -210,6 +211,11 @@ int __qdf_mempool_init(qdf_device_t osdev, __qdf_mempool_t *pool, int pool_cnt,
void __qdf_mempool_destroy(qdf_device_t osdev, __qdf_mempool_t pool);
void *__qdf_mempool_alloc(qdf_device_t osdev, __qdf_mempool_t pool);
void __qdf_mempool_free(qdf_device_t osdev, __qdf_mempool_t pool, void *buf);
qdf_kmem_cache_t __qdf_kmem_cache_create(const char *cache_name,
qdf_size_t size);
void __qdf_kmem_cache_destroy(qdf_kmem_cache_t cache);
void* __qdf_kmem_cache_alloc(qdf_kmem_cache_t cache);
void __qdf_kmem_cache_free(qdf_kmem_cache_t cache, void *node);
#define QDF_RET_IP ((void *)_RET_IP_)
#define __qdf_mempool_elem_size(_pool) ((_pool)->elem_size)
@@ -606,6 +612,7 @@ __qdf_mem_set_dma_pa(qdf_device_t osdev,
mem_info->pa = dma_pa;
}
/**
* __qdf_mem_alloc_consistent() - allocates consistent qdf memory
* @osdev: OS device handle

View File

@@ -3068,3 +3068,74 @@ qdf_dma_addr_t qdf_mem_paddr_from_dmaaddr(qdf_device_t osdev,
qdf_export_symbol(qdf_mem_paddr_from_dmaaddr);
#endif
#ifdef QCA_KMEM_CACHE_SUPPORT
qdf_kmem_cache_t
__qdf_kmem_cache_create(const char *cache_name,
qdf_size_t size)
{
struct kmem_cache *cache;
cache = kmem_cache_create(cache_name, size,
0, 0, NULL);
if (!cache)
return NULL;
return cache;
}
qdf_export_symbol(__qdf_kmem_cache_create);
void
__qdf_kmem_cache_destroy(qdf_kmem_cache_t cache)
{
kmem_cache_destroy(cache);
}
qdf_export_symbol(__qdf_kmem_cache_destroy);
void*
__qdf_kmem_cache_alloc(qdf_kmem_cache_t cache)
{
int flags = GFP_KERNEL;
if (in_interrupt() || irqs_disabled() || in_atomic())
flags = GFP_ATOMIC;
return kmem_cache_alloc(cache, flags);
}
qdf_export_symbol(__qdf_kmem_cache_alloc);
void
__qdf_kmem_cache_free(qdf_kmem_cache_t cache, void *node)
{
kmem_cache_free(cache, node);
}
qdf_export_symbol(__qdf_kmem_cache_free);
#else
qdf_kmem_cache_t
__qdf_kmem_cache_create(const char *cache_name,
qdf_size_t size)
{
return NULL;
}
void
__qdf_kmem_cache_destroy(qdf_kmem_cache_t cache)
{
}
void *
__qdf_kmem_cache_alloc(qdf_kmem_cache_t cache)
{
return NULL;
}
void
__qdf_kmem_cache_free(qdf_kmem_cache_t cache, void *node)
{
}
#endif