diff --git a/qdf/inc/qdf_mem.h b/qdf/inc/qdf_mem.h index d9e5d28b24..8bb73ea6a4 100644 --- a/qdf/inc/qdf_mem.h +++ b/qdf/inc/qdf_mem.h @@ -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, diff --git a/qdf/linux/src/i_qdf_mem.h b/qdf/linux/src/i_qdf_mem.h index e7e926f650..3ff683fe4f 100644 --- a/qdf/linux/src/i_qdf_mem.h +++ b/qdf/linux/src/i_qdf_mem.h @@ -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 diff --git a/qdf/linux/src/qdf_mem.c b/qdf/linux/src/qdf_mem.c index c2a3b3ab0e..116edb18ea 100644 --- a/qdf/linux/src/qdf_mem.c +++ b/qdf/linux/src/qdf_mem.c @@ -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