提交 cf8446c9 编写于 作者: Z zhushengle

feat: 进程rlimit修改为动态分配,减少静态内存占用

Close #I4EZY5
Signed-off-by: Nzhushengle <zhushengle@huawei.com>
Change-Id: I47ed0ff7a52f72e38875c3308b20e183cc5c4563
上级 acd631c7
...@@ -40,6 +40,7 @@ ...@@ -40,6 +40,7 @@
#include "los_process_pri.h" #include "los_process_pri.h"
#include "los_hw.h" #include "los_hw.h"
static struct rlimit g_defaultLimit = { 0 };
/* /*
* Supply some suitable values for constants that may not be present * Supply some suitable values for constants that may not be present
* in all configurations. * in all configurations.
...@@ -154,7 +155,9 @@ pid_t getpid(void) ...@@ -154,7 +155,9 @@ pid_t getpid(void)
int getrlimit(int resource, struct rlimit *rlim) int getrlimit(int resource, struct rlimit *rlim)
{ {
unsigned int intSave;
LosProcessCB *pcb = OsCurrProcessGet(); LosProcessCB *pcb = OsCurrProcessGet();
struct rlimit *resourceLimit = pcb->resourceLimit;
switch (resource) { switch (resource) {
case RLIMIT_NOFILE: case RLIMIT_NOFILE:
...@@ -163,8 +166,15 @@ int getrlimit(int resource, struct rlimit *rlim) ...@@ -163,8 +166,15 @@ int getrlimit(int resource, struct rlimit *rlim)
default: default:
return -EINVAL; return -EINVAL;
} }
rlim->rlim_cur = pcb->pl_rlimit[resource].rlim_cur;
rlim->rlim_max = pcb->pl_rlimit[resource].rlim_max; if (resourceLimit == NULL) {
resourceLimit = &g_defaultLimit;
}
SCHEDULER_LOCK(intSave);
rlim->rlim_cur = resourceLimit[resource].rlim_cur;
rlim->rlim_max = resourceLimit[resource].rlim_max;
SCHEDULER_UNLOCK(intSave);
return 0; return 0;
} }
...@@ -175,6 +185,8 @@ int getrlimit(int resource, struct rlimit *rlim) ...@@ -175,6 +185,8 @@ int getrlimit(int resource, struct rlimit *rlim)
#endif #endif
int setrlimit(int resource, const struct rlimit *rlim) int setrlimit(int resource, const struct rlimit *rlim)
{ {
unsigned int intSave;
struct rlimit *resourceLimit = NULL;
LosProcessCB *pcb = OsCurrProcessGet(); LosProcessCB *pcb = OsCurrProcessGet();
if (rlim->rlim_cur > rlim->rlim_max) { if (rlim->rlim_cur > rlim->rlim_max) {
...@@ -194,8 +206,23 @@ int setrlimit(int resource, const struct rlimit *rlim) ...@@ -194,8 +206,23 @@ int setrlimit(int resource, const struct rlimit *rlim)
default: default:
return -EINVAL; return -EINVAL;
} }
pcb->pl_rlimit[resource].rlim_cur = rlim->rlim_cur;
pcb->pl_rlimit[resource].rlim_max = rlim->rlim_max;
if (pcb->resourceLimit == NULL) {
resourceLimit = LOS_MemAlloc((VOID *)m_aucSysMem0, RLIM_NLIMITS * sizeof(struct rlimit));
if (resourceLimit == NULL) {
return -EINVAL;
}
}
SCHEDULER_LOCK(intSave);
if (pcb->resourceLimit == NULL) {
pcb->resourceLimit = resourceLimit;
resourceLimit = NULL;
}
pcb->resourceLimit[resource].rlim_cur = rlim->rlim_cur;
pcb->resourceLimit[resource].rlim_max = rlim->rlim_max;
SCHEDULER_UNLOCK(intSave);
(VOID)LOS_MemFree((VOID *)m_aucSysMem0, resourceLimit);
return 0; return 0;
} }
\ No newline at end of file
...@@ -378,6 +378,11 @@ LITE_OS_SEC_TEXT VOID OsProcessResourcesToFree(LosProcessCB *processCB) ...@@ -378,6 +378,11 @@ LITE_OS_SEC_TEXT VOID OsProcessResourcesToFree(LosProcessCB *processCB)
(VOID)memset_s(&(processCB->ipcInfo), sizeof(ProcIpcInfo), 0, sizeof(ProcIpcInfo)); (VOID)memset_s(&(processCB->ipcInfo), sizeof(ProcIpcInfo), 0, sizeof(ProcIpcInfo));
} }
#endif #endif
if (processCB->resourceLimit != NULL) {
(VOID)LOS_MemFree((VOID *)m_aucSysMem0, processCB->resourceLimit);
processCB->resourceLimit = NULL;
}
} }
LITE_OS_SEC_TEXT STATIC VOID OsRecycleZombiesProcess(LosProcessCB *childCB, ProcessGroup **group) LITE_OS_SEC_TEXT STATIC VOID OsRecycleZombiesProcess(LosProcessCB *childCB, ProcessGroup **group)
......
...@@ -127,7 +127,7 @@ typedef struct ProcessCB { ...@@ -127,7 +127,7 @@ typedef struct ProcessCB {
#ifdef LOSCFG_KERNEL_CPUP #ifdef LOSCFG_KERNEL_CPUP
OsCpupBase processCpup; /**< Process cpu usage */ OsCpupBase processCpup; /**< Process cpu usage */
#endif #endif
struct rlimit pl_rlimit[RLIM_NLIMITS]; struct rlimit *resourceLimit;
} LosProcessCB; } LosProcessCB;
#define CLONE_VM 0x00000100 #define CLONE_VM 0x00000100
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册