feat: 进程rlimit修改为动态分配,减少静态内存占用
Close #I4EZY5 Signed-off-by: zhushengle <zhushengle@huawei.com> Change-Id: I47ed0ff7a52f72e38875c3308b20e183cc5c4563
This commit is contained in:
parent
acd631c731
commit
cf8446c941
|
@ -40,6 +40,7 @@
|
|||
#include "los_process_pri.h"
|
||||
#include "los_hw.h"
|
||||
|
||||
static struct rlimit g_defaultLimit = { 0 };
|
||||
/*
|
||||
* Supply some suitable values for constants that may not be present
|
||||
* in all configurations.
|
||||
|
@ -154,7 +155,9 @@ pid_t getpid(void)
|
|||
|
||||
int getrlimit(int resource, struct rlimit *rlim)
|
||||
{
|
||||
unsigned int intSave;
|
||||
LosProcessCB *pcb = OsCurrProcessGet();
|
||||
struct rlimit *resourceLimit = pcb->resourceLimit;
|
||||
|
||||
switch (resource) {
|
||||
case RLIMIT_NOFILE:
|
||||
|
@ -163,8 +166,15 @@ int getrlimit(int resource, struct rlimit *rlim)
|
|||
default:
|
||||
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;
|
||||
}
|
||||
|
@ -175,6 +185,8 @@ int getrlimit(int resource, struct rlimit *rlim)
|
|||
#endif
|
||||
int setrlimit(int resource, const struct rlimit *rlim)
|
||||
{
|
||||
unsigned int intSave;
|
||||
struct rlimit *resourceLimit = NULL;
|
||||
LosProcessCB *pcb = OsCurrProcessGet();
|
||||
|
||||
if (rlim->rlim_cur > rlim->rlim_max) {
|
||||
|
@ -194,8 +206,23 @@ int setrlimit(int resource, const struct rlimit *rlim)
|
|||
default:
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -378,6 +378,11 @@ LITE_OS_SEC_TEXT VOID OsProcessResourcesToFree(LosProcessCB *processCB)
|
|||
(VOID)memset_s(&(processCB->ipcInfo), sizeof(ProcIpcInfo), 0, sizeof(ProcIpcInfo));
|
||||
}
|
||||
#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)
|
||||
|
|
|
@ -127,7 +127,7 @@ typedef struct ProcessCB {
|
|||
#ifdef LOSCFG_KERNEL_CPUP
|
||||
OsCpupBase processCpup; /**< Process cpu usage */
|
||||
#endif
|
||||
struct rlimit pl_rlimit[RLIM_NLIMITS];
|
||||
struct rlimit *resourceLimit;
|
||||
} LosProcessCB;
|
||||
|
||||
#define CLONE_VM 0x00000100
|
||||
|
|
Loading…
Reference in New Issue