From 4b63c59e3584f2fe9f227f2976eabc42a134e7c3 Mon Sep 17 00:00:00 2001 From: XueSinian Date: Mon, 14 Aug 2023 14:33:01 +0800 Subject: [PATCH] =?UTF-8?q?=E6=80=A7=E8=83=BD=E4=BC=98=E5=8C=96=EF=BC=9A?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=96=87=E4=BB=B6=E8=AF=BB=E5=8F=96=E5=92=8C?= =?UTF-8?q?=E5=86=99=E5=85=A5=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/inc/pwrerr.h | 2 +- pwrapic/test/demo_main.c | 15 ++- pwrapis/src/cpuservice.c | 207 +++++++++++++++++---------------------- pwrapis/src/sysservice.c | 24 ++--- pwrapis/src/utils.c | 24 +++-- 5 files changed, 132 insertions(+), 140 deletions(-) diff --git a/common/inc/pwrerr.h b/common/inc/pwrerr.h index 8334cdf..7a04724 100644 --- a/common/inc/pwrerr.h +++ b/common/inc/pwrerr.h @@ -49,7 +49,7 @@ enum PWR_RtnCode { PWR_ERR_FILE_ACCESS_FAILED = 500, PWR_ERR_FILE_FPRINT_FAILED, PWR_ERR_FILE_FFLUSH_FAILED, - PWR_ERR_FILE_FOPEN_FAILED, + PWR_ERR_FILE_OPEN_FAILED, PWR_ERR_FILE_SPRINTF_FIILED, }; #endif \ No newline at end of file diff --git a/pwrapic/test/demo_main.c b/pwrapic/test/demo_main.c index 9ac396b..483e241 100644 --- a/pwrapic/test/demo_main.c +++ b/pwrapic/test/demo_main.c @@ -247,7 +247,7 @@ static void TEST_SYS_GetRtPowerInfo(void) bzero(powerInfo, sizeof(PWR_SYS_PowerInfo)); ret = PWR_SYS_GetRtPowerInfo(powerInfo); PrintResult("PWR_SYS_GetRtPower", ret); - printf(" sys power:%d\n", powerInfo->sysPower); + printf(" sys rt power:%d\n", powerInfo->sysPower); free(powerInfo); } @@ -356,12 +356,23 @@ static void TEST_PWR_CPU_SetFreqGovernor(void) { int ret = -1; char governor[PWR_MAX_ELEMENT_NAME_LEN] = {0}; - strncpy(governor, "userspace", PWR_MAX_ELEMENT_NAME_LEN); + char targetGov[PWR_MAX_ELEMENT_NAME_LEN] = "userspace"; + if (PWR_CPU_GetFreqGovernor(governor, PWR_MAX_ELEMENT_NAME_LEN) != 0) { + return; + } + if (strcmp(governor, targetGov) == 0) { + strcpy(targetGov, "performance"); + } + + strncpy(governor, targetGov, PWR_MAX_ELEMENT_NAME_LEN); ret = PWR_CPU_SetFreqGovernor(governor); PrintResult("PWR_CPU_SetFreqGovernor", ret); bzero(governor, PWR_MAX_ELEMENT_NAME_LEN); PWR_CPU_GetFreqGovernor(governor, PWR_MAX_ELEMENT_NAME_LEN); printf(" current governor: %s\n", governor); + if (strcmp(governor, "userspace") != 0) { + PWR_CPU_SetFreqGovernor("userspace"); + } } static void TEST_PWR_CPU_GetFreqRange(void) diff --git a/pwrapis/src/cpuservice.c b/pwrapis/src/cpuservice.c index 8246a65..c4bd8a5 100644 --- a/pwrapis/src/cpuservice.c +++ b/pwrapis/src/cpuservice.c @@ -207,7 +207,7 @@ static void CalculateUsage(PWR_CPU_Usage *rstData, unsigned long paras[2][PWR_CP int CPUUsageRead(PWR_CPU_Usage *rstData, int coreNum) { const char usage[] = "cat /proc/stat"; - unsigned long paras[2][PWR_CPU_USAGE_COLUMN]; + unsigned long paras[2][PWR_CPU_USAGE_COLUMN] = {0}; FILE *fp1 = popen(usage, "r"); if (fp1 == NULL) { return PWR_ERR_COMMON; @@ -296,21 +296,33 @@ int PerfDataRead(PWR_CPU_PerfData *perfData) int GetPolicys(char (*policys)[PWR_MAX_ELEMENT_NAME_LEN], int *poNum) { - FILE *fp = NULL; - char policyInfo[] = "ls /sys/devices/system/cpu/cpufreq | grep policy"; - fp = popen(policyInfo, "r"); - if (fp == NULL) { - return 1; + const char *targetItem = "policy"; + const size_t len = strlen(targetItem); + DIR *dir = NULL; + struct dirent *ent; + char policyInfo[] = "/sys/devices/system/cpu/cpufreq"; + dir = opendir(policyInfo); + if (dir == NULL) { + Logger(ERROR, MD_NM_SVR_CPU, "Unable to open direct: %s", policyInfo); + return PWR_ERR_COMMON; } + char buf[PWR_MAX_NAME_LEN]; - bzero(buf, sizeof(buf)); + bzero(buf, PWR_MAX_NAME_LEN); *poNum = 0; - while (fgets(buf, sizeof(buf) - 1, fp) != NULL) { + while ((ent = readdir(dir)) != NULL) { + if (strlen(ent->d_name) <= len || strncmp(ent->d_name, targetItem, len) != 0) { + continue; + } + + bzero(buf, PWR_MAX_NAME_LEN); + strncpy(buf, ent->d_name, PWR_MAX_NAME_LEN); DeleteChar(buf, '\n'); StrCopy(policys[*poNum], buf, PWR_MAX_ELEMENT_NAME_LEN); (*poNum)++; } - pclose(fp); + + closedir(dir); return 0; } @@ -380,18 +392,16 @@ static int InputTargetPolicys(PWR_CPU_CurFreq *target, char (*policys)[PWR_MAX_E static int AllGovernorsRead(char (*govList)[PWR_MAX_ELEMENT_NAME_LEN], int *govNum) { - char buf[PWR_MAX_ELEMENT_NAME_LEN * PWR_MAX_GOV_NUM] = {0}; + int len = PWR_MAX_ELEMENT_NAME_LEN * PWR_MAX_GOV_NUM; + char buf[len]; const char govInfo[] = "/sys/devices/system/cpu/cpufreq/policy0/scaling_available_governors"; - int fd = open(govInfo, O_RDONLY); - if (fd == -1) { - return 1; - } - if (read(fd, buf, PWR_MAX_ELEMENT_NAME_LEN * PWR_MAX_GOV_NUM - 1) <= 0) { - close(fd); - return 1; + + bzero(buf, len); + int ret = ReadFile(govInfo, buf, len); + if (ret != 0) { + return ret; } - close(fd); - DeleteChar(buf, '\n'); + char *temp = strtok(buf, " "); *govNum = 0; while (temp != NULL) { @@ -409,54 +419,42 @@ static int CheckAvailableGovernor(char *gov, char *policys) Logger(ERROR, MD_NM_SVR_CPU, "Malloc failed."); return 1; } - const char s1[] = "cat /sys/devices/system/cpu/cpufreq/"; + const char s1[] = "/sys/devices/system/cpu/cpufreq/"; const char s2[] = "/scaling_available_governors"; StrCopy(checkGovInfo, s1, strlen(gov) + PWR_MAX_NAME_LEN); strncat(checkGovInfo, policys, strlen(gov)); strncat(checkGovInfo, s2, strlen(s2)); char buf[PWR_MAX_STRING_LEN]; - FILE *fp = popen(checkGovInfo, "r"); - if (fp == NULL) { + int ret = ReadFile(checkGovInfo, buf, PWR_MAX_STRING_LEN); + if (ret != PWR_SUCCESS) { free(checkGovInfo); - return 1; + return ret; } - if (fgets(buf, sizeof(buf) - 1, fp) == NULL) { - free(checkGovInfo); - pclose(fp); - return 1; - } - DeleteChar(buf, '\n'); + char *temp = strtok(buf, " "); while (temp != NULL) { DeleteChar(temp, ' '); if (strcmp(temp, gov) == 0) { free(checkGovInfo); - pclose(fp); return 0; } temp = strtok(NULL, " "); } - pclose(fp); + free(checkGovInfo); return 1; } int CurrentGovernorRead(char *rstData) { - FILE *fp = NULL; - char govInfo[] = "cat /sys/devices/system/cpu/cpufreq/policy0/scaling_governor"; - fp = popen(govInfo, "r"); - if (fp == NULL) { - return 1; - } + char govInfo[] = "/sys/devices/system/cpu/cpufreq/policy0/scaling_governor"; char buf[PWR_MAX_STRING_LEN]; - if (fgets(buf, sizeof(buf) - 1, fp) == NULL) { - pclose(fp); - return PWR_ERR_COMMON; + int ret = ReadFile(govInfo, buf, PWR_MAX_STRING_LEN); + if (ret != PWR_SUCCESS) { + return ret; } - DeleteChar(buf, '\n'); + DeleteChar(buf, ' '); StrCopy(rstData, buf, PWR_MAX_ELEMENT_NAME_LEN); - pclose(fp); return PWR_SUCCESS; } @@ -473,23 +471,21 @@ int GovernorSet(char *gov, char (*policys)[PWR_MAX_ELEMENT_NAME_LEN], int *poNum Logger(ERROR, MD_NM_SVR_CPU, "Malloc failed."); return 1; } - static const char s1[] = "echo "; - static const char s2[] = "> /sys/devices/system/cpu/cpufreq/"; - static const char s3[] = "/scaling_governor"; + bzero(govInfo, sizeof(govInfo)); + static const char s1[] = "/sys/devices/system/cpu/cpufreq/"; + static const char s2[] = "/scaling_governor"; for (i = 0; i < (*poNum); i++) { StrCopy(govInfo, s1, strlen(gov) + PWR_MAX_NAME_LEN); - strncat(govInfo, gov, strlen(gov)); - strncat(govInfo, s2, strlen(s2)); strncat(govInfo, policys[i], strlen(policys[i])); - strncat(govInfo, s3, strlen(s3)); - FILE *fp = popen(govInfo, "r"); - if (fp == NULL) { + strncat(govInfo, s2, strlen(s2)); + int ret = WriteFile(govInfo, gov, strlen(gov)); + if (ret != 0) { + Logger(ERROR, MD_NM_SVR_CPU, "Change gov(%s) failed.", gov); free(govInfo); - return PWR_ERR_COMMON; + return ret; } - pclose(fp); - // todo: write back precious governor } + free(govInfo); return PWR_SUCCESS; } @@ -502,7 +498,8 @@ static int FreqRead(PWR_CPU_CurFreq *rstData, char (*policys)[PWR_MAX_ELEMENT_NA { int m = GetArch(); char freqInfo[PWR_MAX_NAME_LEN] = {0}; - static const char s1[] = "cat /sys/devices/system/cpu/cpufreq/"; + char buf[PWR_MAX_STRING_LEN] = {0}; + static const char s1[] = "/sys/devices/system/cpu/cpufreq/"; static const char s2Arm[] = "/cpuinfo_cur_freq"; static const char s2X86[] = "/scaling_cur_freq"; char s2[PWR_MAX_ELEMENT_NAME_LEN]; @@ -512,24 +509,18 @@ static int FreqRead(PWR_CPU_CurFreq *rstData, char (*policys)[PWR_MAX_ELEMENT_NA } else if (m == PWR_X86_64) { StrCopy(s2, s2X86, PWR_MAX_ELEMENT_NAME_LEN); } - char buf[PWR_MAX_STRING_LEN]; - int i; - for (i = 0; i < (*poNum); i++) { + + for (int i = 0; i < (*poNum); i++) { StrCopy(freqInfo, s1, PWR_MAX_NAME_LEN); strncat(freqInfo, policys[i], strlen(policys[i])); strncat(freqInfo, s2, strlen(s2)); - FILE *fp = popen(freqInfo, "r"); - if (fp == NULL) { - return 1; - } - if (fgets(buf, sizeof(buf) - 1, fp) == NULL) { - pclose(fp); - return PWR_ERR_COMMON; + int ret = ReadFile(freqInfo, buf, PWR_MAX_STRING_LEN); + if (ret != PWR_SUCCESS) { + return ret; } - DeleteChar(buf, '\n'); + DeleteChar(buf, ' '); DeleteSubstr(policys[i], "policy"); - pclose(fp); rstData[i].policyId = atoi(policys[i]); rstData[i].curFreq = (double)strtoul(buf, NULL, PWR_DECIMAL) / PWR_CONVERSION; } @@ -540,29 +531,26 @@ static int FreqRead(PWR_CPU_CurFreq *rstData, char (*policys)[PWR_MAX_ELEMENT_NA static int FreqSet(PWR_CPU_CurFreq *target, int num) { char setFreqInfo[PWR_MAX_NAME_LEN] = {0}; - static const char s1[] = "echo "; - static const char s2[] = " > /sys/devices/system/cpu/cpufreq/policy"; - static const char s3[] = "/scaling_setspeed"; - int i, freq; - char buffer[PWR_MAX_ELEMENT_NAME_LEN] = {0}; + static const char s1[] = "/sys/devices/system/cpu/cpufreq/policy"; + static const char s2[] = "/scaling_setspeed"; + int i, freq, ret; + char bufFreq[PWR_MAX_ELEMENT_NAME_LEN] = {0}; + char bufPolicyId[PWR_MAX_ELEMENT_NAME_LEN] = {0}; for (i = 0; i < num; i++) { StrCopy(setFreqInfo, s1, PWR_MAX_NAME_LEN); freq = (int)target[i].curFreq * THOUSAND; - if (snprintf(buffer, PWR_MAX_ELEMENT_NAME_LEN - 1, "%d", freq) < 0) { - return PWR_ERR_COMMON; + if (snprintf(bufFreq, PWR_MAX_ELEMENT_NAME_LEN - 1, "%d", freq) < 0) { + return PWR_ERR_FILE_SPRINTF_FIILED; } - strncat(setFreqInfo, buffer, strlen(buffer)); - strncat(setFreqInfo, s2, strlen(s2)); - if (snprintf(buffer, PWR_MAX_ELEMENT_NAME_LEN - 1, "%d", target[i].policyId) < 0) { - return PWR_ERR_COMMON; + if (snprintf(bufPolicyId, PWR_MAX_ELEMENT_NAME_LEN - 1, "%d", target[i].policyId) < 0) { + return PWR_ERR_FILE_SPRINTF_FIILED; } - strncat(setFreqInfo, buffer, strlen(buffer)); - strncat(setFreqInfo, s3, strlen(s3)); - FILE *fp = popen(setFreqInfo, "r"); - if (fp == NULL) { - return PWR_ERR_COMMON; + strncat(setFreqInfo, bufPolicyId, strlen(bufPolicyId)); + strncat(setFreqInfo, s2, strlen(s2)); + ret = WriteFile(setFreqInfo, bufFreq, strlen(bufFreq)); + if (ret != 0) { + return ret; } - pclose(fp); } return PWR_SUCCESS; } @@ -570,18 +558,7 @@ static int FreqSet(PWR_CPU_CurFreq *target, int num) static int FreqDriverRead(char *buf, int bufLen) { const char driverInfo[] = "/sys/devices/system/cpu/cpufreq/policy0/scaling_driver"; - int fd = open(driverInfo, O_RDONLY); - if (fd == -1) { - return 1; - } - if (read(fd, buf, bufLen - 1) <= 0) { - close(fd); - return 1; - } - close(fd); - DeleteChar(buf, '\n'); - buf[strlen(buf)] = '\0'; - return 0; + return ReadFile(driverInfo, buf, bufLen); } static int FreqDomainRead(char *buf, char (*policys)[PWR_MAX_ELEMENT_NAME_LEN], int domainNum, int step) @@ -591,22 +568,16 @@ static int FreqDomainRead(char *buf, char (*policys)[PWR_MAX_ELEMENT_NAME_LEN], char temp[PWR_MAX_ELEMENT_NAME_LEN] = {0}; char s1[] = "/sys/devices/system/cpu/cpufreq/"; char s2[] = "/affected_cpus"; - int i; - for (i = 0; i < domainNum; i++) { + for (int i = 0; i < domainNum; i++) { StrCopy(domainInfo, s1, PWR_MAX_NAME_LEN); strncat(domainInfo, policys[i], strlen(policys[i])); strncat(domainInfo, s2, strlen(s2)); - int fd = open(domainInfo, O_RDONLY); - if (fd == -1) { - close(fd); - return 1; - } - if (read(fd, domainbuf, PWR_MAX_CPU_LIST_LEN - 1) <= 0) { - close(fd); - return 1; + bzero(domainbuf, PWR_MAX_CPU_LIST_LEN); + int ret = ReadFile(domainInfo, domainbuf, PWR_MAX_CPU_LIST_LEN); + if (ret != PWR_SUCCESS) { + return ret; } - close(fd); - DeleteChar(domainbuf, '\n'); + // convert policys to int StrCopy(temp, policys[i], PWR_MAX_ELEMENT_NAME_LEN); DeleteSubstr(temp, "policy"); @@ -643,14 +614,17 @@ static int CheckFreqInRange(PWR_CPU_CurFreq *target, int num, PWR_CPU_FreqRange static int ScalingFreqRangeRead(PWR_CPU_FreqRange *rstData) { char buf[PWR_MAX_ELEMENT_NAME_LEN] = {0}; + int ret = -1; const char minFreqInfo[] = "/sys/devices/system/cpu/cpufreq/policy0/scaling_min_freq"; const char maxFreqInfo[] = "/sys/devices/system/cpu/cpufreq/policy0/scaling_max_freq"; - if (ReadFile(minFreqInfo, buf, PWR_MAX_ELEMENT_NAME_LEN) != 0) { - return 1; + ret = ReadFile(minFreqInfo, buf, PWR_MAX_ELEMENT_NAME_LEN); + if (ret != PWR_SUCCESS) { + return ret; } rstData->minFreq = atoi(buf) / THOUSAND; - if (ReadFile(maxFreqInfo, buf, PWR_MAX_ELEMENT_NAME_LEN) != 0) { - return 1; + ret = ReadFile(maxFreqInfo, buf, PWR_MAX_ELEMENT_NAME_LEN); + if (ret != PWR_SUCCESS) { + return ret; } rstData->maxFreq = atoi(buf) / THOUSAND; return 0; @@ -659,14 +633,17 @@ static int ScalingFreqRangeRead(PWR_CPU_FreqRange *rstData) static int CpuFreqRangeRead(PWR_CPU_FreqRange *cpuFreqRange) { char buf[PWR_MAX_ELEMENT_NAME_LEN] = {0}; + int ret = -1; const char minFreqInfo[] = "/sys/devices/system/cpu/cpufreq/policy0/cpuinfo_min_freq"; const char maxFreqInfo[] = "/sys/devices/system/cpu/cpufreq/policy0/cpuinfo_max_freq"; - if (ReadFile(minFreqInfo, buf, PWR_MAX_ELEMENT_NAME_LEN) != 0) { - return 1; + ret = ReadFile(minFreqInfo, buf, PWR_MAX_ELEMENT_NAME_LEN); + if (ret != PWR_SUCCESS) { + return ret; } cpuFreqRange->minFreq = atoi(buf) / THOUSAND; - if (ReadFile(maxFreqInfo, buf, PWR_MAX_ELEMENT_NAME_LEN) != 0) { - return 1; + ret = ReadFile(maxFreqInfo, buf, PWR_MAX_ELEMENT_NAME_LEN); + if (ret != PWR_SUCCESS) { + return ret; } cpuFreqRange->maxFreq = atoi(buf) / THOUSAND; return 0; diff --git a/pwrapis/src/sysservice.c b/pwrapis/src/sysservice.c index 9d28b2b..b3d24c1 100644 --- a/pwrapis/src/sysservice.c +++ b/pwrapis/src/sysservice.c @@ -24,22 +24,14 @@ static int PowerSet(char *powerState) { - FILE *fp = NULL; - char *stateStr = malloc(strlen(powerState) + PWR_MAX_NAME_LEN); - if (stateStr == NULL) { - Logger(ERROR, MD_NM_SVR_SYS, "Malloc failed."); - return 1; - } - static const char s1[] = "sleep 10 && echo "; - static const char s2[] = "> /sys/power/state &"; - StrCopy(stateStr, s1, strlen(powerState) + PWR_MAX_NAME_LEN); - strncat(stateStr, powerState, strlen(powerState)); - strncat(stateStr, s2, strlen(s2)); - fp = popen(stateStr, "r"); - if (fp == NULL) { - return 1; + int bufferTime = 10; //The value may need to be determined again + static const char fileName[] = "/sys/power/state"; + + sleep(bufferTime); + int ret = WriteFile(fileName, powerState, strlen(powerState)); + if (ret != 0) { + return ret; } - pclose(fp); return PWR_SUCCESS; } @@ -118,4 +110,4 @@ void GetSysRtPowerInfo(PwrMsg *req) rstData->memPower = 0.0; int rspCode = SysRtPowerRead(rstData); SendRspToClient(req, rspCode, (char *)rstData, sizeof(PWR_SYS_PowerInfo)); -} +} \ No newline at end of file diff --git a/pwrapis/src/utils.c b/pwrapis/src/utils.c index 92e1845..18535f5 100644 --- a/pwrapis/src/utils.c +++ b/pwrapis/src/utils.c @@ -937,7 +937,13 @@ int InIntRange(int *range, int len, int a) int ReadFile(const char *strInfo, char *buf, int bufLen) { - int fd = open(strInfo, O_RDONLY); + char realPath[MAX_FULL_NAME] = {0}; + int ret = NormalizeAndVerifyFilepath(strInfo, realPath); + if (ret != PWR_SUCCESS) { + return ret; + } + + int fd = open(realPath, O_RDONLY); if (fd == -1) { return 1; } @@ -953,12 +959,18 @@ int ReadFile(const char *strInfo, char *buf, int bufLen) int WriteFile(const char *strInfo, char *buf, int bufLen) { - if (access(strInfo, F_OK | R_OK | W_OK) != 0) { + char realPath[MAX_FULL_NAME] = {0}; + int ret = NormalizeAndVerifyFilepath(strInfo, realPath); + if (ret != PWR_SUCCESS) { + return ret; + } + + if (access(realPath, F_OK | R_OK | W_OK) != 0) { return PWR_ERR_FILE_ACCESS_FAILED; } - FILE *fp = fopen(strInfo, "w+"); + FILE *fp = fopen(realPath, "w+"); if (fp == NULL) { - return PWR_ERR_FILE_FOPEN_FAILED; + return PWR_ERR_FILE_OPEN_FAILED; } if (fprintf(fp, "%s", buf) < 0) { fclose(fp); @@ -1030,10 +1042,10 @@ int GetSockoptFromOS(const pid_t pid, UnixCredOS *credOS) { char credCmd[PWR_MAX_NAME_LEN]; const char s[] = "ps -eo pid,uid,gid,user | grep "; - if (sprintf(credCmd, "%s%d", s, pid) < 0) return PWR_ERR_COMMON; + if (sprintf(credCmd, "%s%d", s, pid) < 0) return PWR_ERR_FILE_SPRINTF_FIILED; FILE *fp = popen(credCmd, "r"); if (fp == NULL) { - return PWR_ERR_NULL_POINTER; + return PWR_ERR_FILE_OPEN_FAILED; } char buf[PWR_MAX_NAME_LEN] = {0}; if (fgets(buf, sizeof(buf), fp) == NULL) { -- Gitee