From ccece149e1b73a636474b67b641b578f5e7476f5 Mon Sep 17 00:00:00 2001 From: Colin Ian King Date: Wed, 7 Aug 2024 10:18:08 +0100 Subject: [PATCH 30/32] common: remove executing commands for directory and file operations Calling commands using execute_command to remove files and directories, create directories and writing data to a file is just wrong. Replace these with direct system calls and remove the execute_command helper function now that it's not required. Fixes: https://github.com/intel/numatop/issues/50 Signed-off-by: Colin Ian King --- common/os/os_util.c | 83 ++++++++++++++++++++++++++++++--------------- 1 file changed, 55 insertions(+), 28 deletions(-) diff --git a/common/os/os_util.c b/common/os/os_util.c index a2212fb..0b862c2 100644 --- a/common/os/os_util.c +++ b/common/os/os_util.c @@ -27,6 +27,7 @@ */ #define _GNU_SOURCE +#define _XOPEN_SOURCE 500 #include #include #include @@ -41,6 +42,7 @@ #include #include #include +#include #include #include #include "../include/types.h" @@ -699,23 +701,6 @@ os_sysfs_uncore_imc_init(imc_info_t *imc, int num) return imc_num; } -static boolean_t execute_command(const char *command, const char *type) -{ - FILE *fp; - - fp = popen(command, type); - if (fp == NULL) { - debug_print(NULL, 2, "Execute '%s' failed (errno = %d)\n", - command, errno); - return B_FALSE; - } - - pclose(fp); - debug_print(NULL, 2, "Execute '%s' ok\n", command); - - return B_TRUE; -} - static boolean_t resctrl_mounted(void) { char path[128]; @@ -763,9 +748,41 @@ void os_cmt_fini(void) g_pqos_moni_id = 0; } +static int os_sysfs_nftw_unlink(const char *fpath, const struct stat *statbuf, + int tflag, struct FTW *ftwbuf) +{ + int ret; + + (void)statbuf; + (void)ftwbuf; + + switch (tflag) { + case FTW_F: + case FTW_SL: + case FTW_SLN: + default: + errno = 0; + ret = unlink(fpath); + if (ret < 0) + debug_print(NULL, 2, "unlink %s (errno=%d)\n", fpath, errno); + break; + case FTW_D: + case FTW_DP: + case FTW_DNR: + errno = 0; + ret = rmdir(fpath); + if (ret < 0) + debug_print(NULL, 2, "rmdir %s (errno=%d)\n", fpath, errno); + break; + } + + return 0; +} + int os_sysfs_cmt_task_set(int pid, int lwpid, struct _perf_pqos *pqos) { - char command[160], path[128]; + char data[64], path[128]; + int ret, fd; if (lwpid) pqos->task_id = lwpid; @@ -777,23 +794,33 @@ int os_sysfs_cmt_task_set(int pid, int lwpid, struct _perf_pqos *pqos) snprintf(path, sizeof(path), "/sys/fs/resctrl/mon_groups/%d", pqos->task_id); - snprintf(command, sizeof(command), "rm -rf %s 2>/dev/null", path); - if (!execute_command(command, "r")) + /* nftw will return -1 if the path does not exist, ignore this */ + (void)nftw(path, os_sysfs_nftw_unlink, 32, FTW_DEPTH | FTW_PHYS); + + ret = mkdir(path, 0777); + if (ret < 0) { + debug_print(NULL, 2, "mkdir %s failed, errno=%d\n", path, errno); return -1; + } - snprintf(command, sizeof(command), "mkdir %s 2>/dev/null", path); - if (!execute_command(command, "r")) + snprintf(path, sizeof(path), + "/sys/fs/resctrl/mon_groups/%d/tasks", pqos->task_id); + fd = open(path, O_RDWR); + if (fd < 0) { + debug_print(NULL, 2, "open %s failed, errno=%d\n", path, errno); return -1; + } if (lwpid == 0) - snprintf(command, sizeof(command), - "echo %d > %s/tasks", pid, path); + snprintf(data, sizeof(data), "%d\n", pid); else - snprintf(command, sizeof(command), - "echo %d > %s/tasks", lwpid, path); - - if (!execute_command(command, "r")) + snprintf(data, sizeof(data), "%d\n", lwpid); + if (write(fd, data, strlen(data)) < 0) { + debug_print(NULL, 2, "write to %s failed, errno=%d\n", path, errno); + (void)close(fd); return -1; + } + (void)close(fd); return 0; } -- 2.41.0