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_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_UINT32 IMM_RbIsrInit(VOS_UINT32 ulPid, VOS_UINT32 ulIntLevel, VOIDFUNCPTR pfuncRecvIsr) { VOS_INT32 lIntRet; /* 挂接中断 */ /*Add by y45445 for PS FUSION PC ST 20120109 begin*/ #ifndef WTTF_PS_FUSION_PC_ST lIntRet = IMM_MEM_CONNECT_IPC_MEMFREE_INT(((IPC_INT_LEV_E)ulIntLevel), ((VOIDFUNCPTR)pfuncRecvIsr), VOS_NULL); #else lIntRet = VHW_IPC_IntConnect(ulPid,((IPC_INT_LEV_E)ulIntLevel), ((VOIDFUNCPTR)pfuncRecvIsr), VOS_NULL); #endif /*Add by y45445 for PS FUSION PC ST 20120109 end*/ if (lIntRet != VOS_OK) { IMM_LOG1(ulPid, IMM_PRINT_ERROR, "IMM_RbIsrInit connect %d ISR fail", (VOS_INT32)ulIntLevel); return IMM_FAIL; } /* 使能通知中断 */ /*Add by y45445 for PS FUSION PC ST 20120109 begin*/ #ifndef WTTF_PS_FUSION_PC_ST IMM_MEM_ENABLE_IPC_INT((IPC_INT_LEV_E)ulIntLevel); #else VHW_IPC_IntEnable(ulPid,ulIntLevel); #endif /*Add by y45445 for PS FUSION PC ST 20120109 end*/ return IMM_SUCC; }/* IMM_RbIsrInit */
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_UINT32 IMM_MntnCheckPoolLeak(VOS_UINT8 ucPoolId) { IMM_MEM_POOL_STRU *pstImmMemPool; VOS_UINT32 ulDrvRsvMemCnt; if ( IMM_MEM_POOL_ID_BUTT <= ucPoolId ) { IMM_LOG1(UEPS_PID_IMM_RB_FREE, IMM_PRINT_ERROR, "IMM_MemCheckPoolLeak,Poolid %d is invalid! \n", ucPoolId); return VOS_FALSE; } /* 获取内存池 */ pstImmMemPool = IMM_MEM_GET_POOL(ucPoolId); /* 检查内存池是否使用 */ if ( IMM_TRUE != pstImmMemPool->ucUsedFlag ) { IMM_LOG1(UEPS_PID_IMM_RB_FREE, IMM_PRINT_WARNING, "IMM_MemCheckPoolLeak,Pool %d is not used! \n", ucPoolId); return VOS_FALSE; } /* 获取驱动保留Mem数量 */ ulDrvRsvMemCnt = DRV_GET_PREMALLOC_SKB_NUM(); /*检查内存是否泄露 */ if ( ulDrvRsvMemCnt >= pstImmMemPool->usImmMemUsedCnt ) { return VOS_FALSE; } IMM_LOG1(UEPS_PID_IMM_RB_FREE, IMM_PRINT_WARNING, "IMM_MEM_BLK Is Leak, UsedCnt %d ! \n", pstImmMemPool->usImmMemUsedCnt); /* 向SDT上报内存泄露事件 */ IMM_MntnMemUsedInfoEventRpt(ucPoolId, IMM_MEM_TRIG_TYPE_LEAK); return VOS_TRUE; } /* IMM_MntnCheckPoolLeak */
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 */
VOS_VOID IMM_MntnCheckPoolOverTimeOccupancy(VOS_VOID) { IMM_MEM_POOL_STRU *pstImmMemPool; pstImmMemPool = IMM_MEM_GET_POOL(IMM_MEM_POOL_ID_SHARE); if ( IMM_TRUE != pstImmMemPool->ucUsedFlag ) { IMM_LOG1(UEPS_PID_IMM_RB_FREE, IMM_PRINT_WARNING, "IMM_MntnCheckPoolOverTimeOccupancy ,Pool %d is not used! \n", IMM_MEM_POOL_ID_SHARE); return ; } /* 上报内存超时事件 */ IMM_MntnMemOverTimeInfoRpt(); return ; } /* IMM_MntnCheckPoolOverTimeOccupancy */
/***************************************************************************** 函 数 名 : 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 */
VOS_VOID IMM_MntnCheckMemPoolLeak(VOS_UINT8 ucCheckType) { switch(ucCheckType) { case IMM_MNTN_CHECK_POOL_LEAK_TYPE_USDCNT: IMM_MntnCheckLeak(); break; #if (FEATURE_ON == FEATURE_IMM_MEM_DEBUG) case IMM_MNTN_CHECK_POOL_LEAK_TYPE_OVERTIME: IMM_MntnCheckPoolOverTimeOccupancy(); break; #endif default: IMM_LOG1(UEPS_PID_IMM_RB_FREE, IMM_PRINT_WARNING, "IMM_MntnCheckMemPoolLeak Invalid type %d \n", ucCheckType); break; } return; }/* IMM_MntnCheckMemPoolLeak */
VOS_VOID IMM_MntnMemTraceInfoRptSaveMemData ( VOS_UINT8 ucPoolId, IMM_BLK_MEM_TRACE_INFO_STRU *pstBlkMemTraceInfo, IMM_MEM_STRU *pMem ) { if ( ucPoolId != pMem->enPoolId ) { IMM_LOG2(UEPS_PID_IMM_RB_FREE, IMM_PRINT_ERROR, "IMM_MntnMemTraceInfoRptSaveMemData, ucPoolId %d, pMem->enPoolId %d Mismatch! \n", ucPoolId, pMem->enPoolId); return; } if ( IMM_MEM_POOL_ID_SHARE == ucPoolId ) { 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]; } else { VOS_MemSet(pstBlkMemTraceInfo->aucMemData, 0, 4); IMM_LOG1(UEPS_PID_IMM_RB_FREE, IMM_PRINT_ERROR, "IMM_MntnMemTraceInfoRptSaveMemData, ucPoolId %d Mem Ptr is Null! \n", ucPoolId); } return; } if ( IMM_MEM_POOL_ID_EXT == ucPoolId ) { *((VOS_UINT32 *)pstBlkMemTraceInfo->aucMemData) = (VOS_UINT32)pMem->pstMemBlk; } return; }/* IMM_MntnMemTraceInfoRptSaveMemData */
VOS_VOID IMM_RbMemPrintIsrCnt( VOS_VOID ) { IMM_LOG1(UEPS_PID_IMM_RB_FREE, IMM_PRINT_NORMAL, "IPF中断次数: %d \n" , (VOS_INT32)g_stImmMemRbMntnEntity.ulImmMemRbReceiveIntCnt); return; }/* IMM_RbMemPrintIsrCnt */
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 */