提交 a732ac5f 编写于 作者: X xlei1030

修复cpu核绑实现

Signed-off-by: Nxlei1030 <xionglei6@huawei.com>
上级 93bec381
...@@ -19,6 +19,6 @@ extern "C" { ...@@ -19,6 +19,6 @@ extern "C" {
#endif #endif
void RegisterFdHoldWatcher(int sock); void RegisterFdHoldWatcher(int sock);
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { }
#endif #endif
#endif // BASE_STARTUP_INITLITE_FD_HOLDER_SERVICE_H #endif // BASE_STARTUP_INITLITE_FD_HOLDER_SERVICE_H
...@@ -17,6 +17,8 @@ ...@@ -17,6 +17,8 @@
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include <sys/types.h> #include <sys/types.h>
#include <sched.h>
#include <stdio.h>
#include "cJSON.h" #include "cJSON.h"
#include "init_cmds.h" #include "init_cmds.h"
...@@ -89,11 +91,6 @@ typedef enum { ...@@ -89,11 +91,6 @@ typedef enum {
END_RECV_READY, END_RECV_READY,
} ServiceEndMode; } ServiceEndMode;
typedef struct {
int *cpus;
int cpuNum;
} CpuArgs;
typedef struct { typedef struct {
uid_t uID; uid_t uID;
gid_t *gIDArray; gid_t *gIDArray;
...@@ -148,7 +145,7 @@ typedef struct Service_ { ...@@ -148,7 +145,7 @@ typedef struct Service_ {
size_t fdCount; size_t fdCount;
TimerHandle timer; TimerHandle timer;
ServiceJobs serviceJobs; ServiceJobs serviceJobs;
CpuArgs cpuInfo; cpu_set_t cpuSet;
} Service; } Service;
int ServiceStart(Service *service); int ServiceStart(Service *service);
......
...@@ -18,8 +18,6 @@ ...@@ -18,8 +18,6 @@
#include <signal.h> #include <signal.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <sched.h>
#include <stdio.h>
#ifdef __MUSL__ #ifdef __MUSL__
#include <stropts.h> #include <stropts.h>
#endif #endif
...@@ -238,32 +236,17 @@ static void PublishHoldFds(Service *service) ...@@ -238,32 +236,17 @@ static void PublishHoldFds(Service *service)
static int BindCpuCore(Service *service) static int BindCpuCore(Service *service)
{ {
if (service == NULL || service->cpuInfo.cpuNum <= 0) { if (service == NULL) {
return SERVICE_SUCCESS; return SERVICE_SUCCESS;
} }
long cpuNum = sysconf(_SC_NPROCESSORS_CONF); #ifndef __LITEOS__
INIT_ERROR_CHECK(service->cpuInfo.cpuNum <= cpuNum, return SERVICE_FAILURE,
"%s cpus cores exceeds total number of device cores", service->name);
int index = 0;
cpu_set_t setMask;
CPU_ZERO(&setMask);
int pid = getpid(); int pid = getpid();
for (int i = 0; i < service->cpuInfo.cpuNum; i++) { if (sched_setaffinity(pid, sizeof(service->cpuSet), &service->cpuSet) != 0) {
index = (int)service->cpuInfo.cpus[i]; INIT_LOGE("%s set affinity between process(pid=%d) with CPU's core failed", service->name, pid);
if ((int)cpuNum <= index) { return SERVICE_FAILURE;
INIT_LOGW("%s core number %d of CPU cores does not exist", service->name, index);
continue;
}
if (CPU_ISSET(index, &setMask)) {
continue;
}
CPU_SET(index, &setMask);
}
if (sched_setaffinity(pid, sizeof(setMask), &setMask) != 0) {
INIT_LOGI("%s set affinity between process(pid=%d) with CPU's core failed", service->name, pid);
} else {
INIT_LOGE("%s set affinity between process(pid=%d) with CPU's core successfully", service->name, pid);
} }
INIT_LOGI("%s set affinity between process(pid=%d) with CPU's core successfully", service->name, pid);
#endif
return SERVICE_SUCCESS; return SERVICE_SUCCESS;
} }
......
...@@ -175,6 +175,7 @@ Service *AddService(const char *name) ...@@ -175,6 +175,7 @@ Service *AddService(const char *name)
node->data.service = service; node->data.service = service;
service->name = node->name; service->name = node->name;
service->status = SERVICE_IDLE; service->status = SERVICE_IDLE;
CPU_ZERO(&service->cpuSet);
g_serviceSpace.serviceCount++; g_serviceSpace.serviceCount++;
INIT_LOGV("AddService %s", node->name); INIT_LOGV("AddService %s", node->name);
return service; return service;
...@@ -203,11 +204,6 @@ void ReleaseService(Service *service) ...@@ -203,11 +204,6 @@ void ReleaseService(Service *service)
FreeServiceArg(&service->writePidArgs); FreeServiceArg(&service->writePidArgs);
FreeServiceArg(&service->capsArgs); FreeServiceArg(&service->capsArgs);
if (service->cpuInfo.cpus != NULL) {
free(service->cpuInfo.cpus);
service->cpuInfo.cpus = NULL;
}
service->cpuInfo.cpuNum = 0;
if (service->servPerm.caps != NULL) { if (service->servPerm.caps != NULL) {
free(service->servPerm.caps); free(service->servPerm.caps);
service->servPerm.caps = NULL; service->servPerm.caps = NULL;
...@@ -767,12 +763,7 @@ int GetCritical(const cJSON *curArrItem, Service *curServ, const char *attrName ...@@ -767,12 +763,7 @@ int GetCritical(const cJSON *curArrItem, Service *curServ, const char *attrName
return SERVICE_SUCCESS; return SERVICE_SUCCESS;
} }
static int Comparefunc(const void *before, const void *after) static int GetCpuArgs(const cJSON *argJson, const char *name, Service *service)
{
return (*(int*)before - *(int*)after);
}
static int GetCpuArgs(const cJSON *argJson, const char *name, CpuArgs *args)
{ {
INIT_ERROR_CHECK(argJson != NULL, return SERVICE_FAILURE, "Invalid argJson"); INIT_ERROR_CHECK(argJson != NULL, return SERVICE_FAILURE, "Invalid argJson");
cJSON *obj = cJSON_GetObjectItem(argJson, name); cJSON *obj = cJSON_GetObjectItem(argJson, name);
...@@ -781,31 +772,20 @@ static int GetCpuArgs(const cJSON *argJson, const char *name, CpuArgs *args) ...@@ -781,31 +772,20 @@ static int GetCpuArgs(const cJSON *argJson, const char *name, CpuArgs *args)
int ret = cJSON_IsArray(obj); int ret = cJSON_IsArray(obj);
INIT_ERROR_CHECK(ret, return SERVICE_FAILURE, "Invalid type"); INIT_ERROR_CHECK(ret, return SERVICE_FAILURE, "Invalid type");
int count = cJSON_GetArraySize(obj); int count = cJSON_GetArraySize(obj);
int tmpArray[count]; int cpus = -1;
int cpuNumMax = sysconf(_SC_NPROCESSORS_CONF);
for (int i = 0; i < count; ++i) { for (int i = 0; i < count; ++i) {
cJSON *item = cJSON_GetArrayItem(obj, i); cJSON *item = cJSON_GetArrayItem(obj, i);
INIT_ERROR_CHECK(item != NULL, return SERVICE_FAILURE, "prase invalid"); INIT_ERROR_CHECK(item != NULL, return SERVICE_FAILURE, "prase invalid");
tmpArray[i] = (int)cJSON_GetNumberValue(item); cpus = (int)cJSON_GetNumberValue(item);
} if (cpuNumMax <= cpus) {
qsort(tmpArray, count, sizeof(int), Comparefunc); INIT_LOGW("%s core number %d of CPU cores does not exist", service->name, cpus);
int cpuCount = 0;
for (int j = 0; j < count; j++) {
if (j == 0 && tmpArray[0] == 0) {
tmpArray[cpuCount++] = 0;
continue; continue;
} }
if (tmpArray[j] != tmpArray[j-1]) { if (CPU_ISSET(cpus, &service->cpuSet)) {
tmpArray[cpuCount++] = tmpArray[j]; continue;
}
}
args->cpus=(int*)malloc(cpuCount * sizeof(int));
INIT_ERROR_CHECK(args->cpus != NULL, return SERVICE_FAILURE, "Failed to malloc for argv");
for (int i = 0; i < cpuCount; ++i) {
args->cpus[i] = -1;
} }
args->cpuNum = cpuCount; CPU_SET(cpus, &service->cpuSet);
for (int i = 0; i < count; ++i) {
args->cpus[i] = tmpArray[i];
} }
return SERVICE_SUCCESS; return SERVICE_SUCCESS;
} }
...@@ -843,7 +823,7 @@ int ParseOneService(const cJSON *curItem, Service *service) ...@@ -843,7 +823,7 @@ int ParseOneService(const cJSON *curItem, Service *service)
(void)GetServiceArgs(curItem, "writepid", MAX_WRITEPID_FILES, &service->writePidArgs); (void)GetServiceArgs(curItem, "writepid", MAX_WRITEPID_FILES, &service->writePidArgs);
(void)GetServiceArgs(curItem, D_CAPS_STR_IN_CFG, MAX_WRITEPID_FILES, &service->capsArgs); (void)GetServiceArgs(curItem, D_CAPS_STR_IN_CFG, MAX_WRITEPID_FILES, &service->capsArgs);
(void)GetStringItem(curItem, APL_STR_IN_CFG, service->apl, MAX_APL_NAME); (void)GetStringItem(curItem, APL_STR_IN_CFG, service->apl, MAX_APL_NAME);
(void)GetCpuArgs(curItem, CPU_CORE_STR_IN_CFG, &service->cpuInfo); (void)GetCpuArgs(curItem, CPU_CORE_STR_IN_CFG, service);
ret = GetServiceCaps(curItem, service); ret = GetServiceCaps(curItem, service);
INIT_ERROR_CHECK(ret == 0, return SERVICE_FAILURE, "Failed to get caps for service %s", service->name); INIT_ERROR_CHECK(ret == 0, return SERVICE_FAILURE, "Failed to get caps for service %s", service->name);
ret = GetDynamicService(curItem, service); ret = GetDynamicService(curItem, service);
......
...@@ -17,11 +17,6 @@ ...@@ -17,11 +17,6 @@
static const pid_t INIT_PROCESS_PID = 1; static const pid_t INIT_PROCESS_PID = 1;
int __attribute__((weak)) AtlibInit(void)
{
return 0;
}
int main(int argc, char * const argv[]) int main(int argc, char * const argv[])
{ {
int isSecondStage = 0; int isSecondStage = 0;
...@@ -40,7 +35,6 @@ int main(int argc, char * const argv[]) ...@@ -40,7 +35,6 @@ int main(int argc, char * const argv[])
LogInit(); LogInit();
} }
LogInit(); LogInit();
(void)AtlibInit();
SystemInit(); SystemInit();
SystemExecuteRcs(); SystemExecuteRcs();
SystemConfig(); SystemConfig();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册