VOS_VOID IMM_MemGetAllocFailCnt(VOS_VOID) { VOS_UINT16 usLoop; IMM_LOG(UEPS_PID_IMM_RB_FREE, IMM_PRINT_NORMAL, "IMM_MemGetAllocFailCnt Start: \n"); IMM_LOG1(UEPS_PID_IMM_RB_FREE, IMM_PRINT_NORMAL, "IMM_MemGetAllocFailCnt Threshold: %d \n", g_usImmAllocFailCntThreshold); #if ( FEATURE_ON == FEATURE_SKB_EXP ) /* 打印 SKB 控制结点申请失败次数 */ skb_get_fail_cnt(); #endif for( usLoop = 0; usLoop < IMM_MEM_POOL_ID_BUTT; ++usLoop ) { IMM_LOG1(UEPS_PID_IMM_RB_FREE, IMM_PRINT_NORMAL, "IMM Mem Pool ID: %d \n", usLoop); IMM_LOG3(UEPS_PID_IMM_RB_FREE, IMM_PRINT_NORMAL, "IMM Mem Alloc Fail Cnt: %d * %d + %d \n", *g_apusImmExcThresholdCnt[usLoop], g_usImmAllocFailCntThreshold, *g_apusImmAllocFailCnt[usLoop]); } IMM_LOG(UEPS_PID_IMM_RB_FREE, IMM_PRINT_NORMAL, "IMM_MemGetAllocFailCnt End. \n"); return; }/* IMM_MemGetAllocFailCnt */
VOS_VOID IMM_RbRemoteFreeMem(VOS_VOID *pucAddr) { VOS_UINT32 ulResult; VOS_UINT32 ulNum; VOS_INT32 lIsrRet; /* 中断操作返回值 */ VOS_ULONG ulFlags = 0UL; if ( VOS_NULL_PTR == pucAddr ) { VOS_SpinLockIntLock(&g_stImmRbSpinLock, ulFlags); g_stImmMemFreeMntnEntity.ulImmMemExtFreeFailCnt++; VOS_SpinUnlockIntUnlock(&g_stImmRbSpinLock, ulFlags); IMM_LOG(UEPS_PID_IMM_RB_FREE, IMM_PRINT_WARNING, "IMM_RB, IMM_RbRemoteFreeMem, pucAddr is Null!\n"); return; } VOS_SpinLockIntLock (&g_stImmRbSpinLock, ulFlags); /* 将TTF_MEM地址放入释放队列 */ ulResult = LUP_EnSharedQueAcpu(g_pstAcpuTTFMemFreeQue, pucAddr); g_stImmMemRbMntnEntity.ulImmMemRbEnQTotalCnt++; ulNum = LUP_QueCnt(g_pstAcpuTTFMemFreeQue); VOS_SpinUnlockIntUnlock(&g_stImmRbSpinLock, ulFlags); if (PS_SUCC != ulResult) { VOS_SpinLockIntLock (&g_stImmRbSpinLock, ulFlags); g_stImmMemRbMntnEntity.ulImmMemRbEnQFailCnt++; VOS_SpinUnlockIntUnlock(&g_stImmRbSpinLock, ulFlags); IMM_LOG(UEPS_PID_IMM_RB_FREE, IMM_PRINT_ERROR, "ERROR:IMM_RbRemoteFreeMem: LUP_EnSharedQueAcpu fail!\n"); } #ifndef WTTF_PS_FUSION_PC_ST if ( 0 == (ulNum & g_ulFreeIMMMemBlkNoticNum)) { /* 触发IPC中断 */ lIsrRet = IMM_MEM_TRIG_IPC_MEMRB_INT(IPC_CORE_COMARM, IMM_IPC_MEM_RECYCLE_INT); VOS_SpinLockIntLock (&g_stImmRbSpinLock, ulFlags); g_stImmMemRbMntnEntity.ulImmMemRbSendIntCnt++; VOS_SpinUnlockIntUnlock(&g_stImmRbSpinLock, ulFlags); if (lIsrRet != VOS_OK) { IMM_LOG(UEPS_PID_IMM_RB_FREE, IMM_PRINT_ERROR, "ERROR:IMM_RbRemoteFreeMem: mdrv_ipc_int_send fail!\n"); } } #else lIsrRet = VHW_IPC_IntSend((IPC_INT_CORE_E)IPC_CORE_COMARM, (IPC_INT_LEV_E)IPC_INT_DICC_RELDATA); g_stImmMemRbMntnEntity.ulImmMemRbSendIntCnt++; if (lIsrRet != VOS_OK) { IMM_LOG(UEPS_PID_IMM_RB_FREE, IMM_PRINT_ERROR, "ERROR:IMM_RbRemoteFreeMem: mdrv_ipc_int_send fail!\n"); } #endif return; }/*IMM_RbRemoteFreeMem*/
VOS_VOID IMM_MntnMemUseBlkCntRpt ( VOS_UINT8 ucPoolId, IMM_MEM_USED_INFO_TRIG_TYPE_ENUM_UINT8 enTrigType ) { VOS_UINT32 ulTotalCnt; VOS_UINT32 ulLength; VOS_UINT32 ulDataLen; PS_OM_EVENT_IND_STRU *pstImmOmEventInd; IMM_MEM_POOL_STRU *pstPoolInfo; IMM_OM_EVENT_BLK_MEM_USED_INFO_STRU *pstImmOmEventBlkMemUsedInfo; pstPoolInfo = IMM_MEM_GET_POOL(ucPoolId); ulDataLen = offsetof(IMM_OM_EVENT_BLK_MEM_USED_INFO_STRU, astBlkMemTraceInfo); /*消息总长度*/ ulLength = offsetof(PS_OM_EVENT_IND_STRU, aucData) + ulDataLen; /*申请消息内存*/ pstImmOmEventInd = (PS_OM_EVENT_IND_STRU *)PS_MEM_ALLOC(UEPS_PID_IMM_RB_FREE, ulLength); if (VOS_NULL_PTR == pstImmOmEventInd ) { IMM_LOG(UEPS_PID_IMM_RB_FREE, IMM_PRINT_ERROR, "IMM_BlkMemUsedInfoEventRpt: MemAlloc Fail!\n"); return; } ulTotalCnt = pstPoolInfo->usImmMemUsedCnt; /*填写消息内容*/ pstImmOmEventInd->ulLength = ulLength - offsetof( PS_OM_EVENT_IND_STRU, usEventId); pstImmOmEventInd->usEventId = IMM_EVENT_BLK_MEM_USED_INFO; pstImmOmEventInd->ulModuleId = UEPS_PID_IMM_RB_FREE; pstImmOmEventBlkMemUsedInfo = (IMM_OM_EVENT_BLK_MEM_USED_INFO_STRU *)pstImmOmEventInd->aucData; pstImmOmEventBlkMemUsedInfo->ucPoolId = ucPoolId; pstImmOmEventBlkMemUsedInfo->enTrigType = enTrigType; pstImmOmEventBlkMemUsedInfo->ucNo = 1; pstImmOmEventBlkMemUsedInfo->usRptCnt = 0; pstImmOmEventBlkMemUsedInfo->ulTotalUsedCnt = ulTotalCnt; /*调用OM的事件上报接口*/ if ( PS_SUCC != OM_AcpuEvent((PS_OM_EVENT_IND_STRU*)pstImmOmEventInd)) { IMM_LOG(UEPS_PID_IMM_RB_FREE, IMM_PRINT_ERROR, "IMM_BlkMemUsedInfoEventRpt: OM Send Event Fail! \n"); } /*释放申请的内存*/ PS_MEM_FREE(UEPS_PID_IMM_RB_FREE, pstImmOmEventInd); return; }/* IMM_MntnMemUseBlkCntRpt */
/***************************************************************************** 函 数 名 : IMM_ZcDataTransformImmZc_Debug 功能描述 : 数据块的挂接到IMM_ZC_STRU上。 输入参数 : unsigned char *pucData 数据块内存地址 unsigned long ulLen 数据块长度 void *pstTtfMem 数据块控制节点指针 输出参数 : 无 返 回 值 : skbuf 指针 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2011年12月2日 修改内容 : Created *****************************************************************************/ IMM_ZC_STRU * IMM_ZcDataTransformImmZc_Debug(unsigned short usFileID, unsigned short usLineNum, const unsigned char *pucData, unsigned long ulLen, void *pstTtfMem) { IMM_ZC_STRU *pstSkb = NULL; /* MBB形态, 将数据块的挂接到IMM_ZC_STRU上 */ unsigned long ulDataReservedHead; unsigned long ulDataReservedTail = 0; unsigned long ulDataAllign = 32; IMM_DEBUG_TRACE_FUNC_ENTER(); if ( NULL == pstTtfMem ) { IMM_LOG(UEPS_PID_IMM_RB_RECYCLE, IMM_PRINT_ERROR, "IMM_DataTranferImmZc pstTtfMem ptr is null! \n"); return NULL; } if ( NULL == pucData ) { IMM_LOG(UEPS_PID_IMM_RB_RECYCLE, IMM_PRINT_ERROR, "IMM_DataTranferImmZc pucData ptr is null! \n"); IMM_RbRemoteFreeMem(pstTtfMem); return NULL; } ulDataReservedHead = IMM_MAC_HEADER_RES_LEN; #if((FEATURE_LTE == FEATURE_OFF) && (FEATURE_WIFI == FEATURE_ON )) ulDataReservedTail = DRV_WIFI_DATA_RESERVED_TAIL(IMM_MAC_HEADER_RES_LEN + ulLen); #else ulDataReservedTail = ((IMM_MAC_HEADER_RES_LEN + ulLen + (ulDataAllign - 1))&(~(ulDataAllign - 1))) - (ulLen+IMM_MAC_HEADER_RES_LEN); #endif pstSkb = dev_alloc_skb_ext(ulLen, (unsigned char *)pucData, ulDataReservedHead, ulDataReservedTail); if ( NULL == pstSkb ) { IMM_RbRemoteFreeMem(pstTtfMem); IMM_LOG(UEPS_PID_IMM_RB_RECYCLE, IMM_PRINT_ERROR, "IMM_DataTranferImmZc dev_alloc_skb_ext fail! \n"); return NULL; } ((IMM_MEM_STRU *)pstSkb->private_mem.pMem)->pstMemBlk = (void *)pstTtfMem; IMM_DEBUG_TRACE_FUNC_LEAVE(); return pstSkb; }/* IMM_ZcDataTransformImmZc_Debug */
VOS_VOID IMM_RbRxFreeMemTask(VOS_VOID) { /* 解决UT死循环问题 */ #ifdef __UT_CENTER__ VOS_UINT32 ulLoop; #endif IMM_RbRxFreeMemTaskInit(); #ifndef __UT_CENTER__ for ( ; ; ) #else for (ulLoop = 0; ulLoop < 1; ulLoop++) #endif { /* semphore take g_stImcLinuxManageEntity.ulRatRxRelSkBuffSem */ if(VOS_OK != VOS_SmP(g_ulImmMemRbFreeSem, 0)) { IMM_LOG(UEPS_PID_IMM_RB_FREE, IMM_PRINT_ERROR, "IMM_RB, IMM_RbRxFreeMemTask : ERROR : VOS_SmP Failed!\n"); continue; } /* 释放 */ IMM_RbMemFreeFromQue(); #if ( FEATURE_ON == FEATURE_IMM_MEM_DEBUG ) IMM_MntnRptPoolLeakInfo(); #endif } }/* IMM_RbRxFreeMemTask */
/***************************************************************************** 函 数 名 : IMM_ZcRemoveMacHead 功能描述 : 移除零拷贝结构MAC头 输入参数 : IMM_ZC_STRU *pstImmZc 输出参数 : 无 返 回 值 : VOS_OK 添加成功 VOS_ERR 添加失败 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2011年12月2日 修改内容 : Created *****************************************************************************/ unsigned long IMM_ZcRemoveMacHead(IMM_ZC_STRU *pstImmZc) { IMM_DEBUG_TRACE_FUNC_ENTER(); if ( NULL == pstImmZc ) { IMM_LOG(UEPS_PID_IMM_RB_RECYCLE, IMM_PRINT_ERROR, "IMM_ZcRemoveMacHead pstImmZc ptr is null! \n"); return VOS_ERR; } if ( IMM_MAC_HEADER_RES_LEN > (pstImmZc->tail - pstImmZc->data) ) { IMM_LOG2(UEPS_PID_IMM_RB_RECYCLE, IMM_PRINT_ERROR, "IMM_ZcRemoveMacHead invalid data Len! tail = 0x%x, data = 0x%x \n", (VOS_INT32)pstImmZc->tail, (VOS_INT32)pstImmZc->data); return VOS_ERR; } IMM_ZcPull(pstImmZc, IMM_MAC_HEADER_RES_LEN); IMM_DEBUG_TRACE_FUNC_LEAVE(); return VOS_OK; }
VOS_UINT32 IMM_RbMemFreeFidInit ( enum VOS_INIT_PHASE_DEFINE ip ) { VOS_UINT32 ulRslt; VOS_UINT32 ulReturnCode; switch( ip ) { case VOS_IP_LOAD_CONFIG: /* IMM_RB 模块注册PID */ ulRslt = VOS_RegisterPIDInfo(UEPS_PID_IMM_RB_FREE, (Init_Fun_Type)IMM_RbMemFreePidInit, (Msg_Fun_Type)IMM_RbMemRelMsgProc); if( VOS_OK != ulRslt ) { IMM_LOG1(UEPS_PID_IMM_RB_FREE, IMM_PRINT_ERROR, "reg IMM_RbMemFreeFidInit VOS_RegisterPIDInfo FAIL! ulRslt: %d\n", (VOS_INT32)ulRslt); return (VOS_UINT32)VOS_ERROR; } ulRslt = VOS_RegisterTaskPrio(UEPS_FID_IMM_RB_FREE, IMM_RB_FREE_TASK_PRI_LINUX); if( VOS_OK != ulRslt ) { IMM_LOG1(UEPS_PID_IMM_RB_FREE, IMM_PRINT_ERROR, "reg MEMRECYLE task priority register FAIL ulRslt : %d !\n", (VOS_INT32)ulRslt); return (VOS_UINT32)VOS_ERROR; } /* IMM_RbRxFreeMemTask自处理任务注册 */ ulReturnCode = VOS_RegisterSelfTask(UEPS_FID_IMM_RB_FREE, (VOS_TASK_ENTRY_TYPE)IMM_RbRxFreeMemTask, VOS_PRIORITY_P5, (VOS_UINT32)IMM_RB_RX_MEM_FREE_TASK_STACK_SIZE_LINUX); if ( VOS_NULL_BYTE == ulReturnCode ) { IMM_LOG(UEPS_PID_IMM_RB_FREE, IMM_PRINT_ERROR, "IMM_RB, IMM_RbMemFreeFidInit, ERROR, Fail regist IMM_RxFreeMemTask \n" ); return VOS_ERR; } break; case VOS_IP_FARMALLOC: case VOS_IP_INITIAL: case VOS_IP_ENROLLMENT: case VOS_IP_LOAD_DATA: case VOS_IP_FETCH_DATA: case VOS_IP_STARTUP: case VOS_IP_RIVAL: case VOS_IP_KICKOFF: case VOS_IP_STANDBY: case VOS_IP_BROADCAST_STATE: case VOS_IP_RESTART: break; default: break; } return VOS_OK; }/* IMM_RbMemFreeFidInit */
VOS_VOID IMM_MemRbShowMntnInfo( VOS_VOID ) { IMM_LOG(UEPS_PID_IMM_RB_FREE, PS_PRINT_NORMAL, "==========================================\n" ); IMM_LOG(UEPS_PID_IMM_RB_FREE, PS_PRINT_NORMAL, "IMM MEM RB 可维可测信息 :\n" ); IMM_LOG1(UEPS_PID_IMM_RB_FREE, PS_PRINT_NORMAL, "C2A 核间释放队列中节点个数 : %d \n", (VOS_INT32)LUP_QueCnt(g_pstAcpuIMMMemFreeQue)); IMM_LOG1(UEPS_PID_IMM_RB_FREE, PS_PRINT_NORMAL, "A2C 核间释放队列中节点个数 : %d \n", (VOS_INT32)LUP_QueCnt(g_pstAcpuTTFMemFreeQue)); IMM_LOG1(UEPS_PID_IMM_RB_FREE, PS_PRINT_NORMAL, "ImmMemRb 出队失败次数 : %d \n", (VOS_INT32)g_stImmMemRbMntnEntity.ulImmMemRbDeQFailCnt); IMM_LOG1(UEPS_PID_IMM_RB_FREE, PS_PRINT_NORMAL, "ImmMemRb 出队总次数 : %d \n", (VOS_INT32)g_stImmMemRbMntnEntity.ulImmMemRbDeQTotalCnt); IMM_LOG1(UEPS_PID_IMM_RB_FREE, PS_PRINT_NORMAL, "ImmMemRb 入队失败次数 : %d \n", (VOS_INT32)g_stImmMemRbMntnEntity.ulImmMemRbEnQFailCnt); IMM_LOG1(UEPS_PID_IMM_RB_FREE, PS_PRINT_NORMAL, "ImmMemRb 入队总次数 : %d \n", (VOS_INT32)g_stImmMemRbMntnEntity.ulImmMemRbEnQTotalCnt); IMM_LOG1(UEPS_PID_IMM_RB_FREE, PS_PRINT_NORMAL, "ImmMemRb 收到IPF中断次数 : %d \n", (VOS_INT32)g_stImmMemRbMntnEntity.ulImmMemRbReceiveIntCnt); IMM_LOG1(UEPS_PID_IMM_RB_FREE, PS_PRINT_NORMAL, "ImmMemRb 向IPF发送中断次数 : %d \n", (VOS_INT32)g_stImmMemRbMntnEntity.ulImmMemRbSendIntCnt); return; }/* IMM_MemMntnInfo */
/***************************************************************************** 函 数 名 : IMM_ZcMapToImmMem 功能描述 : 把IMM_Zc零拷贝控制节点转换成IMM_Mem控制节点 输入参数 : IMM_ZC_STRU *pstImmZc 输出参数 : 无 返 回 值 : 成功:指向IMM_MEM_STRU的指针;失败:NULL。 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2011年12月1日 修改内容 : 新生成函数 *****************************************************************************/ IMM_MEM_STRU *IMM_ZcMapToImmMem_Debug(unsigned short usFileID, unsigned short usLineNum, IMM_ZC_STRU *pstImmZc) { IMM_MEM_STRU *pstImm = NULL; IMM_DEBUG_TRACE_FUNC_ENTER(); if ( NULL == pstImmZc ) { IMM_LOG(UEPS_PID_IMM_RB_RECYCLE, IMM_PRINT_ERROR, "IMM_ZcMapToImmMem pstImmZc ptr is null! \n"); return NULL; } if ( MEM_TYPE_USER_DEFINED != pstImmZc->private_mem.enType ) { IMM_LOG1(UEPS_PID_IMM_RB_RECYCLE, IMM_PRINT_ERROR, "IMM_ZcMapToImmMem Mem type %d invalid! \n", pstImmZc->private_mem.enType); return NULL; } if ( NULL == pstImmZc->private_mem.pMem ) { IMM_LOG(UEPS_PID_IMM_RB_RECYCLE, IMM_PRINT_ERROR, "IMM_ZcMapToImmMem stPrivateMem Mem ptr is null! \n"); return NULL; } if ( NULL == pstImmZc->head ) { IMM_LOG(UEPS_PID_IMM_RB_RECYCLE, IMM_PRINT_ERROR, "IMM_ZcMapToImmMem skbuf Mem ptr is null! \n"); return NULL; } /* 将数据挂接到IMM_MEM控制节点 */ pstImm = pstImmZc->private_mem.pMem; pstImmZc->private_mem.pMem = NULL; IMM_DEBUG_TRACE_FUNC_LEAVE(); return pstImm; } /* IMM_ZcMapToImmMem */
/***************************************************************************** 函 数 名 : IMM_ZcGetUsedLen 功能描述 : 获取零拷贝结构中数据块的使用长度 输入参数 : IMM_ZC_STRU *pstImmZc 输出参数 : 无 返 回 值 : 成功:返回的使用的数据长度;失败:返回IMM_INVALID_VALUE. 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2011年12月2日 修改内容 : Created *****************************************************************************/ unsigned long IMM_ZcGetUsedLen (const IMM_ZC_STRU *pstImmZc) { IMM_DEBUG_TRACE_FUNC_ENTER(); if ( NULL == pstImmZc ) { IMM_LOG(UEPS_PID_IMM_RB_RECYCLE, IMM_PRINT_ERROR, "IMM_ZcGetUsedLen pstImmZc ptr is null! \n"); return IMM_INVALID_VALUE; } IMM_DEBUG_TRACE_FUNC_LEAVE(); return pstImmZc->len; }
/***************************************************************************** 函 数 名 : IMM_ZcAddMacHead 功能描述 : 给IMM_ZC_STRU 零拷贝结构添加MAC头 输入参数 : IMM_ZC_STRU *pstImmZc unsigned char* pucAddData VOS_UINT16 usLen 输出参数 : 无 返 回 值 : VOS_OK 添加成功 VOS_ERR 添加失败 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2011年12月2日 修改内容 : Created *****************************************************************************/ unsigned long IMM_ZcAddMacHead (IMM_ZC_STRU *pstImmZc, const unsigned char* pucAddData) { unsigned char *pucDestAddr; IMM_DEBUG_TRACE_FUNC_ENTER(); if ( NULL == pstImmZc ) { IMM_LOG(UEPS_PID_IMM_RB_RECYCLE, IMM_PRINT_ERROR, "IMM_ZcAddMacHead pstImmZc ptr is null! \n"); return VOS_ERR; } if ( NULL == pucAddData ) { IMM_LOG(UEPS_PID_IMM_RB_RECYCLE, IMM_PRINT_ERROR, "IMM_ZcAddMacHead pucData ptr is null! \n"); return VOS_ERR; } if( IMM_MAC_HEADER_RES_LEN > (pstImmZc->data - pstImmZc->head) ) { IMM_LOG2(UEPS_PID_IMM_RB_RECYCLE, IMM_PRINT_ERROR, "IMM_ZcAddMacHead invalid data Len! data = 0x%x, head = 0x%x \n", (VOS_INT32)pstImmZc->data, (VOS_INT32)pstImmZc->head); return VOS_ERR; } pucDestAddr = IMM_ZcPush(pstImmZc,IMM_MAC_HEADER_RES_LEN); memcpy(pucDestAddr,pucAddData,IMM_MAC_HEADER_RES_LEN); IMM_DEBUG_TRACE_FUNC_LEAVE(); return VOS_OK; }
/***************************************************************************** 函 数 名 : IMM_ZcSetUserApp 功能描述 : 设置UserApp。 输入参数 : pstImmZc - 指向IMM_ZC_STRU的指针 usApp - 用户自定义 输出参数 : 无 返 回 值 : 无 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2011年12月1日 修改内容 : 新生成函数 *****************************************************************************/ void IMM_ZcSetUserApp (IMM_ZC_STRU *pstImmZc, unsigned short usApp) { IMM_DEBUG_TRACE_FUNC_ENTER(); if ( NULL == pstImmZc ) { IMM_LOG(UEPS_PID_IMM_RB_RECYCLE, IMM_PRINT_ERROR, "IMM_ZcSetUserApp pstImmZc ptr is null! \n"); return; } pstImmZc->private_mem.usApp = usApp; IMM_DEBUG_TRACE_FUNC_LEAVE(); return; }
VOS_VOID IMM_MntnShowUsedBlkMemInfo(VOS_VOID) { IMM_MEM_POOL_STRU *pstImmMemPoolInfo; VOS_UINT8 ucPoolId; IMM_LOG(UEPS_PID_IMM_RB_FREE, IMM_PRINT_NORMAL, "IMM_ShowUsedBlkMemInfo:Begin.\r\n"); for (ucPoolId = 0; ucPoolId < IMM_MEM_POOL_ID_BUTT; ucPoolId++) { pstImmMemPoolInfo = IMM_MemPoolGet(ucPoolId); IMM_LOG1(UEPS_PID_IMM_RB_FREE, IMM_PRINT_NORMAL, "IMM_ShowUsedBlkMemInfo print pool %d info begin: \n", ucPoolId ); IMM_MntnPrintBlkMemPoolUsedInfo(pstImmMemPoolInfo); IMM_LOG1(UEPS_PID_IMM_RB_FREE, IMM_PRINT_NORMAL, "IMM_ShowUsedBlkMemInfo print pool %d info end! \n", ucPoolId); } return ; }/*IMM_MntnShowUsedBlkMemInfo */
VOS_VOID IMM_RbRxFreeMemTaskInit( VOS_VOID ) { /* 初始化 IMM MEM RB 可维可测实体 */ PS_MEM_SET(&g_stImmMemRbMntnEntity, 0x0, sizeof(IMM_MEM_RB_MNTN_INFO_STRU)); /* 初始化信号量 */ if ( VOS_OK != VOS_SmBCreate("g_ulImmMemRbFreeSem", 0, VOS_SEMA4_FIFO, (VOS_SEM *)&g_ulImmMemRbFreeSem ) ) { IMM_LOG(UEPS_PID_IMM_RB_FREE, IMM_PRINT_ERROR, "IMM_RB, IMM_RbRxFreeMemTaskInit, ERROR, Create g_ulImmMemRbFreeSem fail!\n"); return; } VOS_SpinLockInit(&g_stImmRbSpinLock); IMM_RbMemFreeQueInit(); IMM_RbIsrInit(UEPS_PID_IMM_RB_FREE, IMM_IPC_MEM_FREE_INT, (VOIDFUNCPTR)IMM_RbMemRelDataIsr); IMM_MemRegExtFreeCallBack(IMM_RbRemoteFreeMem); IMM_MntnInit(); return ; }/* IMM_RbRxFreeMemTaskInit */
VOS_VOID IMM_MntnPrintBlkMemPoolUsedInfo( IMM_MEM_POOL_STRU *pstImmMemPoolInfo ) { #if (FEATURE_ON == FEATURE_IMM_MEM_DEBUG) VOS_UINT16 usImmMemNum; IMM_BLK_MEM_DEBUG_STRU *pstImmMemDebugInfo; #endif IMM_MEM_STRU *pMem; if (VOS_NULL_PTR == pstImmMemPoolInfo) { IMM_LOG(UEPS_PID_IMM_RB_FREE, IMM_PRINT_WARNING, "pstImmMemPoolInfo is NULL ! \n"); return ; } if (IMM_TRUE != pstImmMemPoolInfo->ucUsedFlag) { IMM_LOG(UEPS_PID_IMM_RB_FREE, IMM_PRINT_WARNING, "POOL not uesed ! \n"); return ; } pMem = pstImmMemPoolInfo->pstImmMemStStartAddr; IMM_LOG2(UEPS_PID_IMM_RB_FREE, IMM_PRINT_NORMAL, "Pool ID %u Blk Mem used %u \n", pMem->enPoolId, pstImmMemPoolInfo->usImmMemUsedCnt); if( IMM_FALSE == g_ucPrintDetail ) { return; } #if (FEATURE_ON == FEATURE_IMM_MEM_DEBUG) for (usImmMemNum = 0; usImmMemNum < pstImmMemPoolInfo->usImmMemTotalCnt; usImmMemNum ++) { pMem = pstImmMemPoolInfo->pstImmMemStStartAddr + usImmMemNum; pstImmMemDebugInfo = &pMem->stDbgInfo; if ( MEM_BLK_STATE_FREE != pstImmMemDebugInfo->enMemStateFlag) { IMM_LOG4(UEPS_PID_IMM_RB_FREE, IMM_PRINT_NORMAL, "Alloc: File %4d L %5d T %11u, Blk Mem Level: %4u, ", (VOS_INT32)pstImmMemDebugInfo->usAllocFileID, (VOS_INT32)pstImmMemDebugInfo->usAllocLineNum, (VOS_INT32)pstImmMemDebugInfo->ulAllocTick, usImmMemNum); /*lint -e713*/ IMM_LOG4(UEPS_PID_IMM_RB_FREE, IMM_PRINT_NORMAL, "Status: %d, Status: %d, TraceFile:%4d, TraceLine:%5d, TraceTick:%11d, \n", pstImmMemDebugInfo->enMemStateFlag, (VOS_INT32)pstImmMemDebugInfo->usTraceFileID, (VOS_INT32)pstImmMemDebugInfo->usTraceLineNum, (VOS_INT32)pstImmMemDebugInfo->ulTraceTick); /*lint +e713*/ /* 打印PDU内容 */ IMM_LOG1(UEPS_PID_IMM_RB_FREE, IMM_PRINT_NORMAL, "Data ptr: 0x%x\n ", (VOS_INT32)pMem->pstMemBlk); } } #endif }/* IMM_MntnPrintBlkMemPoolUsedInfo */
VOS_VOID IMM_MemHelp( VOS_VOID ) { IMM_LOG(UEPS_PID_IMM_RB_FREE, IMM_PRINT_NORMAL, "********************IMM_MEM软调信息************************\n"); IMM_LOG(UEPS_PID_IMM_RB_FREE, IMM_PRINT_NORMAL, "IMM_MntnCheckPoolLeak(ulPoolId): 检查IMM_MEM内存泄露,其中ulPoolId:\n"); IMM_LOG(UEPS_PID_IMM_RB_FREE, IMM_PRINT_NORMAL, " 0--SHARE; 1--EXT;\n"); IMM_LOG(UEPS_PID_IMM_RB_FREE, IMM_PRINT_NORMAL, "IMM_MntnShowUsedBlkMemInfo(VOS_VOID) 查看内存的使用信息(g_ucPrintDetail =1时打印出详细信息)。\n"); IMM_LOG(UEPS_PID_IMM_RB_FREE, IMM_PRINT_NORMAL, "IMM_MemSetTraceFunc(ucChoice) 配置函数跟踪轨迹打印,ucChoice = 0 关闭轨迹打印。\n"); IMM_LOG(UEPS_PID_IMM_RB_FREE, IMM_PRINT_NORMAL, "IMM_MemPrintDetail(ucChoice) 控制在使用IMM_MntnShowUsedBlkMemInfo时,是否开启使用信息打印。\n"); IMM_LOG(UEPS_PID_IMM_RB_FREE, IMM_PRINT_NORMAL, "IMM_MemGetAllocFailCnt(VOS_VOID) 获取内存申请失败次数信息。\n"); IMM_LOG(UEPS_PID_IMM_RB_FREE, IMM_PRINT_NORMAL, "IMM_MemSetAllocFailThreshold(usThreshold) 配置内存申请失败上报门限。\n"); IMM_LOG(UEPS_PID_IMM_RB_FREE, IMM_PRINT_NORMAL, "IMM_MemReSetAllocFailStatus(VOS_VOID) 重置内存申请失败统计信息。\n"); IMM_LOG(UEPS_PID_IMM_RB_FREE, IMM_PRINT_NORMAL, "IMM_MemShowMntnInfo(VOS_VOID) 获取IMM 内存可维可测信息。\n"); IMM_LOG(UEPS_PID_IMM_RB_FREE, IMM_PRINT_NORMAL, "IMM_MemClearMntnInfo(VOS_VOID) 清除IMM 内存可维可测信息。\n"); IMM_LOG(UEPS_PID_IMM_RB_FREE, IMM_PRINT_NORMAL, "IMM_MemGetFreeMntnEntityAddr(VOS_VOID) 获取 IMM FREE 内存可维可测实体地址。\n"); IMM_LOG(UEPS_PID_IMM_RB_FREE, IMM_PRINT_NORMAL, "IMM_MemGetRbMntnEntityAddr(VOS_VOID) 获取 IMM RB 内存可维可测实体地址。\n"); IMM_LOG(UEPS_PID_IMM_RB_FREE, IMM_PRINT_NORMAL, "IMM_RbMemPrintIsrCnt(VOS_VOID) A核收到IPF中断次数。\n"); return; }
VOS_VOID IMM_MntnMemUsedBlkTraceInfoRpt ( VOS_UINT8 ucPoolId, IMM_MEM_USED_INFO_TRIG_TYPE_ENUM_UINT8 enTrigType ) { VOS_UINT32 ulTotalCnt; VOS_UINT32 ulLength; VOS_UINT32 ulDataLen; PS_OM_EVENT_IND_STRU *pstImmOmEventInd; IMM_MEM_POOL_STRU *pstPoolInfo; IMM_OM_EVENT_BLK_MEM_USED_INFO_STRU *pstImmOmEventBlkMemUsedInfo; IMM_BLK_MEM_TRACE_INFO_STRU *pstBlkMemTraceInfo; VOS_UINT32 ulBlkMemNum; IMM_MEM_STRU *pMem; IMM_BLK_MEM_DEBUG_STRU *pstImmMemDebugInfo; VOS_UINT32 ulOffset; VOS_UINT8 ucRptNo = 0; VOS_UINT16 usRptCnt = 0; VOS_UINT16 usRptEventCnt = 0; pstPoolInfo = IMM_MEM_GET_POOL(ucPoolId); ulTotalCnt = pstPoolInfo->usImmMemUsedCnt; /* 上报内存跟踪信息 */ ulDataLen = offsetof(IMM_OM_EVENT_BLK_MEM_USED_INFO_STRU, astBlkMemTraceInfo) + ( EVENT_BLK_MEM_USED_INFO_CNT_PER_MSG * sizeof(IMM_BLK_MEM_TRACE_INFO_STRU)); /*消息总长度*/ ulLength = offsetof(PS_OM_EVENT_IND_STRU,aucData) + ulDataLen; /*申请消息内存*/ pstImmOmEventInd = (PS_OM_EVENT_IND_STRU *)PS_MEM_ALLOC(UEPS_PID_IMM_RB_FREE, ulLength); if ( VOS_NULL_PTR == pstImmOmEventInd ) { IMM_LOG(UEPS_PID_IMM_RB_FREE, IMM_PRINT_ERROR, "IMM_BlkMemUsedInfoEventRpt: MemAlloc Fail!"); return; } if ( IMM_TRUE == pstPoolInfo->ucUsedFlag ) { for (ulBlkMemNum = 0; ulBlkMemNum < pstPoolInfo->usImmMemTotalCnt; ulBlkMemNum ++) { pMem = pstPoolInfo->pstImmMemStStartAddr + ulBlkMemNum; pstImmMemDebugInfo = &pMem->stDbgInfo; if (MEM_BLK_STATE_FREE != pstImmMemDebugInfo->enMemStateFlag) { ulOffset = offsetof(IMM_OM_EVENT_BLK_MEM_USED_INFO_STRU, astBlkMemTraceInfo) + ( usRptCnt * sizeof(IMM_BLK_MEM_TRACE_INFO_STRU) ); pstBlkMemTraceInfo = (IMM_BLK_MEM_TRACE_INFO_STRU *)(pstImmOmEventInd->aucData + ulOffset ); pstBlkMemTraceInfo->ulAllocTick = pstImmMemDebugInfo->ulAllocTick; pstBlkMemTraceInfo->usAllocFileId = pstImmMemDebugInfo->usAllocFileID; pstBlkMemTraceInfo->usAllocLineNum = pstImmMemDebugInfo->usAllocLineNum; pstBlkMemTraceInfo->ulTraceTick = pstImmMemDebugInfo->ulTraceTick; pstBlkMemTraceInfo->usTraceFileId = (pstImmMemDebugInfo->usTraceFileID); pstBlkMemTraceInfo->usTraceLineNum = (pstImmMemDebugInfo->usTraceLineNum); IMM_MntnMemTraceInfoRptSaveMemData(ucPoolId, pstBlkMemTraceInfo, pMem); usRptCnt ++; if ( EVENT_BLK_MEM_USED_INFO_CNT_PER_MSG == usRptCnt )/* 分批发送,每笔最多发送一千块 */ { ucRptNo++; usRptCnt = 0; /*填写消息内容*/ pstImmOmEventInd->ulLength = ulLength - offsetof( PS_OM_EVENT_IND_STRU, usEventId); pstImmOmEventInd->usEventId = IMM_EVENT_BLK_MEM_USED_INFO; pstImmOmEventInd->ulModuleId = UEPS_PID_IMM_RB_FREE; pstImmOmEventBlkMemUsedInfo = (IMM_OM_EVENT_BLK_MEM_USED_INFO_STRU *)pstImmOmEventInd->aucData; pstImmOmEventBlkMemUsedInfo->ucPoolId = ucPoolId; pstImmOmEventBlkMemUsedInfo->enTrigType = enTrigType; pstImmOmEventBlkMemUsedInfo->ucNo = ucRptNo; pstImmOmEventBlkMemUsedInfo->usRptCnt = EVENT_BLK_MEM_USED_INFO_CNT_PER_MSG; pstImmOmEventBlkMemUsedInfo->ulTotalUsedCnt = ulTotalCnt; /*调用OM的事件上报接口*/ if ( PS_SUCC != OM_AcpuEvent((PS_OM_EVENT_IND_STRU*)pstImmOmEventInd)) { IMM_LOG(UEPS_PID_IMM_RB_FREE, IMM_PRINT_ERROR, "IMM_BlkMemUsedInfoEventRpt: OM Send Event Fail! \n"); } ++usRptEventCnt; } if ( g_ulImmEventRptCntThresholdPerTime < usRptEventCnt ) { /* 释放申请的内存 */ PS_MEM_FREE(UEPS_PID_IMM_RB_FREE, pstImmOmEventInd); return; } } } } if ( 0 != usRptCnt )/* 最后一笔数据块数不足 EVENT_BLK_MEM_USED_INFO_CNT_PER_MSG */ { ucRptNo++; ulDataLen = ( usRptCnt * sizeof(IMM_BLK_MEM_TRACE_INFO_STRU)) + offsetof(IMM_OM_EVENT_BLK_MEM_USED_INFO_STRU, astBlkMemTraceInfo) ; ulLength = offsetof(PS_OM_EVENT_IND_STRU, aucData) + ulDataLen; /*填写消息内容*/ pstImmOmEventInd->ulLength = ulLength - offsetof( PS_OM_EVENT_IND_STRU, usEventId); pstImmOmEventInd->usEventId = IMM_EVENT_BLK_MEM_USED_INFO; pstImmOmEventInd->ulModuleId = UEPS_PID_IMM_RB_FREE; pstImmOmEventBlkMemUsedInfo = (IMM_OM_EVENT_BLK_MEM_USED_INFO_STRU *)pstImmOmEventInd->aucData; pstImmOmEventBlkMemUsedInfo->ucPoolId = ucPoolId; pstImmOmEventBlkMemUsedInfo->enTrigType = enTrigType; pstImmOmEventBlkMemUsedInfo->ucNo = ucRptNo; pstImmOmEventBlkMemUsedInfo->usRptCnt = usRptCnt; pstImmOmEventBlkMemUsedInfo->ulTotalUsedCnt = ulTotalCnt; /*调用OM的事件上报接口*/ if ( PS_SUCC != OM_AcpuEvent((PS_OM_EVENT_IND_STRU*)pstImmOmEventInd)) { IMM_LOG(UEPS_PID_IMM_RB_FREE, IMM_PRINT_ERROR, "IMM_BlkMemUsedInfoEventRpt: OM Send Event Fail! \n"); } } /*释放申请的内存*/ PS_MEM_FREE(UEPS_PID_IMM_RB_FREE, pstImmOmEventInd); return ; }
VOS_VOID IMM_MntnMemOverTimeInfoRpt( VOS_VOID ) { VOS_UINT32 ulTotalCnt; VOS_UINT32 ulLength; VOS_UINT32 ulDataLen; PS_OM_EVENT_IND_STRU *pstImmOmEventInd; IMM_MEM_POOL_STRU *pstPoolInfo; IMM_OM_EVENT_BLK_MEM_USED_INFO_STRU *pstImmOmEventBlkMemUsedInfo; IMM_BLK_MEM_TRACE_INFO_STRU *pstBlkMemTraceInfo; IMM_BLK_MEM_DEBUG_STRU *pstImmMemDebugInfo; VOS_UINT32 ulBlkMemNum; IMM_MEM_STRU *pMem; VOS_UINT32 ulOffset; VOS_UINT8 ucRptNo = 0; VOS_UINT16 usRptCnt = 0; VOS_UINT16 usNeedRptCnt; VOS_UINT32 ulDrvRsvMemCnt; /* 获取内存池 */ pstPoolInfo = IMM_MEM_GET_POOL(IMM_MEM_POOL_ID_SHARE); /* 获取超时的内存块个数 */ ulTotalCnt = IMM_MntnGetOverMemBlkCnt(IMM_MEM_POOL_ID_SHARE); /* 上报内存跟踪信息 */ ulDataLen = offsetof(IMM_OM_EVENT_BLK_MEM_USED_INFO_STRU, astBlkMemTraceInfo) + ( EVENT_BLK_MEM_USED_INFO_CNT_PER_MSG * sizeof(IMM_BLK_MEM_TRACE_INFO_STRU)); /*消息总长度*/ ulLength = offsetof(PS_OM_EVENT_IND_STRU,aucData) + ulDataLen; /*申请消息内存*/ pstImmOmEventInd = (PS_OM_EVENT_IND_STRU *)PS_MEM_ALLOC(UEPS_PID_IMM_RB_FREE, ulLength); if ( VOS_NULL_PTR == pstImmOmEventInd ) { IMM_LOG(UEPS_PID_IMM_RB_FREE, IMM_PRINT_ERROR, "IMM_MntnMemOverTimeInfoRpt: MemAlloc Fail!"); return; } ulDrvRsvMemCnt = DRV_GET_PREMALLOC_SKB_NUM(); /* 驱动会预申请内存,小于驱动预申请内存不算内存泄露 */ if(ulTotalCnt <= ulDrvRsvMemCnt) { usNeedRptCnt = 0; } else if( EVENT_BLK_MEM_USED_INFO_CNT_PER_MSG < ulTotalCnt )/* 最多发送 EVENT_BLK_MEM_USED_INFO_CNT_PER_MSG 块 */ { usNeedRptCnt = EVENT_BLK_MEM_USED_INFO_CNT_PER_MSG ; } else { usNeedRptCnt = (VOS_UINT16)(ulTotalCnt - 1); } for ( ulBlkMemNum = 0; ulBlkMemNum < pstPoolInfo->usImmMemTotalCnt; ++ulBlkMemNum ) { pMem = pstPoolInfo->pstImmMemStStartAddr + ulBlkMemNum; pstImmMemDebugInfo = &pMem->stDbgInfo; if ( MEM_BLK_STATE_FREE != pstImmMemDebugInfo->enMemStateFlag ) { if ( g_ulOverTimeSliceThreshold > IMM_MntnTimeDiff(pstImmMemDebugInfo->ulAllocTick, g_ulCurrentTimeSlice)) { continue; } if( usNeedRptCnt > 0 ) { ulOffset = offsetof(IMM_OM_EVENT_BLK_MEM_USED_INFO_STRU, astBlkMemTraceInfo) + ( usRptCnt * sizeof(IMM_BLK_MEM_TRACE_INFO_STRU) ); pstBlkMemTraceInfo = (IMM_BLK_MEM_TRACE_INFO_STRU *)(pstImmOmEventInd->aucData + ulOffset ); pstBlkMemTraceInfo->ulAllocTick = pstImmMemDebugInfo->ulAllocTick; pstBlkMemTraceInfo->usAllocFileId = pstImmMemDebugInfo->usAllocFileID; pstBlkMemTraceInfo->usAllocLineNum = pstImmMemDebugInfo->usAllocLineNum; pstBlkMemTraceInfo->ulTraceTick = pstImmMemDebugInfo->ulTraceTick; pstBlkMemTraceInfo->usTraceFileId = (pstImmMemDebugInfo->usTraceFileID); pstBlkMemTraceInfo->usTraceLineNum = (pstImmMemDebugInfo->usTraceLineNum); if ( NULL !=pMem->pstMemBlk ) { pstBlkMemTraceInfo->aucMemData[0] = pMem->pstMemBlk[0]; pstBlkMemTraceInfo->aucMemData[1] = pMem->pstMemBlk[1]; pstBlkMemTraceInfo->aucMemData[2] = pMem->pstMemBlk[2]; pstBlkMemTraceInfo->aucMemData[3] = pMem->pstMemBlk[3]; } ++usRptCnt; usNeedRptCnt --; } } } /*填写消息内容*/ ucRptNo = 1; pstImmOmEventInd->ulLength = ulLength - offsetof( PS_OM_EVENT_IND_STRU, usEventId); pstImmOmEventInd->usEventId = IMM_EVENT_BLK_MEM_USED_INFO; pstImmOmEventInd->ulModuleId = UEPS_PID_IMM_RB_FREE; pstImmOmEventBlkMemUsedInfo = (IMM_OM_EVENT_BLK_MEM_USED_INFO_STRU *)pstImmOmEventInd->aucData; pstImmOmEventBlkMemUsedInfo->ucPoolId = IMM_MEM_POOL_ID_SHARE; pstImmOmEventBlkMemUsedInfo->enTrigType = IMM_MEM_TRIG_TYPE_OVERTIME_OCCUPANCY; pstImmOmEventBlkMemUsedInfo->ucNo = ucRptNo; pstImmOmEventBlkMemUsedInfo->usRptCnt = usRptCnt; /* USB需要提前申请一块数据块,因此小于等于1,不是泄露内存*/ if(ulTotalCnt > ulDrvRsvMemCnt) { pstImmOmEventBlkMemUsedInfo->ulTotalUsedCnt = ulTotalCnt - 1; IMM_MntnReportMemLeakMsg(UEPS_PID_IMM_RB_FREE); } else { pstImmOmEventBlkMemUsedInfo->ulTotalUsedCnt = 0; } /*调用OM的事件上报接口*/ if ( PS_SUCC != OM_AcpuEvent((PS_OM_EVENT_IND_STRU*)pstImmOmEventInd)) { PS_LOG(UEPS_PID_IMM_RB_FREE, 0, IMM_PRINT_ERROR, "IMM_MntnMemOverTimeInfoRpt: OM Send Event Fail! \n"); } /* 释放申请的内存 */ PS_MEM_FREE(UEPS_PID_IMM_RB_FREE, pstImmOmEventInd); return; }/* IMM_MntnMemOverTimeInfoRpt */