VOS_STATUS vos_timer_init_debug( vos_timer_t *timer, VOS_TIMER_TYPE timerType, vos_timer_callback_t callback, v_PVOID_t userData, char* fileName, v_U32_t lineNum ) { VOS_STATUS vosStatus; unsigned long flags; // Check for invalid pointer if ((timer == NULL) || (callback == NULL)) { VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "%s: Null params being passed",__func__); VOS_ASSERT(0); return VOS_STATUS_E_FAULT; } timer->ptimerNode = vos_mem_malloc(sizeof(timer_node_t)); if(timer->ptimerNode == NULL) { VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "%s: Not able to allocate memory for timeNode",__func__); VOS_ASSERT(0); return VOS_STATUS_E_FAULT; } vos_mem_set(timer->ptimerNode, sizeof(timer_node_t), 0); timer->ptimerNode->fileName = fileName; timer->ptimerNode->lineNum = lineNum; timer->ptimerNode->vosTimer = timer; spin_lock_irqsave(&vosTimerList.lock, flags); vosStatus = hdd_list_insert_front(&vosTimerList, &timer->ptimerNode->pNode); spin_unlock_irqrestore(&vosTimerList.lock, flags); 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); } // set the various members of the timer structure // with arguments passed or with default values spin_lock_init(&timer->platformInfo.spinlock); init_timer(&(timer->platformInfo.Timer)); timer->platformInfo.Timer.function = vos_linux_timer_callback; timer->platformInfo.Timer.data = (unsigned long)timer; timer->callback = callback; timer->userData = userData; timer->type = timerType; timer->platformInfo.cookie = LINUX_TIMER_COOKIE; timer->platformInfo.threadID = 0; timer->state = VOS_TIMER_STATE_STOPPED; return VOS_STATUS_SUCCESS; }
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; if (size > (1024*1024)) { VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "%s: called with arg > 1024K; passed in %d !!!", __FUNCTION__,size); return NULL; } if (in_interrupt()) { VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "%s is being called in interrupt context, using GPF_ATOMIC.", __FUNCTION__); return kmalloc(size, GFP_ATOMIC); } new_size = size + sizeof(struct s_vos_mem_struct) + 8; memStruct = (struct s_vos_mem_struct*)kmalloc(new_size,GFP_KERNEL); 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(&vosMemList.lock); vosStatus = hdd_list_insert_front(&vosMemList, &memStruct->pNode); spin_unlock(&vosMemList.lock); if(VOS_STATUS_SUCCESS != vosStatus) { VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "%s: Unable to insert node into List vosStatus %d\n", __FUNCTION__, vosStatus); } memPtr = (v_VOID_t*)(memStruct + 1); } return memPtr; }
v_VOID_t * vos_mem_dma_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; if (in_interrupt()) { VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "%s cannot be called from interrupt context!!!", __func__); return NULL; } if (!memory_dbug_flag) return kmalloc(size, GFP_KERNEL); new_size = size + sizeof(struct s_vos_mem_struct) + 8; memStruct = (struct s_vos_mem_struct*)kmalloc(new_size,GFP_KERNEL); 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(&vosMemList.lock); vosStatus = hdd_list_insert_front(&vosMemList, &memStruct->pNode); spin_unlock(&vosMemList.lock); 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, 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; }