From 6a7f4700c0c66368a44bdc482fbcf68085ef0c84 Mon Sep 17 00:00:00 2001 From: kuangyufei Date: Wed, 29 Mar 2023 17:20:16 +0800 Subject: [PATCH] =?UTF-8?q?=20=E8=BF=9B=E7=A8=8B=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E6=B3=A8=E9=87=8A=E5=AE=8C=E5=96=84=20=20=20=20=20=E9=B8=BF?= =?UTF-8?q?=E8=92=99=E7=A0=94=E7=A9=B6=E7=AB=99=20|=20http://weharmonyos.c?= =?UTF-8?q?om=20(=E5=9B=BD=E5=86=85)=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20|=20https://weharmony.github.io=20(=E5=9B=BD=E5=A4=96)?= =?UTF-8?q?=20=20=20=20=20=E8=AE=BA=E5=9D=9B=20|=20http://bbs.weharmonyos.?= =?UTF-8?q?com=20=20=20=20=20=E6=96=87=E6=A1=A3=E4=B8=AD=E5=BF=83=20|=20ht?= =?UTF-8?q?tp://open.weharmonyos.com=20=20=20=20=20=E5=8F=82=E8=80=83?= =?UTF-8?q?=E6=89=8B=E5=86=8C=20|=20http://doxygen.weharmonyos.com?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 - kernel/base/container/los_container.c | 10 +- kernel/base/container/los_pid_container.c | 4 +- kernel/base/core/los_process.c | 16 +- kernel/base/include/los_container_pri.h | 6 +- kernel/base/include/los_process_pri.h | 14 +- kernel/extended/plimit/los_ipclimit.c | 2 +- kernel/extended/plimit/los_ipclimit.h | 12 +- kernel/extended/plimit/los_plimits.c | 876 +++++++++++----------- kernel/extended/plimit/los_plimits.h | 12 +- zzz/git/push.sh | 2 +- 11 files changed, 481 insertions(+), 474 deletions(-) diff --git a/README.md b/README.md index 84bfe778..3d575656 100644 --- a/README.md +++ b/README.md @@ -289,7 +289,6 @@ 据说喜欢 **点赞 + 分享** 的,后来都成了大神。:) [ >> 查看捐助名单](./donate.md) ![](https://weharmonyos.oss-cn-hangzhou.aliyuncs.com/resources/common/so1so.png) - ``` 互联网从业十五年,计算机硕士,技术副总裁 关注我,持续更新四十年,即聊技术也谈人生 diff --git a/kernel/base/container/los_container.c b/kernel/base/container/los_container.c index 9bb59ba9..c5cf65a7 100644 --- a/kernel/base/container/los_container.c +++ b/kernel/base/container/los_container.c @@ -33,13 +33,13 @@ #include "los_process_pri.h" #include "internal.h" -STATIC Container g_rootContainer; -STATIC ContainerLimit g_containerLimit; -STATIC Atomic g_containerCount = 0xF0000000U; +STATIC Container g_rootContainer;//根容器 +STATIC ContainerLimit g_containerLimit;//所有类型容器上限 +STATIC Atomic g_containerCount = 0xF0000000U;//容器数量 #ifdef LOSCFG_USER_CONTAINER STATIC Credentials *g_rootCredentials = NULL; #endif - +//获取一个容器 UINT32 OsAllocContainerID(VOID) { return LOS_AtomicIncRet(&g_containerCount); @@ -108,7 +108,7 @@ UINT32 OsContainerLimitCheck(ContainerType type, UINT32 *containerCount) SCHEDULER_UNLOCK(intSave); return LOS_OK; } - +//设置容器上限 UINT32 OsSetContainerLimit(ContainerType type, UINT32 value) { UINT32 intSave; diff --git a/kernel/base/container/los_pid_container.c b/kernel/base/container/los_pid_container.c index ba0bf9e4..34a391eb 100644 --- a/kernel/base/container/los_pid_container.c +++ b/kernel/base/container/los_pid_container.c @@ -36,7 +36,7 @@ #ifdef LOSCFG_PID_CONTAINER -STATIC UINT32 g_currentPidContainerNum; +STATIC UINT32 g_currentPidContainerNum;//进程类容器当前数量 STATIC LosProcessCB *g_defaultProcessCB = NULL; STATIC LosTaskCB *g_defaultTaskCB = NULL; @@ -252,7 +252,7 @@ VOID OsPidContainerDestroyAllProcess(LosProcessCB *curr) } } } - +//创建一个新的进程容器 STATIC PidContainer *CreateNewPidContainer(PidContainer *parent) { UINT32 index; diff --git a/kernel/base/core/los_process.c b/kernel/base/core/los_process.c index 9949a7aa..7135dd76 100644 --- a/kernel/base/core/los_process.c +++ b/kernel/base/core/los_process.c @@ -168,14 +168,14 @@ UINT32 OsProcessAddNewTask(UINTPTR processID, LosTaskCB *taskCB, SchedParam *par */ ProcessGroup *OsCreateProcessGroup(LosProcessCB *processCB) { - ProcessGroup *pgroup = LOS_MemAlloc(m_aucSysMem1, sizeof(ProcessGroup)); + ProcessGroup *pgroup = LOS_MemAlloc(m_aucSysMem1, sizeof(ProcessGroup));//分配一个进程组 if (pgroup == NULL) { return NULL; } - pgroup->pgroupLeader = (UINTPTR)processCB; - LOS_ListInit(&pgroup->processList); - LOS_ListInit(&pgroup->exitProcessList); + pgroup->pgroupLeader = (UINTPTR)processCB;//指定进程组负责人 + LOS_ListInit(&pgroup->processList);//初始化组员链表 + LOS_ListInit(&pgroup->exitProcessList);//初始化僵死进程链表 LOS_ListTailInsert(&pgroup->processList, &processCB->subordinateGroupList); processCB->pgroup = pgroup; @@ -617,8 +617,8 @@ STATIC VOID SystemProcessEarlyInit(LosProcessCB *processCB) #ifdef LOSCFG_KERNEL_CONTAINER OsContainerInitSystemProcess(processCB); #endif - if (processCB == OsGetKernelInitProcess()) { - OsSetMainTaskProcess((UINTPTR)processCB); + if (processCB == OsGetKernelInitProcess()) {//2号进程 + OsSetMainTaskProcess((UINTPTR)processCB);//将内核根进程设为主任务所属进程 } } /*! 进程模块初始化,被编译放在代码段 .init 中*/ @@ -662,7 +662,7 @@ UINT32 OsProcessInit(VOID) #ifdef LOSCFG_KERNEL_PLIMITS OsProcLimiterSetInit(); #endif - SystemProcessEarlyInit(OsGetIdleProcess()); + SystemProcessEarlyInit(OsGetIdleProcess());//初始化 0,1,2号进程 SystemProcessEarlyInit(OsGetUserInitProcess()); SystemProcessEarlyInit(OsGetKernelInitProcess()); return LOS_OK; @@ -2435,7 +2435,7 @@ LITE_OS_SEC_TEXT LosProcessCB *OsGetKernelInitProcess(VOID) { return &g_processCBArray[OS_KERNEL_ROOT_PROCESS_ID]; } - +/// 获取空闲进程,0号进程为空闲进程,该进程不干活,专给CPU休息的。 LITE_OS_SEC_TEXT LosProcessCB *OsGetIdleProcess(VOID) { return &g_processCBArray[OS_KERNEL_IDLE_PROCESS_ID]; diff --git a/kernel/base/include/los_container_pri.h b/kernel/base/include/los_container_pri.h index d7b72c70..4f087c39 100644 --- a/kernel/base/include/los_container_pri.h +++ b/kernel/base/include/los_container_pri.h @@ -57,10 +57,10 @@ typedef enum { CONTAINER = 0, - PID_CONTAINER, - PID_CHILD_CONTAINER, + PID_CONTAINER, //进程容器 + PID_CHILD_CONTAINER, //子进程容器 UTS_CONTAINER, - MNT_CONTAINER, + MNT_CONTAINER, //挂载容器 IPC_CONTAINER, USER_CONTAINER, TIME_CONTAINER, diff --git a/kernel/base/include/los_process_pri.h b/kernel/base/include/los_process_pri.h index 07613a15..588bcb31 100644 --- a/kernel/base/include/los_process_pri.h +++ b/kernel/base/include/los_process_pri.h @@ -77,7 +77,7 @@ typedef struct { #endif /*! 进程组结构体*/ typedef struct ProcessGroup { - UINTPTR pgroupLeader; /**< Process group leader is the the process that created the group */ + UINTPTR pgroupLeader; /**< Process group leader is the the process that created the group | 负责创建进程组的进程首地址*/ LOS_DL_LIST processList; /**< List of processes under this process group | 属于该进程组的进程链表*/ LOS_DL_LIST exitProcessList; /**< List of closed processes (zombie processes) under this group | 进程组的僵死进程链表*/ LOS_DL_LIST groupList; /**< Process group list | 进程组链表,上面挂的都是进程组*/ @@ -138,13 +138,13 @@ typedef struct ProcessCB { #endif struct rlimit *resourceLimit; ///< 每个进程在运行时系统不会无限制的允许单个进程不断的消耗资源,因此都会设置资源限制。 #ifdef LOSCFG_KERNEL_CONTAINER - Container *container; + Container *container; ///< 内核容器 #ifdef LOSCFG_USER_CONTAINER - struct Credentials *credentials; + struct Credentials *credentials; ///< 用户身份证 #endif #endif #ifdef LOSCFG_PROC_PROCESS_DIR - struct ProcDirEntry *procDir; + struct ProcDirEntry *procDir; ///< 目录文件项 #endif #ifdef LOSCFG_KERNEL_PLIMITS ProcLimiterSet *plimits; @@ -320,19 +320,19 @@ STATIC INLINE BOOL OsProcessIsPGroupLeader(const LosProcessCB *processCB) * @ingroup los_process * ID of the kernel idle process */ -#define OS_KERNEL_IDLE_PROCESS_ID 0U +#define OS_KERNEL_IDLE_PROCESS_ID 0U //0号进程为空闲进程 /** * @ingroup los_process * ID of the user root process */ -#define OS_USER_ROOT_PROCESS_ID 1U +#define OS_USER_ROOT_PROCESS_ID 1U //1号为用户态根进程 /** * @ingroup los_process * ID of the kernel root process */ -#define OS_KERNEL_ROOT_PROCESS_ID 2U +#define OS_KERNEL_ROOT_PROCESS_ID 2U //1号为内核态根进程 #define OS_TASK_DEFAULT_STACK_SIZE 0x2000 ///< task默认栈大小 8K #define OS_USER_TASK_SYSCALL_STACK_SIZE 0x3000 ///< 用户通过系统调用的栈大小 12K ,这时是运行在内核模式下 #define OS_USER_TASK_STACK_SIZE 0x100000 ///< 用户任务运行在用户空间的栈大小 1M diff --git a/kernel/extended/plimit/los_ipclimit.c b/kernel/extended/plimit/los_ipclimit.c index 746d0452..c60daa17 100644 --- a/kernel/extended/plimit/los_ipclimit.c +++ b/kernel/extended/plimit/los_ipclimit.c @@ -34,7 +34,7 @@ STATIC ProcIPCLimit *g_rootIPCLimit = NULL; #define PLIMIT_IPC_SHM_LIMIT_MAX 0xFFFFFFFF - +//IPC限额初始化 VOID OsIPCLimitInit(UINTPTR limite) { ProcIPCLimit *plimite = (ProcIPCLimit *)limite; diff --git a/kernel/extended/plimit/los_ipclimit.h b/kernel/extended/plimit/los_ipclimit.h index b91da73d..322b3eac 100644 --- a/kernel/extended/plimit/los_ipclimit.h +++ b/kernel/extended/plimit/los_ipclimit.h @@ -40,17 +40,17 @@ extern "C" { #endif /* __cplusplus */ typedef struct ProcIPCLimit { - UINT32 mqCount; + UINT32 mqCount;//当前队列个数 UINT32 mqFailedCount; - UINT32 mqCountLimit; - UINT32 shmSize; + UINT32 mqCountLimit;//队列个数上限 + UINT32 shmSize;// UINT32 shmFailedCount; - UINT32 shmSizeLimit; + UINT32 shmSizeLimit;//共享内存上限 } ProcIPCLimit; enum IPCStatType { - IPC_STAT_TYPE_MQ = 0, - IPC_STAT_TYPE_SHM = 3, + IPC_STAT_TYPE_MQ = 0,//消息队列 + IPC_STAT_TYPE_SHM = 3,//共享内存 IPC_STAT_TYPE_BUT // buttock }; diff --git a/kernel/extended/plimit/los_plimits.c b/kernel/extended/plimit/los_plimits.c index 50299eb7..8fff8ce1 100644 --- a/kernel/extended/plimit/los_plimits.c +++ b/kernel/extended/plimit/los_plimits.c @@ -1,434 +1,442 @@ -/* - * Copyright (c) 2023-2023 Huawei Device Co., Ltd. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * 3. Neither the name of the copyright holder nor the names of its contributors may be used - * to endorse or promote products derived from this software without specific prior written - * permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifdef LOSCFG_KERNEL_PLIMITS -#include "los_base.h" -#include "los_process_pri.h" -#include "hal_timer.h" -#include "los_plimits.h" - -typedef struct PlimiteOperations { - VOID (*LimiterInit)(UINTPTR); - VOID *(*LimiterAlloc)(VOID); - VOID (*LimiterFree)(UINTPTR); - VOID (*LimiterCopy)(UINTPTR, UINTPTR); - BOOL (*LimiterAddProcessCheck)(UINTPTR, UINTPTR); - VOID (*LimiterAddProcess)(UINTPTR, UINTPTR); - VOID (*LimiterDelProcess)(UINTPTR, UINTPTR); - BOOL (*LimiterMigrateCheck)(UINTPTR, UINTPTR); - VOID (*LimiterMigrate)(UINTPTR, UINTPTR, UINTPTR); -} PlimiteOperations; - -static PlimiteOperations g_limiteOps[PROCESS_LIMITER_COUNT] = { - [PROCESS_LIMITER_ID_PIDS] = { - .LimiterInit = PidLimiterInit, - .LimiterAlloc = PidLimiterAlloc, - .LimiterFree = PidLimterFree, - .LimiterCopy = PidLimiterCopy, - .LimiterAddProcessCheck = OsPidLimitAddProcessCheck, - .LimiterAddProcess = OsPidLimitAddProcess, - .LimiterDelProcess = OsPidLimitDelProcess, - .LimiterMigrateCheck = PidLimitMigrateCheck, - .LimiterMigrate = NULL, - }, -#ifdef LOSCFG_KERNEL_MEM_PLIMIT - [PROCESS_LIMITER_ID_MEM] = { - .LimiterInit = OsMemLimiterInit, - .LimiterAlloc = OsMemLimiterAlloc, - .LimiterFree = OsMemLimiterFree, - .LimiterCopy = OsMemLimiterCopy, - .LimiterAddProcessCheck = OsMemLimitAddProcessCheck, - .LimiterAddProcess = OsMemLimitAddProcess, - .LimiterDelProcess = OsMemLimitDelProcess, - .LimiterMigrateCheck = MemLimiteMigrateCheck, - .LimiterMigrate = OsMemLimiterMigrate, - }, -#endif -#ifdef LOSCFG_KERNEL_SCHED_PLIMIT - [PROCESS_LIMITER_ID_SCHED] = { - .LimiterInit = OsSchedLimitInit, - .LimiterAlloc = OsSchedLimitAlloc, - .LimiterFree = OsSchedLimitFree, - .LimiterCopy = OsSchedLimitCopy, - .LimiterAddProcessCheck = NULL, - .LimiterAddProcess = NULL, - .LimiterDelProcess = NULL, - .LimiterMigrateCheck = NULL, - .LimiterMigrate = NULL, - }, -#endif -#ifdef LOSCFG_KERNEL_DEV_PLIMIT - [PROCESS_LIMITER_ID_DEV] = { - .LimiterInit = OsDevLimitInit, - .LimiterAlloc = OsDevLimitAlloc, - .LimiterFree = OsDevLimitFree, - .LimiterCopy = OsDevLimitCopy, - .LimiterAddProcessCheck = NULL, - .LimiterAddProcess = NULL, - .LimiterDelProcess = NULL, - .LimiterMigrateCheck = NULL, - .LimiterMigrate = NULL, - }, -#endif -#ifdef LOSCFG_KERNEL_IPC_PLIMIT - [PROCESS_LIMITER_ID_IPC] = { - .LimiterInit = OsIPCLimitInit, - .LimiterAlloc = OsIPCLimitAlloc, - .LimiterFree = OsIPCLimitFree, - .LimiterCopy = OsIPCLimitCopy, - .LimiterAddProcessCheck = OsIPCLimitAddProcessCheck, - .LimiterAddProcess = OsIPCLimitAddProcess, - .LimiterDelProcess = OsIPCLimitDelProcess, - .LimiterMigrateCheck = OsIPCLimiteMigrateCheck, - .LimiterMigrate = OsIPCLimitMigrate, - }, -#endif -}; - -STATIC ProcLimiterSet *g_rootPLimite = NULL; - -ProcLimiterSet *OsRootPLimitsGet(VOID) -{ - return g_rootPLimite; -} - -UINT32 OsProcLimiterSetInit(VOID) -{ - g_rootPLimite = (ProcLimiterSet *)LOS_MemAlloc(m_aucSysMem1, sizeof(ProcLimiterSet)); - if (g_rootPLimite == NULL) { - return ENOMEM; - } - (VOID)memset_s(g_rootPLimite, sizeof(ProcLimiterSet), 0, sizeof(ProcLimiterSet)); - - LOS_ListInit(&g_rootPLimite->childList); - LOS_ListInit(&g_rootPLimite->processList); - - ProcLimiterSet *procLimiterSet = g_rootPLimite; - for (INT32 plimiteID = 0; plimiteID < PROCESS_LIMITER_COUNT; ++plimiteID) { - procLimiterSet->limitsList[plimiteID] = (UINTPTR)g_limiteOps[plimiteID].LimiterAlloc(); - if (procLimiterSet->limitsList[plimiteID] == (UINTPTR)NULL) { - OsPLimitsFree(procLimiterSet); - return ENOMEM; - } - - if (g_limiteOps[plimiteID].LimiterInit != NULL) { - g_limiteOps[plimiteID].LimiterInit(procLimiterSet->limitsList[plimiteID]); - } - } - return LOS_OK; -} - -STATIC VOID PLimitsDeleteProcess(LosProcessCB *processCB) -{ - if ((processCB == NULL) || (processCB->plimits == NULL)) { - return; - } - - ProcLimiterSet *plimits = processCB->plimits; - for (UINT32 limitsID = 0; limitsID < PROCESS_LIMITER_COUNT; limitsID++) { - if (g_limiteOps[limitsID].LimiterDelProcess == NULL) { - continue; - } - g_limiteOps[limitsID].LimiterDelProcess(plimits->limitsList[limitsID], (UINTPTR)processCB); - } - plimits->pidCount--; - LOS_ListDelete(&processCB->plimitsList); - processCB->plimits = NULL; - return; -} - -STATIC UINT32 PLimitsAddProcess(ProcLimiterSet *plimits, LosProcessCB *processCB) -{ - UINT32 limitsID; - if (plimits == NULL) { - plimits = g_rootPLimite; - } - - if (processCB->plimits == g_rootPLimite) { - return EPERM; - } - - if (processCB->plimits == plimits) { - return LOS_OK; - } - - for (limitsID = 0; limitsID < PROCESS_LIMITER_COUNT; limitsID++) { - if (g_limiteOps[limitsID].LimiterAddProcessCheck == NULL) { - continue; - } - - if (!g_limiteOps[limitsID].LimiterAddProcessCheck(plimits->limitsList[limitsID], (UINTPTR)processCB)) { - return EACCES; - } - } - - PLimitsDeleteProcess(processCB); - - for (limitsID = 0; limitsID < PROCESS_LIMITER_COUNT; limitsID++) { - if (g_limiteOps[limitsID].LimiterAddProcess == NULL) { - continue; - } - g_limiteOps[limitsID].LimiterAddProcess(plimits->limitsList[limitsID], (UINTPTR)processCB); - } - - LOS_ListTailInsert(&plimits->processList, &processCB->plimitsList); - plimits->pidCount++; - processCB->plimits = plimits; - return LOS_OK; -} - -UINT32 OsPLimitsAddProcess(ProcLimiterSet *plimits, LosProcessCB *processCB) -{ - UINT32 intSave; - SCHEDULER_LOCK(intSave); - UINT32 ret = PLimitsAddProcess(plimits, processCB); - SCHEDULER_UNLOCK(intSave); - return ret; -} - -UINT32 OsPLimitsAddPid(ProcLimiterSet *plimits, UINT32 pid) -{ - UINT32 intSave, ret; - if ((plimits == NULL) || OS_PID_CHECK_INVALID(pid) || (pid == 0)) { - return EINVAL; - } - - if (plimits == g_rootPLimite) { - return EPERM; - } - - SCHEDULER_LOCK(intSave); - LosProcessCB *processCB = OS_PCB_FROM_PID((unsigned int)pid); - if (OsProcessIsInactive(processCB)) { - SCHEDULER_UNLOCK(intSave); - return EINVAL; - } - - ret = PLimitsAddProcess(plimits, processCB); - SCHEDULER_UNLOCK(intSave); - return ret; -} - -VOID OsPLimitsDeleteProcess(LosProcessCB *processCB) -{ - UINT32 intSave; - SCHEDULER_LOCK(intSave); - PLimitsDeleteProcess(processCB); - SCHEDULER_UNLOCK(intSave); -} - -UINT32 OsPLimitsPidsGet(const ProcLimiterSet *plimits, UINT32 *pids, UINT32 size) -{ - UINT32 intSave; - LosProcessCB *processCB = NULL; - UINT32 minSize = LOS_GetSystemProcessMaximum() * sizeof(UINT32); - if ((plimits == NULL) || (pids == NULL) || (size < minSize)) { - return EINVAL; - } - - SCHEDULER_LOCK(intSave); - LOS_DL_LIST *listHead = (LOS_DL_LIST *)&plimits->processList; - if (LOS_ListEmpty(listHead)) { - SCHEDULER_UNLOCK(intSave); - return EINVAL; - } - - LOS_DL_LIST_FOR_EACH_ENTRY(processCB, listHead, LosProcessCB, plimitsList) { - pids[OsGetPid(processCB)] = 1; - } - SCHEDULER_UNLOCK(intSave); - return LOS_OK; -} - -STATIC VOID PLimitsProcessMerge(ProcLimiterSet *currPLimits, ProcLimiterSet *parentPLimits) -{ - LOS_DL_LIST *head = &currPLimits->processList; - while (!LOS_ListEmpty(head)) { - LosProcessCB *processCB = LOS_DL_LIST_ENTRY(head->pstNext, LosProcessCB, plimitsList); - PLimitsDeleteProcess(processCB); - PLimitsAddProcess(parentPLimits, processCB); - } - LOS_ListDelete(&currPLimits->childList); - currPLimits->parent = NULL; - return; -} - -STATIC UINT32 PLimitsMigrateCheck(ProcLimiterSet *currPLimits, ProcLimiterSet *parentPLimits) -{ - for (UINT32 limiteID = 0; limiteID < PROCESS_LIMITER_COUNT; limiteID++) { - UINTPTR currLimit = currPLimits->limitsList[limiteID]; - UINTPTR parentLimit = parentPLimits->limitsList[limiteID]; - if (g_limiteOps[limiteID].LimiterMigrateCheck == NULL) { - continue; - } - - if (!g_limiteOps[limiteID].LimiterMigrateCheck(currLimit, parentLimit)) { - return EPERM; - } - } - return LOS_OK; -} - -UINT32 OsPLimitsFree(ProcLimiterSet *currPLimits) -{ - UINT32 intSave, ret; - if (currPLimits == NULL) { - return EINVAL; - } - - SCHEDULER_LOCK(intSave); - ProcLimiterSet *parentPLimits = currPLimits->parent; - ret = PLimitsMigrateCheck(currPLimits, parentPLimits); - if (ret != LOS_OK) { - SCHEDULER_UNLOCK(intSave); - return ret; - } - - PLimitsProcessMerge(currPLimits, parentPLimits); - SCHEDULER_UNLOCK(intSave); - - for (INT32 limiteID = 0; limiteID < PROCESS_LIMITER_COUNT; ++limiteID) { - UINTPTR procLimiter = currPLimits->limitsList[limiteID]; - if (g_limiteOps[limiteID].LimiterFree != NULL) { - g_limiteOps[limiteID].LimiterFree(procLimiter); - } - } - (VOID)LOS_MemFree(m_aucSysMem1, currPLimits); - return LOS_OK; -} - -ProcLimiterSet *OsPLimitsCreate(ProcLimiterSet *parentPLimits) -{ - UINT32 intSave; - - ProcLimiterSet *newPLimits = (ProcLimiterSet *)LOS_MemAlloc(m_aucSysMem1, sizeof(ProcLimiterSet)); - if (newPLimits == NULL) { - return NULL; - } - (VOID)memset_s(newPLimits, sizeof(ProcLimiterSet), 0, sizeof(ProcLimiterSet)); - LOS_ListInit(&newPLimits->childList); - LOS_ListInit(&newPLimits->processList); - - SCHEDULER_LOCK(intSave); - newPLimits->parent = parentPLimits; - newPLimits->level = parentPLimits->level + 1; - newPLimits->mask = parentPLimits->mask; - - for (INT32 plimiteID = 0; plimiteID < PROCESS_LIMITER_COUNT; ++plimiteID) { - newPLimits->limitsList[plimiteID] = (UINTPTR)g_limiteOps[plimiteID].LimiterAlloc(); - if (newPLimits->limitsList[plimiteID] == (UINTPTR)NULL) { - SCHEDULER_UNLOCK(intSave); - OsPLimitsFree(newPLimits); - return NULL; - } - - if (g_limiteOps[plimiteID].LimiterCopy != NULL) { - g_limiteOps[plimiteID].LimiterCopy(newPLimits->limitsList[plimiteID], - parentPLimits->limitsList[plimiteID]); - } - } - LOS_ListTailInsert(&g_rootPLimite->childList, &newPLimits->childList); - - (VOID)PLimitsDeleteProcess(OsCurrProcessGet()); - (VOID)PLimitsAddProcess(newPLimits, OsCurrProcessGet()); - SCHEDULER_UNLOCK(intSave); - return newPLimits; -} - -#ifdef LOSCFG_KERNEL_MEM_PLIMIT -UINT32 OsPLimitsMemUsageGet(ProcLimiterSet *plimits, UINT64 *usage, UINT32 size) -{ - UINT32 intSave; - LosProcessCB *processCB = NULL; - UINT32 minSize = LOS_GetSystemProcessMaximum() * sizeof(UINT64) + sizeof(ProcMemLimiter); - ProcMemLimiter *memLimit = (ProcMemLimiter *)usage; - UINT64 *memSuage = (UINT64 *)((UINTPTR)usage + sizeof(ProcMemLimiter)); - if ((plimits == NULL) || (usage == NULL) || (size < minSize)) { - return EINVAL; - } - - SCHEDULER_LOCK(intSave); - (VOID)memcpy_s(memLimit, sizeof(ProcMemLimiter), - (VOID *)plimits->limitsList[PROCESS_LIMITER_ID_MEM], sizeof(ProcMemLimiter)); - LOS_DL_LIST *listHead = (LOS_DL_LIST *)&plimits->processList; - if (LOS_ListEmpty(listHead)) { - SCHEDULER_UNLOCK(intSave); - return EINVAL; - } - - LOS_DL_LIST_FOR_EACH_ENTRY(processCB, listHead, LosProcessCB, plimitsList) { - memSuage[OsGetPid(processCB)] = processCB->limitStat.memUsed; - } - SCHEDULER_UNLOCK(intSave); - return LOS_OK; -} -#endif - -#ifdef LOSCFG_KERNEL_IPC_PLIMIT -UINT32 OsPLimitsIPCStatGet(ProcLimiterSet *plimits, ProcIPCLimit *ipc, UINT32 size) -{ - UINT32 intSave; - if ((plimits == NULL) || (ipc == NULL) || (size != sizeof(ProcIPCLimit))) { - return EINVAL; - } - - SCHEDULER_LOCK(intSave); - (VOID)memcpy_s(ipc, sizeof(ProcIPCLimit), - (VOID *)plimits->limitsList[PROCESS_LIMITER_ID_IPC], sizeof(ProcIPCLimit)); - SCHEDULER_UNLOCK(intSave); - return LOS_OK; -} -#endif - -#ifdef LOSCFG_KERNEL_SCHED_PLIMIT -UINT32 OsPLimitsSchedUsageGet(ProcLimiterSet *plimits, UINT64 *usage, UINT32 size) -{ - UINT32 intSave; - LosProcessCB *processCB = NULL; - UINT32 minSize = LOS_GetSystemProcessMaximum() * sizeof(UINT64); - if ((plimits == NULL) || (usage == NULL) || (size < minSize)) { - return EINVAL; - } - - SCHEDULER_LOCK(intSave); - LOS_DL_LIST *listHead = (LOS_DL_LIST *)&plimits->processList; - if (LOS_ListEmpty(listHead)) { - SCHEDULER_UNLOCK(intSave); - return EINVAL; - } - - LOS_DL_LIST_FOR_EACH_ENTRY(processCB, listHead, LosProcessCB, plimitsList) { - usage[OsGetPid(processCB)] = processCB->limitStat.allRuntime; - } - SCHEDULER_UNLOCK(intSave); - return LOS_OK; -} -#endif -#endif +/* + * Copyright (c) 2023-2023 Huawei Device Co., Ltd. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its contributors may be used + * to endorse or promote products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* +http://open.weharmonyos.com/zh-cn/device-dev/kernel/kernel-small-plimits.html +面对进程越来越多,应用环境越来越复杂的状况,需要对容器做限制,若不做限制,会发生资源浪费、争夺等。 +容器配额plimits(Process Limits)是内核提供的一种可以限制单个进程或者多个进程所使用资源的机制, +可以对cpu,内存等资源实现精细化控制。plimits的接口通过plimitsfs的伪文件系统提供。 +通过操作文件对进程及进程资源进行分组管理,通过配置plimits组内限制器Plimiter限制进程组的memory、sched等资源的使用。 +*/ + +#ifdef LOSCFG_KERNEL_PLIMITS +#include "los_base.h" +#include "los_process_pri.h" +#include "hal_timer.h" +#include "los_plimits.h" +//容器限额统一接口 +typedef struct PlimiteOperations { + VOID (*LimiterInit)(UINTPTR);//初始化 + VOID (*LimiterAlloc)(VOID);//分配 + VOID (*LimiterFree)(UINTPTR); + VOID (*LimiterCopy)(UINTPTR, UINTPTR); + BOOL (*LimiterAddProcessCheck)(UINTPTR, UINTPTR); + VOID (*LimiterAddProcess)(UINTPTR, UINTPTR); + VOID (*LimiterDelProcess)(UINTPTR, UINTPTR); + BOOL (*LimiterMigrateCheck)(UINTPTR, UINTPTR); + VOID (*LimiterMigrate)(UINTPTR, UINTPTR, UINTPTR); +} PlimiteOperations; + +static PlimiteOperations g_limiteOps[PROCESS_LIMITER_COUNT] = { + [PROCESS_LIMITER_ID_PIDS] = { + .LimiterInit = PidLimiterInit, + .LimiterAlloc = PidLimiterAlloc, + .LimiterFree = PidLimterFree, + .LimiterCopy = PidLimiterCopy, + .LimiterAddProcessCheck = OsPidLimitAddProcessCheck, + .LimiterAddProcess = OsPidLimitAddProcess, + .LimiterDelProcess = OsPidLimitDelProcess, + .LimiterMigrateCheck = PidLimitMigrateCheck, + .LimiterMigrate = NULL, + }, +#ifdef LOSCFG_KERNEL_MEM_PLIMIT + [PROCESS_LIMITER_ID_MEM] = { + .LimiterInit = OsMemLimiterInit, + .LimiterAlloc = OsMemLimiterAlloc, + .LimiterFree = OsMemLimiterFree, + .LimiterCopy = OsMemLimiterCopy, + .LimiterAddProcessCheck = OsMemLimitAddProcessCheck, + .LimiterAddProcess = OsMemLimitAddProcess, + .LimiterDelProcess = OsMemLimitDelProcess, + .LimiterMigrateCheck = MemLimiteMigrateCheck, + .LimiterMigrate = OsMemLimiterMigrate, + }, +#endif +#ifdef LOSCFG_KERNEL_SCHED_PLIMIT + [PROCESS_LIMITER_ID_SCHED] = { + .LimiterInit = OsSchedLimitInit, + .LimiterAlloc = OsSchedLimitAlloc, + .LimiterFree = OsSchedLimitFree, + .LimiterCopy = OsSchedLimitCopy, + .LimiterAddProcessCheck = NULL, + .LimiterAddProcess = NULL, + .LimiterDelProcess = NULL, + .LimiterMigrateCheck = NULL, + .LimiterMigrate = NULL, + }, +#endif +#ifdef LOSCFG_KERNEL_DEV_PLIMIT + [PROCESS_LIMITER_ID_DEV] = { + .LimiterInit = OsDevLimitInit, + .LimiterAlloc = OsDevLimitAlloc, + .LimiterFree = OsDevLimitFree, + .LimiterCopy = OsDevLimitCopy, + .LimiterAddProcessCheck = NULL, + .LimiterAddProcess = NULL, + .LimiterDelProcess = NULL, + .LimiterMigrateCheck = NULL, + .LimiterMigrate = NULL, + }, +#endif +#ifdef LOSCFG_KERNEL_IPC_PLIMIT + [PROCESS_LIMITER_ID_IPC] = { + .LimiterInit = OsIPCLimitInit, + .LimiterAlloc = OsIPCLimitAlloc, + .LimiterFree = OsIPCLimitFree, + .LimiterCopy = OsIPCLimitCopy, + .LimiterAddProcessCheck = OsIPCLimitAddProcessCheck, + .LimiterAddProcess = OsIPCLimitAddProcess, + .LimiterDelProcess = OsIPCLimitDelProcess, + .LimiterMigrateCheck = OsIPCLimiteMigrateCheck, + .LimiterMigrate = OsIPCLimitMigrate, + }, +#endif +}; + +STATIC ProcLimiterSet *g_rootPLimite = NULL; + +ProcLimiterSet *OsRootPLimitsGet(VOID) +{ + return g_rootPLimite; +} + +UINT32 OsProcLimiterSetInit(VOID) +{ + g_rootPLimite = (ProcLimiterSet *)LOS_MemAlloc(m_aucSysMem1, sizeof(ProcLimiterSet)); + if (g_rootPLimite == NULL) { + return ENOMEM; + } + (VOID)memset_s(g_rootPLimite, sizeof(ProcLimiterSet), 0, sizeof(ProcLimiterSet)); + + LOS_ListInit(&g_rootPLimite->childList); + LOS_ListInit(&g_rootPLimite->processList); + + ProcLimiterSet *procLimiterSet = g_rootPLimite; + for (INT32 plimiteID = 0; plimiteID < PROCESS_LIMITER_COUNT; ++plimiteID) { + procLimiterSet->limitsList[plimiteID] = (UINTPTR)g_limiteOps[plimiteID].LimiterAlloc(); + if (procLimiterSet->limitsList[plimiteID] == (UINTPTR)NULL) { + OsPLimitsFree(procLimiterSet); + return ENOMEM; + } + + if (g_limiteOps[plimiteID].LimiterInit != NULL) { + g_limiteOps[plimiteID].LimiterInit(procLimiterSet->limitsList[plimiteID]); + } + } + return LOS_OK; +} + +STATIC VOID PLimitsDeleteProcess(LosProcessCB *processCB) +{ + if ((processCB == NULL) || (processCB->plimits == NULL)) { + return; + } + + ProcLimiterSet *plimits = processCB->plimits; + for (UINT32 limitsID = 0; limitsID < PROCESS_LIMITER_COUNT; limitsID++) { + if (g_limiteOps[limitsID].LimiterDelProcess == NULL) { + continue; + } + g_limiteOps[limitsID].LimiterDelProcess(plimits->limitsList[limitsID], (UINTPTR)processCB); + } + plimits->pidCount--; + LOS_ListDelete(&processCB->plimitsList); + processCB->plimits = NULL; + return; +} + +STATIC UINT32 PLimitsAddProcess(ProcLimiterSet *plimits, LosProcessCB *processCB) +{ + UINT32 limitsID; + if (plimits == NULL) { + plimits = g_rootPLimite; + } + + if (processCB->plimits == g_rootPLimite) { + return EPERM; + } + + if (processCB->plimits == plimits) { + return LOS_OK; + } + + for (limitsID = 0; limitsID < PROCESS_LIMITER_COUNT; limitsID++) { + if (g_limiteOps[limitsID].LimiterAddProcessCheck == NULL) { + continue; + } + + if (!g_limiteOps[limitsID].LimiterAddProcessCheck(plimits->limitsList[limitsID], (UINTPTR)processCB)) { + return EACCES; + } + } + + PLimitsDeleteProcess(processCB); + + for (limitsID = 0; limitsID < PROCESS_LIMITER_COUNT; limitsID++) { + if (g_limiteOps[limitsID].LimiterAddProcess == NULL) { + continue; + } + g_limiteOps[limitsID].LimiterAddProcess(plimits->limitsList[limitsID], (UINTPTR)processCB); + } + + LOS_ListTailInsert(&plimits->processList, &processCB->plimitsList); + plimits->pidCount++; + processCB->plimits = plimits; + return LOS_OK; +} + +UINT32 OsPLimitsAddProcess(ProcLimiterSet *plimits, LosProcessCB *processCB) +{ + UINT32 intSave; + SCHEDULER_LOCK(intSave); + UINT32 ret = PLimitsAddProcess(plimits, processCB); + SCHEDULER_UNLOCK(intSave); + return ret; +} + +UINT32 OsPLimitsAddPid(ProcLimiterSet *plimits, UINT32 pid) +{ + UINT32 intSave, ret; + if ((plimits == NULL) || OS_PID_CHECK_INVALID(pid) || (pid == 0)) { + return EINVAL; + } + + if (plimits == g_rootPLimite) { + return EPERM; + } + + SCHEDULER_LOCK(intSave); + LosProcessCB *processCB = OS_PCB_FROM_PID((unsigned int)pid); + if (OsProcessIsInactive(processCB)) { + SCHEDULER_UNLOCK(intSave); + return EINVAL; + } + + ret = PLimitsAddProcess(plimits, processCB); + SCHEDULER_UNLOCK(intSave); + return ret; +} + +VOID OsPLimitsDeleteProcess(LosProcessCB *processCB) +{ + UINT32 intSave; + SCHEDULER_LOCK(intSave); + PLimitsDeleteProcess(processCB); + SCHEDULER_UNLOCK(intSave); +} + +UINT32 OsPLimitsPidsGet(const ProcLimiterSet *plimits, UINT32 *pids, UINT32 size) +{ + UINT32 intSave; + LosProcessCB *processCB = NULL; + UINT32 minSize = LOS_GetSystemProcessMaximum() * sizeof(UINT32); + if ((plimits == NULL) || (pids == NULL) || (size < minSize)) { + return EINVAL; + } + + SCHEDULER_LOCK(intSave); + LOS_DL_LIST *listHead = (LOS_DL_LIST *)&plimits->processList; + if (LOS_ListEmpty(listHead)) { + SCHEDULER_UNLOCK(intSave); + return EINVAL; + } + + LOS_DL_LIST_FOR_EACH_ENTRY(processCB, listHead, LosProcessCB, plimitsList) { + pids[OsGetPid(processCB)] = 1; + } + SCHEDULER_UNLOCK(intSave); + return LOS_OK; +} + +STATIC VOID PLimitsProcessMerge(ProcLimiterSet *currPLimits, ProcLimiterSet *parentPLimits) +{ + LOS_DL_LIST *head = &currPLimits->processList; + while (!LOS_ListEmpty(head)) { + LosProcessCB *processCB = LOS_DL_LIST_ENTRY(head->pstNext, LosProcessCB, plimitsList); + PLimitsDeleteProcess(processCB); + PLimitsAddProcess(parentPLimits, processCB); + } + LOS_ListDelete(&currPLimits->childList); + currPLimits->parent = NULL; + return; +} + +STATIC UINT32 PLimitsMigrateCheck(ProcLimiterSet *currPLimits, ProcLimiterSet *parentPLimits) +{ + for (UINT32 limiteID = 0; limiteID < PROCESS_LIMITER_COUNT; limiteID++) { + UINTPTR currLimit = currPLimits->limitsList[limiteID]; + UINTPTR parentLimit = parentPLimits->limitsList[limiteID]; + if (g_limiteOps[limiteID].LimiterMigrateCheck == NULL) { + continue; + } + + if (!g_limiteOps[limiteID].LimiterMigrateCheck(currLimit, parentLimit)) { + return EPERM; + } + } + return LOS_OK; +} + +UINT32 OsPLimitsFree(ProcLimiterSet *currPLimits) +{ + UINT32 intSave, ret; + if (currPLimits == NULL) { + return EINVAL; + } + + SCHEDULER_LOCK(intSave); + ProcLimiterSet *parentPLimits = currPLimits->parent; + ret = PLimitsMigrateCheck(currPLimits, parentPLimits); + if (ret != LOS_OK) { + SCHEDULER_UNLOCK(intSave); + return ret; + } + + PLimitsProcessMerge(currPLimits, parentPLimits); + SCHEDULER_UNLOCK(intSave); + + for (INT32 limiteID = 0; limiteID < PROCESS_LIMITER_COUNT; ++limiteID) { + UINTPTR procLimiter = currPLimits->limitsList[limiteID]; + if (g_limiteOps[limiteID].LimiterFree != NULL) { + g_limiteOps[limiteID].LimiterFree(procLimiter); + } + } + (VOID)LOS_MemFree(m_aucSysMem1, currPLimits); + return LOS_OK; +} + +ProcLimiterSet *OsPLimitsCreate(ProcLimiterSet *parentPLimits) +{ + UINT32 intSave; + + ProcLimiterSet *newPLimits = (ProcLimiterSet *)LOS_MemAlloc(m_aucSysMem1, sizeof(ProcLimiterSet)); + if (newPLimits == NULL) { + return NULL; + } + (VOID)memset_s(newPLimits, sizeof(ProcLimiterSet), 0, sizeof(ProcLimiterSet)); + LOS_ListInit(&newPLimits->childList); + LOS_ListInit(&newPLimits->processList); + + SCHEDULER_LOCK(intSave); + newPLimits->parent = parentPLimits; + newPLimits->level = parentPLimits->level + 1; + newPLimits->mask = parentPLimits->mask; + + for (INT32 plimiteID = 0; plimiteID < PROCESS_LIMITER_COUNT; ++plimiteID) { + newPLimits->limitsList[plimiteID] = (UINTPTR)g_limiteOps[plimiteID].LimiterAlloc(); + if (newPLimits->limitsList[plimiteID] == (UINTPTR)NULL) { + SCHEDULER_UNLOCK(intSave); + OsPLimitsFree(newPLimits); + return NULL; + } + + if (g_limiteOps[plimiteID].LimiterCopy != NULL) { + g_limiteOps[plimiteID].LimiterCopy(newPLimits->limitsList[plimiteID], + parentPLimits->limitsList[plimiteID]); + } + } + LOS_ListTailInsert(&g_rootPLimite->childList, &newPLimits->childList); + + (VOID)PLimitsDeleteProcess(OsCurrProcessGet()); + (VOID)PLimitsAddProcess(newPLimits, OsCurrProcessGet()); + SCHEDULER_UNLOCK(intSave); + return newPLimits; +} + +#ifdef LOSCFG_KERNEL_MEM_PLIMIT +UINT32 OsPLimitsMemUsageGet(ProcLimiterSet *plimits, UINT64 *usage, UINT32 size) +{ + UINT32 intSave; + LosProcessCB *processCB = NULL; + UINT32 minSize = LOS_GetSystemProcessMaximum() * sizeof(UINT64) + sizeof(ProcMemLimiter); + ProcMemLimiter *memLimit = (ProcMemLimiter *)usage; + UINT64 *memSuage = (UINT64 *)((UINTPTR)usage + sizeof(ProcMemLimiter)); + if ((plimits == NULL) || (usage == NULL) || (size < minSize)) { + return EINVAL; + } + + SCHEDULER_LOCK(intSave); + (VOID)memcpy_s(memLimit, sizeof(ProcMemLimiter), + (VOID *)plimits->limitsList[PROCESS_LIMITER_ID_MEM], sizeof(ProcMemLimiter)); + LOS_DL_LIST *listHead = (LOS_DL_LIST *)&plimits->processList; + if (LOS_ListEmpty(listHead)) { + SCHEDULER_UNLOCK(intSave); + return EINVAL; + } + + LOS_DL_LIST_FOR_EACH_ENTRY(processCB, listHead, LosProcessCB, plimitsList) { + memSuage[OsGetPid(processCB)] = processCB->limitStat.memUsed; + } + SCHEDULER_UNLOCK(intSave); + return LOS_OK; +} +#endif + +#ifdef LOSCFG_KERNEL_IPC_PLIMIT +UINT32 OsPLimitsIPCStatGet(ProcLimiterSet *plimits, ProcIPCLimit *ipc, UINT32 size) +{ + UINT32 intSave; + if ((plimits == NULL) || (ipc == NULL) || (size != sizeof(ProcIPCLimit))) { + return EINVAL; + } + + SCHEDULER_LOCK(intSave); + (VOID)memcpy_s(ipc, sizeof(ProcIPCLimit), + (VOID *)plimits->limitsList[PROCESS_LIMITER_ID_IPC], sizeof(ProcIPCLimit)); + SCHEDULER_UNLOCK(intSave); + return LOS_OK; +} +#endif + +#ifdef LOSCFG_KERNEL_SCHED_PLIMIT +UINT32 OsPLimitsSchedUsageGet(ProcLimiterSet *plimits, UINT64 *usage, UINT32 size) +{ + UINT32 intSave; + LosProcessCB *processCB = NULL; + UINT32 minSize = LOS_GetSystemProcessMaximum() * sizeof(UINT64); + if ((plimits == NULL) || (usage == NULL) || (size < minSize)) { + return EINVAL; + } + + SCHEDULER_LOCK(intSave); + LOS_DL_LIST *listHead = (LOS_DL_LIST *)&plimits->processList; + if (LOS_ListEmpty(listHead)) { + SCHEDULER_UNLOCK(intSave); + return EINVAL; + } + + LOS_DL_LIST_FOR_EACH_ENTRY(processCB, listHead, LosProcessCB, plimitsList) { + usage[OsGetPid(processCB)] = processCB->limitStat.allRuntime; + } + SCHEDULER_UNLOCK(intSave); + return LOS_OK; +} +#endif +#endif diff --git a/kernel/extended/plimit/los_plimits.h b/kernel/extended/plimit/los_plimits.h index f3c44fda..1fc142c0 100644 --- a/kernel/extended/plimit/los_plimits.h +++ b/kernel/extended/plimit/los_plimits.h @@ -65,19 +65,19 @@ enum ProcLimiterID { #ifdef LOSCFG_KERNEL_IPC_PLIMIT PROCESS_LIMITER_ID_IPC, #endif - PROCESS_LIMITER_COUNT, + PROCESS_LIMITER_COUNT,//进程 }; - +//容器限额情况 typedef struct { #ifdef LOSCFG_KERNEL_MEM_PLIMIT - UINT64 memUsed; + UINT64 memUsed;//内存使用情况 #endif #ifdef LOSCFG_KERNEL_IPC_PLIMIT - UINT32 mqCount; - UINT32 shmSize; + UINT32 mqCount;// + UINT32 shmSize;//共享内存大小 #endif #ifdef LOSCFG_KERNEL_SCHED_PLIMIT - UINT64 allRuntime; + UINT64 allRuntime;//调度运行时情况 #endif } PLimitsData; diff --git a/zzz/git/push.sh b/zzz/git/push.sh index 862e71b3..0952e485 100644 --- a/zzz/git/push.sh +++ b/zzz/git/push.sh @@ -1,5 +1,5 @@ git add -A -git commit -m ' 增加支持网络容器和容器限额功能 +git commit -m ' 进程模块注释完善 鸿蒙研究站 | http://weharmonyos.com (国内) | https://weharmony.github.io (国外) 论坛 | http://bbs.weharmonyos.com -- GitLab