/** * cdf_mem_malloc() - allocation CDF memory * @size: Number of bytes of memory to allocate. * * This function will dynamicallly allocate the specified number of bytes of * memory. * * * Return: * Upon successful allocate, returns a non-NULL pointer to the allocated * memory. If this function is unable to allocate the amount of memory * specified (for any reason) it returns %NULL. * */ void *cdf_mem_malloc(size_t size) { int flags = GFP_KERNEL; #ifdef CONFIG_WCNSS_MEM_PRE_ALLOC void *pmem; #endif if (size > (1024 * 1024) || size == 0) { CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR, "%s: called with invalid arg; passed in %zu !!", __func__, size); return NULL; } #if defined(CONFIG_CNSS) && defined(CONFIG_WCNSS_MEM_PRE_ALLOC) if (size > WCNSS_PRE_ALLOC_GET_THRESHOLD) { pmem = wcnss_prealloc_get(size); if (NULL != pmem) { memset(pmem, 0, size); return pmem; } } #endif if (in_interrupt() || irqs_disabled() || in_atomic()) flags = GFP_ATOMIC; return kzalloc(size, flags); }
v_VOID_t * vos_mem_malloc( v_SIZE_t size ) { int flags = GFP_KERNEL; #ifdef CONFIG_WCNSS_MEM_PRE_ALLOC v_VOID_t* pmem; #endif if (size > (1024*1024)) { VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "%s: called with arg > 1024K; passed in %d !!!", __func__,size); return NULL; } if (in_interrupt() || irqs_disabled() || in_atomic()) { flags = GFP_ATOMIC; } #ifdef CONFIG_WCNSS_MEM_PRE_ALLOC if(size > WCNSS_PRE_ALLOC_GET_THRESHOLD) { pmem = wcnss_prealloc_get(size); if(NULL != pmem) return pmem; } #endif return kmalloc(size, flags); }
/** * cdf_mem_malloc_debug() - debug version of CDF memory allocation API * @size: Number of bytes of memory to allocate. * @fileName: File name from which memory allocation is called * @lineNum: Line number from which memory allocation is called * * This function will dynamicallly allocate the specified number of bytes of * memory and ad it in cdf tracking list to check against memory leaks and * corruptions * * * Return: * Upon successful allocate, returns a non-NULL pointer to the allocated * memory. If this function is unable to allocate the amount of memory * specified (for any reason) it returns %NULL. * */ void *cdf_mem_malloc_debug(size_t size, char *fileName, uint32_t lineNum) { struct s_cdf_mem_struct *memStruct; void *memPtr = NULL; uint32_t new_size; int flags = GFP_KERNEL; if (size > (1024 * 1024) || size == 0) { CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR, "%s: called with invalid arg; passed in %zu !!!", __func__, size); return NULL; } #if defined(CONFIG_CNSS) && defined(CONFIG_WCNSS_MEM_PRE_ALLOC) if (size > WCNSS_PRE_ALLOC_GET_THRESHOLD) { void *pmem; pmem = wcnss_prealloc_get(size); if (NULL != pmem) { memset(pmem, 0, size); return pmem; } } #endif if (in_interrupt() || irqs_disabled() || in_atomic()) flags = GFP_ATOMIC; new_size = size + sizeof(struct s_cdf_mem_struct) + 8; memStruct = (struct s_cdf_mem_struct *)kzalloc(new_size, flags); if (memStruct != NULL) { CDF_STATUS cdf_status; memStruct->fileName = fileName; memStruct->lineNum = lineNum; memStruct->size = size; cdf_mem_copy(&memStruct->header[0], &WLAN_MEM_HEADER[0], sizeof(WLAN_MEM_HEADER)); cdf_mem_copy((uint8_t *) (memStruct + 1) + size, &WLAN_MEM_TAIL[0], sizeof(WLAN_MEM_TAIL)); cdf_spin_lock_irqsave(&cdf_mem_list_lock); cdf_status = cdf_list_insert_front(&cdf_mem_list, &memStruct->pNode); cdf_spin_unlock_irqrestore(&cdf_mem_list_lock); if (CDF_STATUS_SUCCESS != cdf_status) { CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR, "%s: Unable to insert node into List cdf_status %d", __func__, cdf_status); } memPtr = (void *)(memStruct + 1); } return memPtr; }
v_VOID_t * vos_mem_malloc( v_SIZE_t size ) { int flags = GFP_KERNEL; #ifdef CONFIG_WCNSS_MEM_PRE_ALLOC v_VOID_t* pmem; #endif v_VOID_t* memPtr = NULL; unsigned long time_before_kmalloc; if (size > (1024*1024) || size == 0) { VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "%s: called with invalid arg %u !!", __func__, size); vos_log_low_resource_failure(WIFI_EVENT_MEMORY_FAILURE); return NULL; } if (in_interrupt() || irqs_disabled() || in_atomic()) { flags = GFP_ATOMIC; } #ifdef CONFIG_WCNSS_MEM_PRE_ALLOC if(size > WCNSS_PRE_ALLOC_GET_THRESHOLD) { pmem = wcnss_prealloc_get(size); if(NULL != pmem) { memset(pmem, 0, size); return pmem; } } #endif time_before_kmalloc = vos_timer_get_system_time(); memPtr = kmalloc(size, flags); /* If time taken by kmalloc is greater than * VOS_GET_MEMORY_TIME_THRESHOLD msec */ if (vos_timer_get_system_time() - time_before_kmalloc >= VOS_GET_MEMORY_TIME_THRESHOLD) VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "%s: kmalloc took %lu msec for size %d from %pS", __func__, vos_timer_get_system_time() - time_before_kmalloc, size, (void *)_RET_IP_); if (!memPtr) vos_log_low_resource_failure(WIFI_EVENT_MEMORY_FAILURE); return memPtr; }
v_VOID_t * vos_mem_malloc( v_SIZE_t size ) { int flags = GFP_KERNEL; v_VOID_t* memPtr = NULL; #ifdef CONFIG_WCNSS_MEM_PRE_ALLOC v_VOID_t* pmem; #endif unsigned long time_before_kmalloc; if (size > (1024*1024) || size == 0) { VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "%s: called with invalid arg %u !!!", __func__, size); return NULL; } if (in_interrupt() || irqs_disabled() || in_atomic()) { flags = GFP_ATOMIC; } #ifdef CONFIG_WCNSS_MEM_PRE_ALLOC if(size > WCNSS_PRE_ALLOC_GET_THRESHOLD) { pmem = wcnss_prealloc_get(size); if(NULL != pmem) return pmem; } #endif time_before_kmalloc = vos_timer_get_system_time(); memPtr = kmalloc(size, flags); /* If time taken by kmalloc is greater than VOS_GET_MEMORY_TIME_THRESHOLD * msec */ if (vos_timer_get_system_time() - time_before_kmalloc >= VOS_GET_MEMORY_TIME_THRESHOLD) VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "%s: kmalloc took %lu msec", __func__, vos_timer_get_system_time() - time_before_kmalloc); return memPtr; }
v_VOID_t *vos_mem_malloc_debug(v_SIZE_t size, const char *fileName, v_U32_t lineNum) { struct s_vos_mem_struct* memStruct; v_VOID_t* memPtr = NULL; v_SIZE_t new_size; int flags = GFP_KERNEL; unsigned long IrqFlags; unsigned long time_before_kmalloc; if (size > (1024*1024)|| size == 0) { VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "%s: called with invalid arg %u !!!", __func__, size); return NULL; } if (in_interrupt() || in_atomic() || irqs_disabled()) { flags = GFP_ATOMIC; } #ifdef CONFIG_WCNSS_MEM_PRE_ALLOC if (size > WCNSS_PRE_ALLOC_GET_THRESHOLD) { v_VOID_t *pmem; pmem = wcnss_prealloc_get(size); if (NULL != pmem) { memset(pmem, 0, size); return pmem; } } #endif new_size = size + sizeof(struct s_vos_mem_struct) + 8; time_before_kmalloc = vos_timer_get_system_time(); memStruct = (struct s_vos_mem_struct*)kmalloc(new_size, flags); /* If time taken by kmalloc is greater than * VOS_GET_MEMORY_TIME_THRESHOLD msec */ if (vos_timer_get_system_time() - time_before_kmalloc >= VOS_GET_MEMORY_TIME_THRESHOLD) VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "%s: kmalloc took %lu msec for size %d called from %pS at line %d", __func__, vos_timer_get_system_time() - time_before_kmalloc, size, (void *)_RET_IP_, lineNum); if(memStruct != NULL) { VOS_STATUS vosStatus; memStruct->fileName = fileName; memStruct->lineNum = lineNum; memStruct->size = size; vos_mem_save_stack_trace(memStruct); vos_mem_copy(&memStruct->header[0], &WLAN_MEM_HEADER[0], sizeof(WLAN_MEM_HEADER)); vos_mem_copy( (v_U8_t*)(memStruct + 1) + size, &WLAN_MEM_TAIL[0], sizeof(WLAN_MEM_TAIL)); spin_lock_irqsave(&vosMemList.lock, IrqFlags); vosStatus = hdd_list_insert_front(&vosMemList, &memStruct->pNode); alloc_trace_usage(fileName, lineNum, size); spin_unlock_irqrestore(&vosMemList.lock, IrqFlags); if(VOS_STATUS_SUCCESS != vosStatus) { VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "%s: Unable to insert node into List vosStatus %d", __func__, vosStatus); } memPtr = (v_VOID_t*)(memStruct + 1); } return memPtr; }
v_VOID_t * vos_mem_malloc_debug( v_SIZE_t size, char* fileName, v_U32_t lineNum) { struct s_vos_mem_struct* memStruct; v_VOID_t* memPtr = NULL; v_SIZE_t new_size; int flags = GFP_KERNEL; unsigned long IrqFlags; if (size > (1024*1024)) { VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "%s: called with arg > 1024K; passed in %d !!!", __func__,size); return NULL; } if (in_interrupt()) { flags = GFP_ATOMIC; } if (!memory_dbug_flag) { #ifdef CONFIG_WCNSS_MEM_PRE_ALLOC v_VOID_t* pmem; if (size > WCNSS_PRE_ALLOC_GET_THRESHOLD) { pmem = wcnss_prealloc_get(size); if (NULL != pmem) return pmem; } #endif return kmalloc(size, flags); } new_size = size + sizeof(struct s_vos_mem_struct) + 8; memStruct = (struct s_vos_mem_struct*)kmalloc(new_size, flags); if(memStruct != NULL) { VOS_STATUS vosStatus; memStruct->fileName = fileName; memStruct->lineNum = lineNum; memStruct->size = size; vos_mem_copy(&memStruct->header[0], &WLAN_MEM_HEADER[0], sizeof(WLAN_MEM_HEADER)); vos_mem_copy( (v_U8_t*)(memStruct + 1) + size, &WLAN_MEM_TAIL[0], sizeof(WLAN_MEM_TAIL)); spin_lock_irqsave(&vosMemList.lock, IrqFlags); vosStatus = hdd_list_insert_front(&vosMemList, &memStruct->pNode); spin_unlock_irqrestore(&vosMemList.lock, IrqFlags); if(VOS_STATUS_SUCCESS != vosStatus) { VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "%s: Unable to insert node into List vosStatus %d", __func__, vosStatus); } memPtr = (v_VOID_t*)(memStruct + 1); } return memPtr; }