From 56679afd67ba2706387407ea258eb0d2413c0c1e Mon Sep 17 00:00:00 2001 From: Yunfeng Ye Date: Sun, 10 Nov 2019 19:18:07 +0000 Subject: [PATCH 42/53] irqbalance: use process_one_line() instead of fscanf() The logic using fscanf() to get data from open file can be instead by process_one_line(), and provide two functions get_hex() and get_int() to convert string to integer. also use get_int() instead of get_offline_status() and get_packageid(). Signed-off-by: Yunfeng Ye --- classify.c | 27 ++++----------------------- cputree.c | 32 ++++++++++++++------------------ irqbalance.h | 2 ++ 3 files changed, 20 insertions(+), 41 deletions(-) diff --git a/classify.c b/classify.c index 5fb8233..90b0f30 100644 --- a/classify.c +++ b/classify.c @@ -187,20 +187,11 @@ static int map_pci_irq_class(unsigned int pci_class) static unsigned int read_pci_data(const char *devpath, const char* file) { char path[PATH_MAX]; - FILE *fd; unsigned int data = PCI_INVAL_DATA; sprintf(path, "%s/%s", devpath, file); - - fd = fopen(path, "r"); - - if (!fd) { - log(TO_CONSOLE, LOG_WARNING, "PCI: can't open file:%s\n", path); - return data; - } - - (void) fscanf(fd, "%x", &data); - fclose(fd); + if (process_one_line(path, get_hex, &data) < 0) + log(TO_CONSOLE, LOG_WARNING, "PCI: can't get from file:%s\n", path); return data; } @@ -349,7 +340,6 @@ static struct irq_info *add_one_irq_to_db(const char *devpath, struct irq_info * struct irq_info *new; int numa_node; char path[PATH_MAX]; - FILE *fd; GList *entry; /* @@ -394,11 +384,7 @@ get_numa_node: numa_node = NUMA_NO_NODE; if (devpath != NULL && numa_avail) { sprintf(path, "%s/numa_node", devpath); - fd = fopen(path, "r"); - if (fd) { - fscanf(fd, "%d", &numa_node); - fclose(fd); - } + process_one_line(path, get_int, &numa_node); } if (pol->numa_node_set == 1) @@ -619,7 +605,6 @@ static void build_one_dev_entry(const char *dirname, GList *tmp_irqs) { struct dirent *entry; DIR *msidir; - FILE *fd; int irqnum; struct irq_info *new, hint; char path[PATH_MAX]; @@ -661,10 +646,7 @@ static void build_one_dev_entry(const char *dirname, GList *tmp_irqs) } sprintf(path, "%s/%s/irq", SYSPCI_DIR, dirname); - fd = fopen(path, "r"); - if (!fd) - return; - if (fscanf(fd, "%d", &irqnum) < 0) + if (process_one_line(path, get_int, &irqnum) < 0) goto done; /* @@ -693,7 +675,6 @@ static void build_one_dev_entry(const char *dirname, GList *tmp_irqs) } done: - fclose(fd); return; } diff --git a/cputree.c b/cputree.c index 4c5fdf5..9aa4794 100644 --- a/cputree.c +++ b/cputree.c @@ -78,6 +78,16 @@ int process_one_line(char *path, void (*cb)(char *line, void *data), void *data) return ret; } +void get_hex(char *line, void *data) +{ + *(int *)data = strtoul(line, NULL, 16); +} + +void get_int(char *line, void *data) +{ + *(int *)data = strtoul(line, NULL, 10); +} + void get_mask_from_bitmap(char *line, void *mask) { cpumask_parse_user(line, strlen(line), *(cpumask_t *)mask); @@ -244,20 +254,6 @@ static struct topo_obj* add_cpu_to_cache_domain(struct topo_obj *cpu, return cache; } -static void get_offline_status(char *line, void *data) -{ - int *status = (int *)data; - - *status = (line && line[0] == '0') ? 1 : 0; -} - -static void get_packageid(char *line, void *data) -{ - int *packageid = (int *)data; - - *packageid = strtoul(line, NULL, 10); -} - #define ADJ_SIZE(r,s) PATH_MAX-strlen(r)-strlen(#s) static void do_one_cpu(char *path) { @@ -270,12 +266,12 @@ static void do_one_cpu(char *path) int nodeid; int packageid = 0; unsigned int max_cache_index, cache_index, cache_stat; - int offline_status = 0; + int online_status = 1; /* skip offline cpus */ snprintf(new_path, ADJ_SIZE(path,"/online"), "%s/online", path); - process_one_line(new_path, get_offline_status, &offline_status); - if (offline_status) + process_one_line(new_path, get_int, &online_status); + if (!online_status) return; cpu = calloc(1, sizeof(struct topo_obj)); @@ -315,7 +311,7 @@ static void do_one_cpu(char *path) /* try to read the package id */ snprintf(new_path, ADJ_SIZE(path, "/topology/physical_package_id"), "%s/topology/physical_package_id", path); - process_one_line(new_path, get_packageid, &packageid); + process_one_line(new_path, get_int, &packageid); /* try to read the cache mask; if it doesn't exist assume solitary */ /* We want the deepest cache level available */ diff --git a/irqbalance.h b/irqbalance.h index 900db9d..3e3ea5d 100644 --- a/irqbalance.h +++ b/irqbalance.h @@ -163,6 +163,8 @@ extern unsigned int log_mask; extern int process_one_line(char *path, void (*cb)(char *line, void *data), void *data); extern void get_mask_from_bitmap(char *line, void *mask); +extern void get_int(char *line, void *data); +extern void get_hex(char *line, void *data); #endif /* __INCLUDE_GUARD_IRQBALANCE_H_ */ -- 2.23.0