From f06e090a1085a654fd726fbc3c3a1c2bc703d663 Mon Sep 17 00:00:00 2001 From: zhushengle Date: Tue, 2 Nov 2021 19:15:04 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=BF=9B=E7=A8=8Bcpup=E5=8D=A0?= =?UTF-8?q?=E7=94=A8=E7=8E=87=E7=BB=93=E6=9E=84=E4=BC=98=E5=8C=96=E4=B8=BA?= =?UTF-8?q?=E5=8A=A8=E6=80=81=E5=88=86=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Close #I4GLNT Signed-off-by: zhushengle Change-Id: I7f3dd61bbf014fa157b1f9a0a089fd985fe188c2 --- compat/posix/src/time.c | 6 ++++- kernel/base/core/los_process.c | 18 +++++++++++++ kernel/base/include/los_process_pri.h | 2 +- kernel/extended/cpup/los_cpup.c | 38 ++++++++++++++++++--------- 4 files changed, 50 insertions(+), 14 deletions(-) diff --git a/compat/posix/src/time.c b/compat/posix/src/time.c index fecc3371..6d941fb0 100644 --- a/compat/posix/src/time.c +++ b/compat/posix/src/time.c @@ -509,7 +509,11 @@ static int ProcessGetCputime(clockid_t clockID, struct timespec *ats) } SCHEDULER_LOCK(intSave); - runtime = spcb->processCpup.allTime; + if (spcb->processCpup == NULL) { + SCHEDULER_UNLOCK(intSave); + return -EINVAL; + } + runtime = spcb->processCpup->allTime; SCHEDULER_UNLOCK(intSave); ats->tv_sec = runtime / OS_SYS_NS_PER_SECOND; diff --git a/kernel/base/core/los_process.c b/kernel/base/core/los_process.c index 0e8126c5..1f0b059d 100644 --- a/kernel/base/core/los_process.c +++ b/kernel/base/core/los_process.c @@ -376,6 +376,15 @@ LITE_OS_SEC_TEXT VOID OsProcessResourcesToFree(LosProcessCB *processCB) (VOID)LiteIpcPoolDestroy(processCB->processID); #endif +#ifdef LOSCFG_KERNEL_CPUP + UINT32 intSave; + OsCpupBase *processCpup = processCB->processCpup; + SCHEDULER_LOCK(intSave); + processCB->processCpup = NULL; + SCHEDULER_UNLOCK(intSave); + (VOID)LOS_MemFree(m_aucSysMem1, processCpup); +#endif + if (processCB->resourceLimit != NULL) { (VOID)LOS_MemFree((VOID *)m_aucSysMem0, processCB->resourceLimit); processCB->resourceLimit = NULL; @@ -654,12 +663,21 @@ STATIC UINT32 OsInitPCB(LosProcessCB *processCB, UINT32 mode, UINT16 priority, c } #endif +#ifdef LOSCFG_KERNEL_CPUP + processCB->processCpup = (OsCpupBase *)LOS_MemAlloc(m_aucSysMem1, sizeof(OsCpupBase)); + if (processCB->processCpup == NULL) { + return LOS_ENOMEM; + } + (VOID)memset_s(processCB->processCpup, sizeof(OsCpupBase), 0, sizeof(OsCpupBase)); +#endif + #ifdef LOSCFG_SECURITY_VID status_t status = VidMapListInit(processCB); if (status != LOS_OK) { return LOS_ENOMEM; } #endif + #ifdef LOSCFG_SECURITY_CAPABILITY OsInitCapability(processCB); #endif diff --git a/kernel/base/include/los_process_pri.h b/kernel/base/include/los_process_pri.h index 2a9e8927..a585afae 100644 --- a/kernel/base/include/los_process_pri.h +++ b/kernel/base/include/los_process_pri.h @@ -125,7 +125,7 @@ typedef struct ProcessCB { #endif mode_t umask; #ifdef LOSCFG_KERNEL_CPUP - OsCpupBase processCpup; /**< Process cpu usage */ + OsCpupBase *processCpup; /**< Process cpu usage */ #endif struct rlimit *resourceLimit; } LosProcessCB; diff --git a/kernel/extended/cpup/los_cpup.c b/kernel/extended/cpup/los_cpup.c index 3f68e82b..09e3ec1e 100644 --- a/kernel/extended/cpup/los_cpup.c +++ b/kernel/extended/cpup/los_cpup.c @@ -106,7 +106,10 @@ LITE_OS_SEC_TEXT_INIT VOID OsCpupGuard(VOID) for (loop = 0; loop < g_processMaxNum; loop++) { processCB = OS_PCB_FROM_PID(loop); - processCB->processCpup.historyTime[prevPos] = processCB->processCpup.allTime; + if (processCB->processCpup == NULL) { + continue; + } + processCB->processCpup->historyTime[prevPos] = processCB->processCpup->allTime; } for (loop = 0; loop < g_taskMaxNum; loop++) { @@ -129,7 +132,7 @@ LITE_OS_SEC_TEXT_INIT VOID OsCpupGuard(VOID) #endif taskCB->taskCpup.historyTime[prevPos] += cycleIncrement; processCB = OS_PCB_FROM_PID(taskCB->processID); - processCB->processCpup.historyTime[prevPos] += cycleIncrement; + processCB->processCpup->historyTime[prevPos] += cycleIncrement; } SCHEDULER_UNLOCK(intSave); @@ -209,7 +212,10 @@ LITE_OS_SEC_TEXT_INIT VOID LOS_CpupReset(VOID) for (index = 0; index < g_processMaxNum; index++) { processCB = OS_PCB_FROM_PID(index); - OsResetCpup(&processCB->processCpup, cycle); + if (processCB->processCpup == NULL) { + continue; + } + OsResetCpup(processCB->processCpup, cycle); } for (index = 0; index < g_taskMaxNum; index++) { @@ -242,7 +248,7 @@ VOID OsCpupCycleEndStart(UINT32 runTaskID, UINT32 newTaskID) LosTaskCB *runTask = OS_TCB_FROM_TID(runTaskID); OsCpupBase *runTaskCpup = &runTask->taskCpup; OsCpupBase *newTaskCpup = (OsCpupBase *)&(OS_TCB_FROM_TID(newTaskID)->taskCpup); - OsCpupBase *processCpup = (OsCpupBase *)&(OS_PCB_FROM_PID(runTask->processID)->processCpup); + OsCpupBase *processCpup = OS_PCB_FROM_PID(runTask->processID)->processCpup; UINT64 cpuCycle, cycleIncrement; UINT16 cpuID = ArchCurrCpuid(); @@ -258,7 +264,9 @@ VOID OsCpupCycleEndStart(UINT32 runTaskID, UINT32 newTaskID) timeInIrqSwitch[cpuID] = 0; #endif runTaskCpup->allTime += cycleIncrement; - processCpup->allTime += cycleIncrement; + if (processCpup != NULL) { + processCpup->allTime += cycleIncrement; + } runTaskCpup->startTime = 0; } @@ -326,7 +334,7 @@ STATIC UINT32 OsHistorySysCpuUsageUnsafe(UINT16 mode) cpuAllCycle = cpuHistoryTime[pos] - cpuHistoryTime[prePos]; idleProcessID = OsGetIdleProcessID(); - processCpup = (OsCpupBase *)&(OS_PCB_FROM_PID(idleProcessID)->processCpup); + processCpup = OS_PCB_FROM_PID(idleProcessID)->processCpup; return (LOS_CPUP_PRECISION - OsCalculateCpupUsage(processCpup, pos, prePos, cpuAllCycle)); } @@ -361,10 +369,14 @@ STATIC UINT32 OsHistoryProcessCpuUsageUnsafe(UINT32 pid, UINT16 mode) return LOS_ERRNO_CPUP_NO_CREATED; } + if (processCB->processCpup == NULL) { + return LOS_ERRNO_CPUP_ID_INVALID; + } + OsCpupGetPos(mode, &pos, &prePos); cpuAllCycle = cpuHistoryTime[pos] - cpuHistoryTime[prePos]; - return OsCalculateCpupUsage(&processCB->processCpup, pos, prePos, cpuAllCycle); + return OsCalculateCpupUsage(processCB->processCpup, pos, prePos, cpuAllCycle); } LITE_OS_SEC_TEXT_MINOR UINT32 LOS_HistoryProcessCpuUsage(UINT32 pid, UINT16 mode) @@ -446,11 +458,11 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsGetAllProcessCpuUsageUnsafe(UINT16 mode, CPUP_IN for (processID = 0; processID < g_processMaxNum; processID++) { processCB = OS_PCB_FROM_PID(processID); - if (OsProcessIsUnused(processCB)) { + if (OsProcessIsUnused(processCB) || (processCB->processCpup == NULL)) { continue; } - cpupInfo[processID].usage = OsCalculateCpupUsage(&processCB->processCpup, pos, prePos, cpuAllCycle); + cpupInfo[processID].usage = OsCalculateCpupUsage(processCB->processCpup, pos, prePos, cpuAllCycle); cpupInfo[processID].status = OS_CPUP_USED; } @@ -496,9 +508,11 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsGetAllProcessAndTaskCpuUsageUnsafe(UINT16 mode, taskCpup[taskID].usage = OsCalculateCpupUsage(&taskCB->taskCpup, pos, prePos, cpuAllCycle); taskCpup[taskID].status = OS_CPUP_USED; if (processCpup[taskCB->processID].status == OS_CPUP_UNUSED) { - processCpupBase = &(OS_PCB_FROM_PID(taskCB->processID)->processCpup); - processCpup[taskCB->processID].usage = OsCalculateCpupUsage(processCpupBase, pos, prePos, cpuAllCycle); - processCpup[taskCB->processID].status = OS_CPUP_USED; + processCpupBase = OS_PCB_FROM_PID(taskCB->processID)->processCpup; + if (processCpupBase != NULL) { + processCpup[taskCB->processID].usage = OsCalculateCpupUsage(processCpupBase, pos, prePos, cpuAllCycle); + processCpup[taskCB->processID].status = OS_CPUP_USED; + } } } -- GitLab