From 022761d5d7a0bedbf65a4ed75f202fea52ea39a7 Mon Sep 17 00:00:00 2001 From: queyanwen Date: Thu, 28 Jul 2022 11:15:47 +0800 Subject: [PATCH] Add powerAPI PWR_CPU_GetLlcMissPerIns --- common/inc/pwrmsg.h | 1 - common/src/pwrbuffer.c | 4 ++- common/src/pwrmsg.c | 1 + pwrapic/inc/powerapi.h | 1 + pwrapic/inc/pwrcpu.h | 1 + pwrapic/src/powerapi.c | 14 +++++++--- pwrapic/src/pwrcpu.c | 19 ++++++++++++++ pwrapic/src/sockclient.c | 16 ++++++++---- pwrapic/test/demo_main.c | 55 ++++++++++++++++++++++++++++------------ pwrapis/inc/common.h | 2 +- pwrapis/inc/config.h | 1 - pwrapis/inc/utils.h | 2 +- pwrapis/src/config.c | 3 ++- pwrapis/src/main_frame.c | 12 ++++----- pwrapis/src/server.c | 1 + 15 files changed, 96 insertions(+), 37 deletions(-) diff --git a/common/inc/pwrmsg.h b/common/inc/pwrmsg.h index 00c65ca..3b39179 100644 --- a/common/inc/pwrmsg.h +++ b/common/inc/pwrmsg.h @@ -16,7 +16,6 @@ #ifndef __POWERAPI_PROTOCOL_H__ #define __POWERAPI_PROTOCOL_H__ -#include "pwrerr.h" #include #include #include diff --git a/common/src/pwrbuffer.c b/common/src/pwrbuffer.c index 493a2dc..c783f0d 100644 --- a/common/src/pwrbuffer.c +++ b/common/src/pwrbuffer.c @@ -16,8 +16,10 @@ #include #include #include +#include "pwrerr.h" #define WAITING_RESULT_TIME_OUT 1 // second +#define USEC_TO_NSEC 1000 // queue private static void DeleteFromHead(PwrMsgBuffer *smb) { @@ -234,7 +236,7 @@ int WaitingForResponse(const ResultWaitingMsgNode *node) pthread_mutex_lock((pthread_mutex_t *)&(node->waitMutex)); gettimeofday(&now, NULL); outTime.tv_sec = now.tv_sec + WAITING_RESULT_TIME_OUT; - outTime.tv_nsec = now.tv_usec * 1000; + outTime.tv_nsec = now.tv_usec * USEC_TO_NSEC; int ret = pthread_cond_timedwait((pthread_cond_t *)&(node->waitCond), (pthread_mutex_t *)&(node->waitMutex), &outTime); pthread_mutex_unlock((pthread_mutex_t *)&(node->waitMutex)); diff --git a/common/src/pwrmsg.c b/common/src/pwrmsg.c index 5a0629d..a123d3c 100644 --- a/common/src/pwrmsg.c +++ b/common/src/pwrmsg.c @@ -17,6 +17,7 @@ #include #include #include +#include "pwrerr.h" static pid_t g_pid = 0; static pthread_mutex_t g_seqLock; diff --git a/pwrapic/inc/powerapi.h b/pwrapic/inc/powerapi.h index 08bb7e3..87aec98 100644 --- a/pwrapic/inc/powerapi.h +++ b/pwrapic/inc/powerapi.h @@ -35,6 +35,7 @@ PWR_API int PWR_UnRegister(void); // CPU PWR_API int PWR_CPU_GetInfo(PWR_CPU_Info *cpuInfo); PWR_API int PWR_CPU_GetUsage(PWR_CPU_Usage *usage, uint32_t bufferSize); +PWR_API int PWR_CPU_GetLlcMissPerIns(double *cacheMiss); PWR_API int PWR_CPU_GetFreqAbility(PWR_CPU_FreqAbility *freqAbi, uint32_t bufferSize); PWR_API int PWR_CPU_GetFreqGovernor(char gov[], uint32_t size); // len: MAX_ELEMENT_NAME_LEN PWR_API int PWR_CPU_SetFreqGovernor(char gov[]); diff --git a/pwrapic/inc/pwrcpu.h b/pwrapic/inc/pwrcpu.h index 1781f82..7d253a3 100644 --- a/pwrapic/inc/pwrcpu.h +++ b/pwrapic/inc/pwrcpu.h @@ -18,6 +18,7 @@ #include "powerapi.h" int GetCpuInfo(PWR_CPU_Info *cpuInfo); int GetCpuUsage(PWR_CPU_Usage *usage, uint32_t bufferSize); +int GetCpuLlcMissPerIns(double *cacheMiss); int GetCpuFreqAbility(PWR_CPU_FreqAbility *freqAbi, uint32_t bufferSize); int GetCpuFreqGovernor(char gov[], uint32_t size); int SetCpuFreqGovernor(char gov[], uint32_t size); diff --git a/pwrapic/src/powerapi.c b/pwrapic/src/powerapi.c index 8bcb1c6..ecccdcb 100644 --- a/pwrapic/src/powerapi.c +++ b/pwrapic/src/powerapi.c @@ -51,9 +51,9 @@ int PWR_SetLogCallback(void(LogCallback)(int, const char *, va_list)) { if (LogCallback) { g_pwrlog_callback = LogCallback; - return 0; + return SUCCESS; } - return -1; + return ERR_NULL_POINTER; } int PWR_Register(void) @@ -91,7 +91,14 @@ int PWR_CPU_GetUsage(PWR_CPU_Usage *usage, uint32_t bufferSize) } return GetCpuUsage(usage, bufferSize); - ; +} + +PWR_API int PWR_CPU_GetLlcMissPerIns(double *cacheMiss) +{ + CHECK_STATUS(); + CHECK_NULL_POINTER(cacheMiss); + + return GetCpuLlcMissPerIns(cacheMiss); } int PWR_CPU_GetFreqAbility(PWR_CPU_FreqAbility *freqAbi, uint32_t bufferSize) @@ -280,7 +287,6 @@ int PWR_NET_SetSpeedMod(char ethName[], uint32_t speedMod) return SetNetSpeedMod(ethName, speedMod); } - // USB int PWR_USB_GetAutoSuspend(PWR_USB_AutoSuspend usbAts[], uint32_t *len) { diff --git a/pwrapic/src/pwrcpu.c b/pwrapic/src/pwrcpu.c index 5e91051..89a01bf 100644 --- a/pwrapic/src/pwrcpu.c +++ b/pwrapic/src/pwrcpu.c @@ -62,6 +62,25 @@ int GetCpuUsage(PWR_CPU_Usage *usage, uint32_t bufferSize) return SUCCESS; } +int GetCpuLlcMissPerIns(double *cacheMiss) +{ + ReqInputParam input; + input.optType = CPU_GET_CACHE_MISS; + input.dataLen = 0; + input.data = NULL; + RspOutputParam output; + uint32_t size = sizeof(double); + output.rspBuffSize = &size; + output.rspData = (void *)cacheMiss; + int ret = SendReqAndWaitForRsp(input, output); + if (ret != SUCCESS) { + PwrLog(ERROR, "GetCpuLlcMissPerIns failed. ret:%d", ret); + } else { + PwrLog(DEBUG, "GetCpuLlcMissPerIns Succeed."); + } + return ret; +} + int GetCpuFreqAbility(PWR_CPU_FreqAbility *freqAbi, uint32_t bufferSize) { ReqInputParam input; diff --git a/pwrapic/src/sockclient.c b/pwrapic/src/sockclient.c index b6678e0..02145dc 100644 --- a/pwrapic/src/sockclient.c +++ b/pwrapic/src/sockclient.c @@ -32,6 +32,9 @@ #define SERVER_ADDR "pwrserver.sock" #define INVALID_FD (-1) #define SOCK_THREAD_LOOP_INTERVAL 2000 // us +#define RECONNECTE_INTERVAL 3 // s +#define MAX_PID_LEN 12 +#define MAX_PROC_NUM_IN_ONE_LOOP 5 static int g_sockFd = INVALID_FD; static ThreadInfo g_sockThread; @@ -139,7 +142,7 @@ static void SendMsgToSocket(void) { int count = 0; static char data[MAX_DATA_SIZE]; - while (!IsEmptyBuffer(&g_sendBuff) && count < 5) { + while (!IsEmptyBuffer(&g_sendBuff) && count < MAX_PROC_NUM_IN_ONE_LOOP) { PwrMsg *msg = PopFromBufferHead(&g_sendBuff); count++; if (!msg) { @@ -183,9 +186,12 @@ static int CreateConnection(void) struct sockaddr_un clientAddr; bzero(&clientAddr, sizeof(clientAddr)); clientAddr.sun_family = AF_UNIX; - char pidStr[6]; + char pidStr[MAX_PID_LEN]; pid_t pid = getpid(); - sprintf(pidStr, "%d", pid); + if (sprintf(pidStr, "%d", pid) < 0) { + close(clientFd); + return ERR_SYS_EXCEPTION; + } strncpy(clientAddr.sun_path, CLIENT_ADDR, sizeof(clientAddr.sun_path) - 1); // socket file "pwrclient.sock.{$pid}" strncat(clientAddr.sun_path, pidStr, sizeof(clientAddr.sun_path) - strlen(CLIENT_ADDR) - 1); @@ -213,13 +219,13 @@ static int CreateConnection(void) return SUCCESS; } -static void *RunSocketProcess(void* none) +static void *RunSocketProcess(void *none) { fd_set recvFdSet; struct timeval tv; while (g_sockThread.keepRunning) { if (g_sockFd == INVALID_FD) { - sleep(3); + sleep(RECONNECTE_INTERVAL); CreateConnection(); // resume the connection continue; } diff --git a/pwrapic/test/demo_main.c b/pwrapic/test/demo_main.c index 8465222..5b256e9 100644 --- a/pwrapic/test/demo_main.c +++ b/pwrapic/test/demo_main.c @@ -20,8 +20,19 @@ #include "powerapi.h" #define MAIN_LOOP_INTERVAL 5 +#define TEST_FREQ 2400 +#define TEST_CORE_NUM 128 +#define AVG_LEN_PER_CORE 5 +#define TEST_CPU_DMA_LATENCY 2000 static int g_run = 1; +enum { + DEBUG = 0, + INFO, + WARNING, + ERROR +}; + static const char *GetLevelName(int level) { static char debug[] = "DEBUG"; @@ -29,13 +40,13 @@ static const char *GetLevelName(int level) static char warning[] = "WARNING"; static char error[] = "ERROR"; switch (level) { - case 0: + case DEBUG: return debug; - case 1: + case INFO: return info; - case 2: + case WARNING: return warning; - case 3: + case ERROR: return error; default: return info; @@ -62,11 +73,11 @@ static void SignalHandler(int none) static void SetupSignal(void) { // regist signal handler - signal(SIGINT, SignalHandler); - signal(SIGUSR1, SignalHandler); - signal(SIGUSR2, SignalHandler); - signal(SIGTERM, SignalHandler); - signal(SIGKILL, SignalHandler); + (void)signal(SIGINT, SignalHandler); + (void)signal(SIGUSR1, SignalHandler); + (void)signal(SIGUSR2, SignalHandler); + (void)signal(SIGTERM, SignalHandler); + (void)signal(SIGKILL, SignalHandler); } // PWR_CPU_GetUsage @@ -93,7 +104,7 @@ static void TEST_PWR_CPU_GetInfo(void) static void TEST_PWR_CPU_GetUsage(void) { int ret; - int buffSize = sizeof(PWR_CPU_Usage) + 128 * sizeof(PWR_CPU_CoreUsage); + int buffSize = sizeof(PWR_CPU_Usage) + TEST_CORE_NUM * sizeof(PWR_CPU_CoreUsage); PWR_CPU_Usage *u = (PWR_CPU_Usage *)malloc(buffSize); if (!u) { return; @@ -107,13 +118,22 @@ static void TEST_PWR_CPU_GetUsage(void) free(u); } +// PWR_CPU_GetLlcMissPerIns +static void TEST_PWR_CPU_GetLlcMissPerIns(void) +{ + int ret; + double miss = 0; + ret = PWR_CPU_GetLlcMissPerIns(&miss); + printf("PWR_CPU_GetLlcMissPerIns ret: %d, LLC misses:%.8f \n", ret, miss); +} + // PWR_CPU_GetFreqAbility static void TEST_PWR_CPU_GetFreqAbility(void) { int ret = 0; - int len = sizeof(PWR_CPU_FreqAbility) + 5 * 128; + int len = sizeof(PWR_CPU_FreqAbility) + AVG_LEN_PER_CORE * TEST_CORE_NUM; PWR_CPU_FreqAbility *freqAbi = (PWR_CPU_FreqAbility *)malloc(len); - if(!freqAbi) { + if (!freqAbi) { return; } bzero(freqAbi, len); @@ -147,11 +167,11 @@ static void TEST_PWR_CPU_SetAndGetFreqGov(void) } // PWR_CPU_GetFreq PWR_CPU_SetFreq -#define TEST_FREQ 2400; + static void TEST_PWR_CPU_SetAndGetCurFreq(void) { int ret = 0; - uint32_t len = 128; + uint32_t len = TEST_CORE_NUM; PWR_CPU_CurFreq curFreq[len]; bzero(curFreq, len * sizeof(PWR_CPU_CurFreq)); int spec = 0; @@ -160,7 +180,7 @@ static void TEST_PWR_CPU_SetAndGetCurFreq(void) for (int i = 0; i < len; i++) { printf("Freq Policy %d curFreq:%d\n", curFreq[i].policyId, curFreq[i].curFreq); } - len = 128; + len = TEST_CORE_NUM; bzero(curFreq, len * sizeof(PWR_CPU_CurFreq)); curFreq[0].policyId = 0; curFreq[0].curFreq = TEST_FREQ; @@ -179,7 +199,7 @@ static void TEST_PWR_CPU_DmaSetAndGetLatency(void) int la = -1; ret = PWR_CPU_DmaGetLatency(&la); printf("PWR_CPU_DmaGetLatency ret: %d, Latency:%d\n", ret, la); - ret = PWR_CPU_DmaSetLatency(2000); + ret = PWR_CPU_DmaSetLatency(TEST_CPU_DMA_LATENCY); printf("PWR_CPU_DmaSetLatency ret: %d\n", ret); la = -1; ret = PWR_CPU_DmaGetLatency(&la); @@ -199,6 +219,9 @@ int main(int argc, const char *args[]) // PWR_CPU_GetUsage TEST_PWR_CPU_GetUsage(); + // PWR_CPU_GetUsage + TEST_PWR_CPU_GetLlcMissPerIns(); + // PWR_CPU_GetFreqAbility TEST_PWR_CPU_GetFreqAbility(); diff --git a/pwrapis/inc/common.h b/pwrapis/inc/common.h index edd36db..79dcbe9 100644 --- a/pwrapis/inc/common.h +++ b/pwrapis/inc/common.h @@ -9,7 +9,7 @@ * PURPOSE. * See the Mulan PSL v2 for more details. * Author: luocaimin - * Create: 2021-03-29 + * Create: 2022-06-23 * Description: provide const value defination * **************************************************************************** */ #ifndef LCM_COMMON_H diff --git a/pwrapis/inc/config.h b/pwrapis/inc/config.h index d2381d8..a1b1ac6 100644 --- a/pwrapis/inc/config.h +++ b/pwrapis/inc/config.h @@ -15,7 +15,6 @@ #ifndef __PAPIS_CONFIG_H__ #define __PAPIS_CONFIG_H__ #include -#include #include "common.h" #define DEFAULT_SERVER_ADDR "pwrserver.sock" diff --git a/pwrapis/inc/utils.h b/pwrapis/inc/utils.h index 829861e..3885b9c 100644 --- a/pwrapis/inc/utils.h +++ b/pwrapis/inc/utils.h @@ -9,7 +9,7 @@ * PURPOSE. * See the Mulan PSL v2 for more details. * Author: luocaimin - * Create: 2021-03-29 + * Create: 2022-06-23 * Description: provide common methods * **************************************************************************** */ #ifndef LCM_UTILS_H diff --git a/pwrapis/src/config.c b/pwrapis/src/config.c index bb80d34..3f84fbe 100644 --- a/pwrapis/src/config.c +++ b/pwrapis/src/config.c @@ -12,8 +12,9 @@ * Create: 2022-06-23 * Description: loading config file and manager all config items for the PowerAPI service * **************************************************************************** */ - + #include "config.h" +#include #include "string.h" #include "pwrerr.h" #include "log.h" diff --git a/pwrapis/src/main_frame.c b/pwrapis/src/main_frame.c index d3e062c..c18fcb9 100644 --- a/pwrapis/src/main_frame.c +++ b/pwrapis/src/main_frame.c @@ -15,10 +15,10 @@ #include #include #include - #include "server.h" #include "config.h" #include "log.h" +#include "pwrerr.h" #define ARGS_NUM 2 #define MAIN_LOOP_INTERVAL 5 @@ -60,11 +60,11 @@ static void SignalHandler(int none) static void SetupSignal(void) { // regist signal handler - signal(SIGINT, SignalHandler); - signal(SIGUSR1, SignalHandler); - signal(SIGUSR2, SignalHandler); - signal(SIGTERM, SignalHandler); - signal(SIGKILL, SignalHandler); + (void)signal(SIGINT, SignalHandler); + (void)signal(SIGUSR1, SignalHandler); + (void)signal(SIGUSR2, SignalHandler); + (void)signal(SIGTERM, SignalHandler); + (void)signal(SIGKILL, SignalHandler); } int main(int argc, const char *args[]) diff --git a/pwrapis/src/server.c b/pwrapis/src/server.c index 41cef65..274c081 100644 --- a/pwrapis/src/server.c +++ b/pwrapis/src/server.c @@ -29,6 +29,7 @@ #include "config.h" #include "pwrbuffer.h" #include "cpuservice.h" +#include "pwrerr.h" static int g_listenFd = -1; static pthread_mutex_t g_listenFdLock = PTHREAD_MUTEX_INITIALIZER; -- Gitee