From 99028e85ef8c5893c7b1972d5e0c07c974ddbd86 Mon Sep 17 00:00:00 2001 From: leizongkun Date: Mon, 15 Dec 2025 16:56:06 +0800 Subject: [PATCH] sync code for secure code check Signed-off-by: wangzhigang Signed-off-by: zhangliang Signed-off-by: leizongkun --- src/libvirt_helper.c | 95 +---------- src/libvirt_helper.h | 2 - src/memlink_core.c | 12 +- src/memlink_core.h | 1 - src/memlink_driver.c | 115 +------------ src/memlink_driver.h | 10 -- src/util.c | 373 +++---------------------------------------- src/util.h | 67 +------- 8 files changed, 32 insertions(+), 643 deletions(-) diff --git a/src/libvirt_helper.c b/src/libvirt_helper.c index a173809..047e99a 100644 --- a/src/libvirt_helper.c +++ b/src/libvirt_helper.c @@ -41,7 +41,7 @@ struct DomainEventData { event, -1, VIR_DOMAIN_EVENT_CALLBACK(callback), #event \ } -STATIC void ConnectLibvirt(void) +static void ConnectLibvirt(void) { if (g_libvirtConn != NULL && (virConnectIsAlive(g_libvirtConn) != 1)) { MEM_INFO("Libvirt connect is not alive; Try to connect libvirtd again"); @@ -72,26 +72,6 @@ virDomainPtr LookupDomByID(int domid) return dom; } -bool CheckDomainIsAlive(const VirtualMachineInfoPtr vminfo) -{ - int ret; - virErrorPtr errMsg = NULL; - - if (!vminfo) { - return false; - } - ret = virDomainIsActive(vminfo->dom); - if (ret < 0) { - errMsg = virGetLastError(); - MEM_INFO("Failed to query domain state, errno: %d, error msg: %s", - errMsg ? errMsg->code : errno, - (errMsg && errMsg->message) ? errMsg->message : "Unkown"); - ret = 0; - } - - return ret != 0; -} - char *GetLastErrMsg(void) { virErrorPtr error = NULL; @@ -104,7 +84,7 @@ char *GetLastErrMsg(void) return NULL; } -STATIC void CollectAddCurrentVMs(void) +static void CollectAddCurrentVMs(void) { int ret = -1; int domNum = 0; @@ -306,69 +286,6 @@ CLEANUP: virDomainStatsRecordListFree(records); } -int GetVmMemoryStat(const VirtualMachineInfoPtr vminfo) -{ - int ret = -1; - int i = 0; - int retNrStats = -1; - char *errmsg = NULL; - virDomainMemoryStatStruct stats[(int)VIR_DOMAIN_MEMORY_STAT_NR]; - - if (!vminfo) { - goto CLEANUP; - } - - if (vminfo->dom) { - retNrStats = virDomainMemoryStats(vminfo->dom, stats, VIR_DOMAIN_MEMORY_STAT_NR, 0); - if (retNrStats < 0) { - errmsg = GetLastErrMsg(); - MEM_ERROR("Domain [%s] get memory stat failed!, reason: %s", vminfo->domname, - errmsg ? errmsg : "Unknown"); - goto CLEANUP; - } - } else { - MEM_ERROR("Dom is null but vminfo not, something went wrong!"); - goto CLEANUP; - } - - vminfo->memstat.actualBalloon = 0; - vminfo->memstat.available = 0; - vminfo->memstat.usable = 0; - vminfo->memstat.unused = 0; - vminfo->memstat.rss = 0; - vminfo->enable_fpr = false; - - for (i = 0; i < retNrStats; i++) { - switch (stats[i].tag) { - case VIR_DOMAIN_MEMORY_STAT_ACTUAL_BALLOON: - vminfo->memstat.actualBalloon = (uint64_t)stats[i].val; - break; - case VIR_DOMAIN_MEMORY_STAT_AVAILABLE: - vminfo->memstat.available = (uint64_t)stats[i].val; - break; - case VIR_DOMAIN_MEMORY_STAT_USABLE: - vminfo->memstat.usable = (uint64_t)stats[i].val; - break; - case VIR_DOMAIN_MEMORY_STAT_UNUSED: - vminfo->memstat.unused = (uint64_t)stats[i].val; - break; - case VIR_DOMAIN_MEMORY_STAT_RSS: - vminfo->memstat.rss = (uint64_t)stats[i].val; - break; - case VIR_DOMAIN_MEMORY_STAT_DISK_CACHES: - if ((stats[i].val & ENABLED_FPR_FLAG) > 0) { - vminfo->enable_fpr = true; - } - break; - default: - break; - } - } - ret = 0; -CLEANUP: - return ret; -} - int CheckVmMemoryStat(const VirtualMachineInfoPtr vminfo) { int ret = -1; @@ -410,7 +327,7 @@ void ProcessDomainEvent(int domid, const char *name, int event, int detail ATTRI } } -STATIC int DomainEventCallback(virConnectPtr conn ATTRIBUTE_UNUSED, +static int DomainEventCallback(virConnectPtr conn ATTRIBUTE_UNUSED, virDomainPtr dom, int event, int detail, @@ -437,7 +354,7 @@ struct DomainEventData g_domainEvents[] = { DOMAIN_EVENT((int)VIR_DOMAIN_EVENT_ID_LIFECYCLE, DomainEventCallback), }; -STATIC int DomainEventsRegister(void) +static int DomainEventsRegister(void) { size_t i; for (i = 0; i < ARRAY_CARDINALITY(g_domainEvents); i++) { @@ -457,7 +374,7 @@ STATIC int DomainEventsRegister(void) return 0; } -STATIC void DomainEventsDeregister() +static void DomainEventsDeregister() { size_t i; for (i = 0; i < ARRAY_CARDINALITY(g_domainEvents); i++) { @@ -477,7 +394,7 @@ void *DomainEventProcessThread(void *data) virErrorPtr err = virGetLastError(); MEM_ERROR("Failed to register event implementation: %s", err && err->message ? err->message : "Unknown error"); - exit(EXIT_FAILURE); // exit thread + g_stopMemlinkd = 1; } while (g_stopMemlinkd == 0) { diff --git a/src/libvirt_helper.h b/src/libvirt_helper.h index faa8800..8fc66b3 100644 --- a/src/libvirt_helper.h +++ b/src/libvirt_helper.h @@ -25,12 +25,10 @@ extern int g_stopMemlinkd; char *GetLastErrMsg(void); void SetVmMemoryStatsPeriod(const VirtualMachineInfoPtr vminfo, bool updateStats); -int GetVmMemoryStat(const VirtualMachineInfoPtr vminfo); void GetAllDomainsStats(void); int CheckVmMemoryStat(const VirtualMachineInfoPtr vminfo); const char *GetDomainName(const VirtualMachineInfoPtr vminfo); virDomainPtr LookupDomByID(int domid); -bool CheckDomainIsAlive(const VirtualMachineInfoPtr vminfo); void *DomainEventProcessThread(void *data); void ProcessDomainEvent(int domid, const char *name, int event, int detail); diff --git a/src/memlink_core.c b/src/memlink_core.c index 4bc7711..bf636c5 100644 --- a/src/memlink_core.c +++ b/src/memlink_core.c @@ -24,7 +24,7 @@ static MemlinkdThread g_domainEventThread; static MemlinkdThread g_balloonVmMemThread; -STATIC int CreateEventThread(void) +static int CreateEventThread(void) { MemSemaphore readySem; int rc = memset_s(&readySem, sizeof(readySem), 0, sizeof(readySem)); @@ -62,7 +62,7 @@ STATIC int CreateEventThread(void) #define BALLON_TARGET_RESERVED_KBYTES (1024 * 1024) #define BALLOON_BACK_RESERVED_SIZE_KB (2 * 1024) -STATIC void RecordPressure(VirtualMachineInfoPtr vminfo) +static void RecordPressure(VirtualMachineInfoPtr vminfo) { #define PERCENT 100 uint64_t guestUsedMemory; @@ -95,7 +95,7 @@ STATIC void RecordPressure(VirtualMachineInfoPtr vminfo) #define NEED_BALLOON_CHECK_TIMES 20 -STATIC void DoBallooning(VirtualMachineInfoPtr vminfo) +static void DoBallooning(VirtualMachineInfoPtr vminfo) { uint64_t guestTotalMemory; uint64_t guestUsedMemory; @@ -153,7 +153,7 @@ STATIC void DoBallooning(VirtualMachineInfoPtr vminfo) #define BALLOONBACK_LEFT (-2) -STATIC int BalloonCheck(VirtualMachineInfoPtr vminfo) +static int BalloonCheck(VirtualMachineInfoPtr vminfo) { #define LOW_WATER_MARK 1024 #define INDEX_MASK 2 @@ -265,7 +265,7 @@ static void UpdateAllVmInfoAndMemoryStats(void) MutexUnlock(&g_vmlistHead.lock); } -STATIC void *BalloonVmMemThread(void *data ATTRIBUTE_UNUSED) +static void *BalloonVmMemThread(void *data ATTRIBUTE_UNUSED) { VirtualMachineInfoPtr vminfo = NULL; @@ -338,7 +338,7 @@ int CoreInit(void) #define SET_BALLOON_MAX 10 -STATIC void BalloonBackVmMem(void) +static void BalloonBackVmMem(void) { VirtualMachineInfoPtr vminfo = NULL; uint64_t ballonTarget = 0; diff --git a/src/memlink_core.h b/src/memlink_core.h index 8c40f20..f6cd7d6 100644 --- a/src/memlink_core.h +++ b/src/memlink_core.h @@ -19,7 +19,6 @@ int CoreInit(void); void CoreExit(void); -void CoreHandler(void); extern int g_stopMemlinkd; diff --git a/src/memlink_driver.c b/src/memlink_driver.c index 7679221..3146a49 100644 --- a/src/memlink_driver.c +++ b/src/memlink_driver.c @@ -130,7 +130,7 @@ void FreeAllVM(void) return; } -STATIC int InitAndCheckVM(VirtualMachineInfoPtr vminfo) +static int InitAndCheckVM(VirtualMachineInfoPtr vminfo) { const char *name = NULL; char *errmsg = NULL; @@ -223,12 +223,6 @@ static void DeleteVMFromList(VirtualMachineInfoPtr vminfo) FreeVM(vminfo); } -/* Must hold vmlist_head.lock */ -void VMInfoRef(VirtualMachineInfoPtr vminfo) -{ - ATOMIC_ADD_FETCH(&vminfo->refcount, 1); -} - /* Must hold vmlist_head.lock */ void VMInfoUnref(VirtualMachineInfoPtr vminfo) { @@ -251,32 +245,6 @@ void FindDeleteVMFromList(const char *name) MutexUnlock(&g_vmlistHead.lock); } -VirtualMachineInfoPtr GetRefVMInfoByDomid(int domid) -{ - VirtualMachineInfoPtr vminfo = NULL; - - MutexLock(&g_vmlistHead.lock); - LIST_FOREACH(vminfo, &g_vmlistHead.domainsListHead, entry) { - if (vminfo->domid == domid) { - VMInfoRef(vminfo); - break; - } - } - MutexUnlock(&g_vmlistHead.lock); - - return vminfo; -} - -void PutUnrefVMInfo(VirtualMachineInfoPtr vminfo) -{ - if (!vminfo) { - return; - } - MutexLock(&g_vmlistHead.lock); - VMInfoUnref(vminfo); - MutexUnlock(&g_vmlistHead.lock); -} - /* update single vminfo by domid */ int UpdateVmInfo(VirtualMachineInfoPtr vminfo) { @@ -399,87 +367,6 @@ int GetIntegerValueFromCfg(const char *key) return value; } -/* copy file @fpIn to file @fpOut. - * if exist @key, it will change the value to @valueChanged - * @return: return 0 on success; return -1 on error - */ -static int CopyToFile(FILE *fpIn, FILE *fpOut, const char *key, int valueChanged) -{ - char line[LINE_MAX_CHAR] = { 0 }; - char tmpkey[LINE_MAX_CHAR] = { 0 }; - int tmpValue = 0; - int rc = 0; - - while (fgets(line, LINE_MAX_CHAR, fpIn) != NULL) { - if (line[0] == '#' || line[0] == '\n' || !strstr(line, key)) { - if (fputs(line, fpOut) < 0) { - MEM_ERROR("Fail to puts string"); - return -1; - } - if (memset_s(line, LINE_MAX_CHAR, 0, LINE_MAX_CHAR) != 0) { - MEM_ERROR("Fail to memset strings"); - return -1; - } - continue; - } - rc = sscanf_s(line, "%[^=]=%d\n", tmpkey, LINE_MAX_CHAR, &tmpValue); - if (rc < 0) { - MEM_ERROR("Failed to parse key"); - return -1; - } - if (strcmp(tmpkey, key) == 0) { - tmpValue = valueChanged; - } - if (fprintf(fpOut, "%s=%d\n", tmpkey, tmpValue) < 0) { - return -1; - } - if (memset_s(line, LINE_MAX_CHAR, 0, LINE_MAX_CHAR) != 0) { - MEM_ERROR("Fail to memset strings"); - return -1; - } - } - - return 0; -} - -void SetValueToCfg(const char *key, int value) -{ - FILE *fpIn = NULL; - FILE *fpOut = NULL; - - int ret = 0; - - fpIn = fopen(MEMLINKD_CONF_FILE, "r"); - if (fpIn == NULL) { - MEM_ERROR("Can't open config file"); - goto END; - } - - fpOut = fopen(MEMLINKD_TMP_CONF_FILE, "w+"); - if (fpOut == NULL) { - MEM_ERROR("can't open tmp config file"); - goto END; - } - - if (CopyToFile(fpIn, fpOut, key, value) != 0) { - goto END; - } - ret = 1; - -END: - if (fpIn != NULL) { - fclose(fpIn); - } - if (fpOut != NULL) { - fclose(fpOut); - } - if (ret != 0) { - if (rename(MEMLINKD_TMP_CONF_FILE, MEMLINKD_CONF_FILE) != 0) { - MEM_ERROR("can't overwrite config file"); - } - } -} - #define GET_INT_VALUE_FROM_CFG(str, key, value, tmp) do { \ tmp = GetIntegerValueFromCfg(str); \ if ((tmp) == CFGOPEN_OR_MEMSET_ERROR) { \ diff --git a/src/memlink_driver.h b/src/memlink_driver.h index 7ad8e92..1f7ee81 100644 --- a/src/memlink_driver.h +++ b/src/memlink_driver.h @@ -62,13 +62,6 @@ extern int g_balloonTargetMaxTotalPercent; int LoadCfgFile(void); int GetIntegerValueFromCfg(const char *key); -void SetValueToCfg(const char *key, int value); - -char *HostMemStateStr(int state); -int GetHostMemState(void); -uint64_t GetHostAvailableMem(void); -int InitHostMemoryinfo(void); -void InitAdvancedParameters(const MemlinkCfgPtr cfg); /** * VM Memory Info Interface @@ -165,9 +158,6 @@ void FreeAllVM(void); void FindAddVMToList(int domid); void FindDeleteVMFromList(const char *name); -VirtualMachineInfoPtr GetRefVMInfoByDomid(int domid); -void PutUnrefVMInfo(VirtualMachineInfoPtr vminfo); -void VMInfoRef(VirtualMachineInfoPtr vminfo); void VMInfoUnref(VirtualMachineInfoPtr vminfo); #endif diff --git a/src/util.c b/src/util.c index ccfa27d..f4c2e8f 100644 --- a/src/util.c +++ b/src/util.c @@ -28,25 +28,6 @@ #include "log.h" #include "util.h" -int MutexInit(MemMutexPtr m) -{ - int ret; - pthread_mutexattr_t attr; - (void)pthread_mutexattr_init(&attr); - (void)pthread_mutexattr_settype(&attr, 0); - ret = pthread_mutex_init(&m->lock, &attr); - (void)pthread_mutexattr_destroy(&attr); - if (ret != 0) { - return -1; - } - return 0; -} - -void MutexDestroy(MemMutexPtr m) -{ - (void)pthread_mutex_destroy(&m->lock); -} - void MutexLock(MemMutexPtr m) { (void)pthread_mutex_lock(&m->lock); @@ -57,11 +38,6 @@ void MutexUnlock(MemMutexPtr m) (void)pthread_mutex_unlock(&m->lock); } -int MutexTryLock(MemMutexPtr m) -{ - return pthread_mutex_trylock(&m->lock); -} - void SleepApprox(int seconds) { #define US_TO_NS_RATE 1000 @@ -81,7 +57,7 @@ void SleepApprox(int seconds) (void)nanosleep(&ts, NULL); } -STATIC char *GetOneLineFromFile(const char *filename, size_t max, size_t *count) +static char *GetOneLineFromFile(const char *filename, size_t max, size_t *count) { FILE *fp = NULL; size_t size; @@ -132,11 +108,18 @@ STATIC char *GetOneLineFromFile(const char *filename, size_t max, size_t *count) return line; } -#ifdef CUNIT -#define QEMU_PID_DIR "/tmp/" -#else +static int IsValidVmName(const char *vmName) +{ + if (!vmName || strlen(vmName) == 0) { + return 0; + } + if (strchr(vmName, '/')) { + return 0; + } + return 1; +} + #define QEMU_PID_DIR "/var/run/libvirt/qemu/" -#endif int GetQEMUPidByVMName(const char *vmName) { @@ -152,6 +135,10 @@ int GetQEMUPidByVMName(const char *vmName) if (!vmName) { return -1; } + if (!IsValidVmName(vmName)) { + MEM_ERROR("Invalid VM name"); + return -1; + } rc = snprintf_s(pidFilePath, sizeof(pidFilePath), sizeof(pidFilePath) - 1, "%s%s.pid", QEMU_PID_DIR, vmName); if (rc < 0) { @@ -199,237 +186,6 @@ int GetQEMUPidByVMName(const char *vmName) #define CGROUP_MEMORY_DIR "/sys/fs/cgroup/memory" #define PATH_MAX_SIZE 4096 -static int GetProcCgroupPath(const char *vmName, char *procCgroupPath) -{ - int pid; - pid = GetQEMUPidByVMName(vmName); - if (pid < 0) { - return -1; - } -#ifdef CUNIT - if (snprintf_s(procCgroupPath, PATH_MAX_SIZE, PATH_MAX_SIZE - 1, "/proc/%ld/cgroup", (long)getpid()) <= 0) { - return -1; - } -#else - if (snprintf_s(procCgroupPath, PATH_MAX_SIZE, PATH_MAX_SIZE - 1, "/proc/%d/cgroup", pid) <= 0) { - return -1; - } -#endif - return 0; -} - -STATIC int GetCgroupFilePath(const char *vmName, const char *type, char *cgroupFilePath) -{ - char procCgroupPath[PATH_MAX_SIZE] = { 0 }; - char controller[PATH_MAX_SIZE] = { 0 }; - FILE *fp = NULL; - size_t size; - char *token = NULL; - char *nextToken = NULL; - - if (GetProcCgroupPath(vmName, procCgroupPath) < 0) { - return -1; - }; - - fp = fopen(procCgroupPath, "r"); - if (!fp) { - MEM_ERROR("Can't open file %s, reason: %s", procCgroupPath, strerror(errno)); - return -1; - } - - do { - if (!fgets(controller, PATH_MAX_SIZE, fp)) { - fclose(fp); - return -1; - } - - token = strtok_s(controller, ":", &nextToken); /* id */ - token = strtok_s(NULL, ":", &nextToken); /* controller */ - if (!token) { - fclose(fp); - return -1; - } - } while (strcmp(token, "memory") != 0); - - token = strtok_s(NULL, ":", &nextToken); - if (!token) { - fclose(fp); - return -1; - } - size = strlen(token); - token[size - 1] = '\0'; /* remove \n */ - if (fp) { - fclose(fp); - } - - if (snprintf_s(cgroupFilePath, PATH_MAX_SIZE, PATH_MAX_SIZE - 1, "%s%s/memory.%s_in_bytes", - CGROUP_MEMORY_DIR, token, type) <= 0) { - return -1; - } else { - return 0; - } -} - -int ReadCgroupPathU64(const char *path, const uint64_t *val) -{ - FILE *fp = NULL; - int size; - int ret = -1; - char *canonicalPath = NULL; - - if (!(path && val)) { - MEM_ERROR("path or val is NULL!"); - goto OUT; - } - canonicalPath = realpath(path, NULL); - if (canonicalPath == NULL) { - MEM_ERROR("Invalid file path %s", path); - goto OUT; - } - fp = fopen(canonicalPath, "r"); - if (!fp) { - MEM_ERROR("Can't open file %s, reason: %s", path, strerror(errno)); - goto OUT; - } - size = fscanf_s(fp, "%llu", val); - if (size <= 0) { - MEM_ERROR("Can't read file %s, reason: %s", path, strerror(errno)); - goto OUT; - } - - ret = 0; - -OUT: - if (fp) { - fclose(fp); - } - if (canonicalPath != NULL) { - free(canonicalPath); - } - return ret; -} - -/* retry_count: we may failed several times for some special file, like memcg.limit */ -int WriteStringToFile(const char *path, const char *string, int retryCount) -{ - int fd = -1; - int ret = -1; - int nrRetry = retryCount; - char *canonicalPath = NULL; - - if (path == NULL || string == NULL) { - MEM_ERROR("Invalid parameters"); - return -1; - } - - canonicalPath = realpath(path, NULL); - if (canonicalPath == NULL) { - MEM_ERROR("Invalid file path %s", path); - goto OUT; - } - - /* here, we need to make sure write data to file, not buffer */ - /* so use open/write, not fopen/fprintf */ - fd = open(canonicalPath, O_WRONLY | O_TRUNC); - if (fd == -1) { - MEM_ERROR("Can't open file %s, reason: %s", path, strerror(errno)); - goto OUT; - } - - ret = (int)write(fd, string, strlen(string)); - if (ret >= 0) { - goto OUT; - } - - /* Write failed let's retry */ - while (nrRetry != 0) { - if (write(fd, string, strlen(string)) < 0) { - nrRetry--; - } else { - break; - } - } - if (nrRetry == 0) { - goto OUT; - } - ret = 0; - -OUT: - if (fd >= 0) { - close(fd); - } - if (canonicalPath != NULL) { - free(canonicalPath); - } - return ret; -} - -#define MAX_LONG_SIZE 32 - -int WriteCgroupPathU64(const char *path, uint64_t val, int retryCount) -{ - char value[MAX_LONG_SIZE] = { 0 }; - int rc; - - rc = sprintf_s(value, MAX_LONG_SIZE, "%llu", val); - if (rc < 0) { - MEM_ERROR("Failed to write value to cgroup"); - return -1; - } - - return WriteStringToFile(path, value, retryCount); -} - -int WriteCgroupPathS64(const char *path, int64_t val, int retryCount) -{ - char value[MAX_LONG_SIZE] = { 0 }; - int rc; - - rc = sprintf_s(value, MAX_LONG_SIZE, "%lld", val); - if (rc < 0) { - MEM_ERROR("Failed to write value to cgroup"); - return -1; - } - - return WriteStringToFile(path, value, retryCount); -} - -int GetQEMUMemoryUsage(const char *vmName, uint64_t *usage) -{ -#define RATE_SHIFT 10 - char *usagePath = NULL; - int ret = -1; - int rc; - - usagePath = (char *)malloc(PATH_MAX_SIZE * sizeof(char)); - if (usagePath == NULL) { - MEM_ERROR("Can't alloc memory for cgroup mem usage path"); - goto OUT; - } - - rc = memset_s(usagePath, PATH_MAX_SIZE * sizeof(char), 0, PATH_MAX_SIZE * sizeof(char)); - if (rc != 0) { - MEM_ERROR("Failed to memset usage_path"); - goto OUT; - } - - if (GetCgroupFilePath(vmName, "usage", usagePath) < 0) { - goto OUT; - } - - if (ReadCgroupPathU64(usagePath, usage) < 0) { - goto OUT; - } - *usage = *usage >> RATE_SHIFT; /* bytes --> kbytes */ - ret = 0; - -OUT: - if (usagePath) { - free(usagePath); - } - return ret; -} - int CopyString(char **dst, const char *src) { *dst = NULL; @@ -452,7 +208,7 @@ int CopyString(char **dst, const char *src) * return 1 on @strLine containning one of part of @tokens. * return 0 on @strLine not containning any part of @tokens. */ -STATIC int ContainOneOfTokens(const char *strLine, size_t count, char *tokens) +static int ContainOneOfTokens(const char *strLine, size_t count, char *tokens) { const char *ptr = NULL; char *nextToken = NULL; @@ -482,7 +238,7 @@ STATIC int ContainOneOfTokens(const char *strLine, size_t count, char *tokens) return 0; } -STATIC int CheckString(const char *vmName, const char *str) +static int CheckString(const char *vmName, const char *str) { #define MAX_BUF_LEN 100 long pid; @@ -498,11 +254,7 @@ STATIC int CheckString(const char *vmName, const char *str) goto CLEANUP; } -#ifdef CUNIT - rc = sprintf_s(processProc, sizeof(processProc), "/proc/%ld/cmdline", (long)getpid()); -#else rc = sprintf_s(processProc, sizeof(processProc), "/proc/%ld/cmdline", pid); -#endif if (rc < 0) { MEM_ERROR("Failed to print process_proc"); goto CLEANUP; @@ -529,16 +281,6 @@ CLEANUP: return ret; } -int CheckVMHasPassthroughDev(const char *vmName) -{ - /* - * Hopes there are no VM's name including 'vfio-pci' or 'pci-assign' string, - * Or maybe we shoule check '-device vfio-pci' or '-device pci-assign' to - * Avoid this insane cases. Or any better ways to find VM has passthrough device ? - */ - return CheckString(vmName, "vfio-pci:pci-assign"); -} - int CheckVMHasHugePage(const char *vmName) { return CheckString(vmName, "prealloc"); @@ -661,85 +403,6 @@ int SemDestroy(MemSemaphore *sem) */ #define LINE_MAX_CHAR 1024 -int GetFloatValueFromJsonString(const char *str, const char *key, float *value) -{ -#define PREFIX_LEN 2 - char *keyBegin = NULL; - char *keyEnd = NULL; - char strTemp[LINE_MAX_CHAR] = { 0 }; - char keyTemp[LINE_MAX_CHAR] = { 0 }; - size_t i = 0; - size_t j = 0; - size_t len; - - if (!str || !key || strlen(str) <= strlen(key) || strlen(str) >= LINE_MAX_CHAR) { - return -1; - } - - len = strlen(str); - for (i = 0; i < len; i++) { - if (str[i] != ' ') { - strTemp[j] = str[i]; - j++; - } - } - - strTemp[j] = '\0'; - if (snprintf_s(keyTemp, LINE_MAX_CHAR, LINE_MAX_CHAR - 1, "'%s'", key) < 0) { - return -1; - } - - keyBegin = strstr(strTemp, keyTemp); - if (keyBegin == NULL) { - MEM_ERROR("Try to get '%s' from wrong format of '%s'", key, str); - return -1; - } - - keyBegin += strlen(keyTemp); /* Jump the key */ - if (strncmp(keyBegin, ":\'", PREFIX_LEN) != 0) { - MEM_ERROR("Try to get '%s' from wrong format of '%s'", key, str); - return -1; - } - keyBegin += PREFIX_LEN; /* Jump ":'" */ - - *value = strtof(keyBegin, &keyEnd); - if (*keyEnd != '\'') { /* Check again */ - MEM_ERROR("Wrong format of '%s'", str); - return -1; - } - - return 0; -} - -int WriteValueToLinuxProc(char *path, int value) -{ - char cmd[MAX_MONITORCOMMAND] = { 0 }; - int ret; - int rc; - rc = snprintf_s(cmd, sizeof(cmd), sizeof(cmd) - 1, "%d", value); - if (rc < 0) { - MEM_ERROR("Failed to print cmd"); - return -1; - } - - /* write to file, retry 10 times if failed */ - ret = WriteStringToFile(path, cmd, 10); - if (ret >= 0) { - MEM_INFO("Successful while writting %d to %s", value, path); - } - return ret; -} - -int STRPREFIX(const char *a, const char *b) -{ - return (strncmp(a, b, strlen(b)) == 0); -} - -int STREQ(const char *a, const char *b) -{ - return (strcmp(a, b) == 0); -} - uint64_t MIN(uint64_t a, uint64_t b) { return (a < b) ? a : b; diff --git a/src/util.h b/src/util.h index 3ded2d9..ce8fc8d 100644 --- a/src/util.h +++ b/src/util.h @@ -18,10 +18,7 @@ #include #include -#ifndef STDINT_H -#define STDINT_H #include -#endif #ifndef EXIT_SUCCESS #define EXIT_SUCCESS 0 @@ -34,30 +31,11 @@ #define EXIT_FAILURE 1 #endif -#ifdef STATIC -#undef STATIC -#endif - -#ifdef CUNIT -#define STATIC -#define FALSE 0 -#define TRUE 1 -#else -#define STATIC static -#endif - -#define KBTOGB 20 -#define KBTOMB 10 - -int STRPREFIX(const char *a, const char *b); -int STREQ(const char *a, const char *b); uint64_t MIN(uint64_t a, uint64_t b); int64_t MAX(int64_t a, int64_t b); -#define MAX_MONITORCOMMAND 256 #define DECIMAL 10 - /** * ATTRIBUTE_UNUSED: * @@ -80,11 +58,8 @@ struct MemlinkdThread { typedef struct MemlinkdThread MemlinkdThread; -int MutexInit(MemMutexPtr m); -void MutexDestroy(MemMutexPtr m); void MutexLock(MemMutexPtr m); void MutexUnlock(MemMutexPtr m); -int MutexTryLock(MemMutexPtr m); int ThreadCreate(MemlinkdThread *thread, const char *name, void *(*startRoutine)(void *), void *arg, int mode); @@ -100,31 +75,12 @@ int SemTimeWait(MemSemaphore *sem, int ms); int SemDestroy(MemSemaphore *sem); int CopyString(char **dst, const char *src); -int CheckVMHasPassthroughDev(const char *vmName); int CheckVMHasHugePage(const char *vmName); int CheckVMIsWindows(const char *vmName); -int ReadCgroupPathU64(const char *path, const uint64_t *val); -int WriteCgroupPathU64(const char *path, uint64_t val, int retryCount); -int WriteCgroupPathS64(const char *path, int64_t val, int retryCount); -int GetQEMUMemoryUsage(const char *vmName, uint64_t *usage); /* others */ void SleepApprox(int seconds); -int WriteValueToLinuxProc(char *path, int value); -int GetFloatValueFromJsonString(const char *str, const char *key, float *value); -int WriteStringToFile(const char *path, const char *string, int retryCount); int GetQEMUPidByVMName(const char *vmName); -/* host memory state */ -typedef enum { - HOST_MEM_INVALID_STATE = -1, - HOST_MEM_EXETREME_LOW_STATE = 1, - HOST_MEM_HARD_LOW_STATE = 2, - HOST_MEM_SOFT_LOW_STATE = 3, - HOST_MEM_MID_STATE = 4, - HOST_MEM_HIGH_STATE = 5, -} HostMemoryState; - -#define MEMLINK_THREAD_JOINABLE 0 #define MEMLINK_THREAD_DETACHED 1 /* key path */ @@ -133,26 +89,13 @@ typedef enum { #define MEMLINKD_TMP_CONF_FILE "/etc/tmp-memlinkd.conf" #define MEMLINKD_PID_FILE "/var/run/memlinkd.pid" -#ifdef FOR_AARCH64 #define SMP_MB() ({ asm volatile("dmb ish" ::: "memory"); (void)0; }) #define SMP_RMB() ({ asm volatile("dmb ishld" ::: "memory"); (void)0; }) #define SMP_WMB() ({ asm volatile("dmb ishst" ::: "memory"); (void)0; }) -#else -#define SMP_MB() ({ asm volatile("mfence" ::: "memory"); (void)0; }) -#define SMP_RMB() ({ asm volatile("lfence" ::: "memory"); (void)0; }) -#define SMP_WMB() ({ asm volatile("sfence" ::: "memory"); (void)0; }) -#endif + /* __sync_lock_test_and_set() is documented to be an acquire barrier only. */ #define ATOMIC_XCHG(ptr, i) (SMP_MB(), __sync_lock_test_and_set(ptr, i)) -#define ATOMIC_READ__NOCHECK(ptr) \ - __atomic_load_n(ptr, __ATOMIC_RELAXED) - -#define ATOMIC_READ(ptr) \ - ({ \ - ATOMIC_READ__NOCHECK(ptr); \ - }) - #define ATOMIC_SET__NOCHECK(ptr, i) \ __atomic_store_n(ptr, i, __ATOMIC_RELAXED) @@ -161,14 +104,6 @@ typedef enum { ATOMIC_SET__NOCHECK(ptr, i); \ } while (0) -#define ATOMIC_ADD_FETCH__NOCHECK(ptr, i) \ - __atomic_add_fetch(ptr, i, __ATOMIC_RELAXED) - -#define ATOMIC_ADD_FETCH(ptr, i) \ - do { \ - ATOMIC_ADD_FETCH__NOCHECK(ptr, i); \ - } while (0) - #define ATOMIC_SUB_FETCH__NOCHECK(ptr, i) \ __atomic_sub_fetch(ptr, i, __ATOMIC_RELAXED) -- Gitee