154568cb3Sopenharmony_ci/* 254568cb3Sopenharmony_ci * Copyright (c) 2009-2022 Huawei Technologies Co., Ltd. All rights reserved. 354568cb3Sopenharmony_ci * 454568cb3Sopenharmony_ci * UniProton is licensed under Mulan PSL v2. 554568cb3Sopenharmony_ci * You can use this software according to the terms and conditions of the Mulan PSL v2. 654568cb3Sopenharmony_ci * You may obtain a copy of Mulan PSL v2 at: 754568cb3Sopenharmony_ci * http://license.coscl.org.cn/MulanPSL2 854568cb3Sopenharmony_ci * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 954568cb3Sopenharmony_ci * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 1054568cb3Sopenharmony_ci * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 1154568cb3Sopenharmony_ci * See the Mulan PSL v2 for more details. 1254568cb3Sopenharmony_ci * Create: 2009-12-22 1354568cb3Sopenharmony_ci * Description: CPU占用率模块的C文件 1454568cb3Sopenharmony_ci */ 1554568cb3Sopenharmony_ci#include "prt_cpup_internal.h" 1654568cb3Sopenharmony_ci 1754568cb3Sopenharmony_ciOS_SEC_BSS struct TagOsCpupWarnInfo g_cpupWarnInfo; 1854568cb3Sopenharmony_ci 1954568cb3Sopenharmony_ci/* 2054568cb3Sopenharmony_ci * 描述:初始化CPUP告警模块 2154568cb3Sopenharmony_ci */ 2254568cb3Sopenharmony_ciOS_SEC_L4_TEXT void OsCpupWarnInit(void) 2354568cb3Sopenharmony_ci{ 2454568cb3Sopenharmony_ci g_cpupWarnCheck = OsCpupWarn; 2554568cb3Sopenharmony_ci} 2654568cb3Sopenharmony_ci 2754568cb3Sopenharmony_ci/* 2854568cb3Sopenharmony_ci * 描述:CPUP告警,调用用户注册的钩子函数上报信息通知用户 2954568cb3Sopenharmony_ci */ 3054568cb3Sopenharmony_ciOS_SEC_L2_TEXT void OsCpupWarn(void) 3154568cb3Sopenharmony_ci{ 3254568cb3Sopenharmony_ci struct CpupWarnInfo warnInfo; 3354568cb3Sopenharmony_ci U32 cpup; 3454568cb3Sopenharmony_ci static bool warn = FALSE; 3554568cb3Sopenharmony_ci 3654568cb3Sopenharmony_ci cpup = OsCpupGet(); 3754568cb3Sopenharmony_ci if (cpup > g_cpupWarnInfo.warn) { /* 当超过阀值时,发出告警信息。 */ 3854568cb3Sopenharmony_ci /* 当超过阈值时,发出告警信息。 */ 3954568cb3Sopenharmony_ci if ((warn == FALSE) && (g_hookCb[OS_HOOK_CPUP_WARN].sigHook != NULL)) { 4054568cb3Sopenharmony_ci warn = TRUE; 4154568cb3Sopenharmony_ci warnInfo.type = CPUP_INFO_TYPE_OVERLOAD; 4254568cb3Sopenharmony_ci OS_SHOOK_ACTIVATE_PARA1(OS_HOOK_CPUP_WARN, &warnInfo); 4354568cb3Sopenharmony_ci } 4454568cb3Sopenharmony_ci } else if (cpup < g_cpupWarnInfo.resume) { 4554568cb3Sopenharmony_ci if (warn == TRUE) { 4654568cb3Sopenharmony_ci warn = FALSE; 4754568cb3Sopenharmony_ci if (g_hookCb[OS_HOOK_CPUP_WARN].sigHook != NULL) { 4854568cb3Sopenharmony_ci warnInfo.type = CPUP_INFO_TYPE_RECONVERT; 4954568cb3Sopenharmony_ci OS_SHOOK_ACTIVATE_PARA1(OS_HOOK_CPUP_WARN, &warnInfo); 5054568cb3Sopenharmony_ci } 5154568cb3Sopenharmony_ci } 5254568cb3Sopenharmony_ci } 5354568cb3Sopenharmony_ci} 5454568cb3Sopenharmony_ci 5554568cb3Sopenharmony_ci/* 5654568cb3Sopenharmony_ci * 描述:告警门限和告警恢复门限的设置 5754568cb3Sopenharmony_ci */ 5854568cb3Sopenharmony_ciOS_SEC_L4_TEXT U32 PRT_CpupSetWarnValue(U32 warn, U32 resume) 5954568cb3Sopenharmony_ci{ 6054568cb3Sopenharmony_ci uintptr_t intSave; 6154568cb3Sopenharmony_ci 6254568cb3Sopenharmony_ci if (!OsCpupInitIsDone()) { 6354568cb3Sopenharmony_ci return OS_ERRNO_CPUP_NOT_INITED; 6454568cb3Sopenharmony_ci } 6554568cb3Sopenharmony_ci 6654568cb3Sopenharmony_ci if ((UNI_FLAG & OS_FLG_BGD_ACTIVE) == 0) { 6754568cb3Sopenharmony_ci return OS_ERRNO_CPUP_OS_NOT_STARTED; 6854568cb3Sopenharmony_ci } 6954568cb3Sopenharmony_ci 7054568cb3Sopenharmony_ci if (warn > CPUP_USE_RATE || warn == 0) { 7154568cb3Sopenharmony_ci return OS_ERRNO_CPUP_INTERVAL_NOT_SUITED; 7254568cb3Sopenharmony_ci } 7354568cb3Sopenharmony_ci 7454568cb3Sopenharmony_ci if (resume >= warn) { 7554568cb3Sopenharmony_ci return OS_ERRNO_CPUP_RESUME_NOT_SUITED; 7654568cb3Sopenharmony_ci } 7754568cb3Sopenharmony_ci 7854568cb3Sopenharmony_ci intSave = OsIntLock(); 7954568cb3Sopenharmony_ci 8054568cb3Sopenharmony_ci g_cpupWarnInfo.warn = warn; 8154568cb3Sopenharmony_ci g_cpupWarnInfo.resume = resume; 8254568cb3Sopenharmony_ci 8354568cb3Sopenharmony_ci OsIntRestore(intSave); 8454568cb3Sopenharmony_ci 8554568cb3Sopenharmony_ci return OS_OK; 8654568cb3Sopenharmony_ci} 8754568cb3Sopenharmony_ci 8854568cb3Sopenharmony_ci/* 8954568cb3Sopenharmony_ci * 描述:查询告警阈值和告警恢复阈值 9054568cb3Sopenharmony_ci */ 9154568cb3Sopenharmony_ciOS_SEC_L4_TEXT U32 PRT_CpupGetWarnValue(U32 *warn, U32 *resume) 9254568cb3Sopenharmony_ci{ 9354568cb3Sopenharmony_ci uintptr_t intSave; 9454568cb3Sopenharmony_ci 9554568cb3Sopenharmony_ci if (!OsCpupInitIsDone()) { 9654568cb3Sopenharmony_ci return OS_ERRNO_CPUP_NOT_INITED; 9754568cb3Sopenharmony_ci } 9854568cb3Sopenharmony_ci 9954568cb3Sopenharmony_ci if ((UNI_FLAG & OS_FLG_BGD_ACTIVE) == 0) { 10054568cb3Sopenharmony_ci return OS_ERRNO_CPUP_OS_NOT_STARTED; 10154568cb3Sopenharmony_ci } 10254568cb3Sopenharmony_ci 10354568cb3Sopenharmony_ci if (warn == NULL || resume == NULL) { 10454568cb3Sopenharmony_ci return OS_ERRNO_CPUP_PTR_NULL; 10554568cb3Sopenharmony_ci } 10654568cb3Sopenharmony_ci 10754568cb3Sopenharmony_ci intSave = OsIntLock(); 10854568cb3Sopenharmony_ci 10954568cb3Sopenharmony_ci *warn = g_cpupWarnInfo.warn; 11054568cb3Sopenharmony_ci *resume = g_cpupWarnInfo.resume; 11154568cb3Sopenharmony_ci 11254568cb3Sopenharmony_ci OsIntRestore(intSave); 11354568cb3Sopenharmony_ci 11454568cb3Sopenharmony_ci return OS_OK; 11554568cb3Sopenharmony_ci} 11654568cb3Sopenharmony_ci 11754568cb3Sopenharmony_ci/* 11854568cb3Sopenharmony_ci * 描述:注册CPUP告警钩子函数 11954568cb3Sopenharmony_ci */ 12054568cb3Sopenharmony_ciOS_SEC_L4_TEXT U32 PRT_CpupRegWarnHook(CpupHookFunc hook) 12154568cb3Sopenharmony_ci{ 12254568cb3Sopenharmony_ci return OsShookReg(OS_HOOK_CPUP_WARN, (OsVoidFunc)hook); 12354568cb3Sopenharmony_ci} 12454568cb3Sopenharmony_ci 12554568cb3Sopenharmony_ciOS_SEC_L4_TEXT U32 OsCpupWarnReg(struct CpupModInfo *modInfo) 12654568cb3Sopenharmony_ci{ 12754568cb3Sopenharmony_ci if (modInfo->warn == 0 || modInfo->warn > CPUP_USE_RATE) { 12854568cb3Sopenharmony_ci return OS_ERRNO_CPUP_INTERVAL_NOT_SUITED; 12954568cb3Sopenharmony_ci } 13054568cb3Sopenharmony_ci 13154568cb3Sopenharmony_ci if (modInfo->resume >= modInfo->warn) { 13254568cb3Sopenharmony_ci return OS_ERRNO_CPUP_RESUME_VALUE_ERROR; 13354568cb3Sopenharmony_ci } 13454568cb3Sopenharmony_ci 13554568cb3Sopenharmony_ci g_cpupWarnInfo.warn = modInfo->warn; 13654568cb3Sopenharmony_ci g_cpupWarnInfo.resume = modInfo->resume; 13754568cb3Sopenharmony_ci 13854568cb3Sopenharmony_ci return OS_OK; 13954568cb3Sopenharmony_ci} 140