]> git.pld-linux.org Git - packages/irqbalance.git/commitdiff
- from fc
authorArkadiusz Miśkiewicz <arekm@maven.pl>
Fri, 13 Mar 2009 19:31:54 +0000 (19:31 +0000)
committercvs2git <feedback@pld-linux.org>
Sun, 24 Jun 2012 12:13:13 +0000 (12:13 +0000)
Changed files:
    irqbalance-cputree-parse.patch -> 1.1

irqbalance-cputree-parse.patch [new file with mode: 0644]

diff --git a/irqbalance-cputree-parse.patch b/irqbalance-cputree-parse.patch
new file mode 100644 (file)
index 0000000..6ae74b7
--- /dev/null
@@ -0,0 +1,146 @@
+diff -up irqbalance-0.55/irqbalance-0.55/cputree.c.orig irqbalance-0.55/irqbalance-0.55/cputree.c
+--- irqbalance-0.55/irqbalance-0.55/cputree.c.orig     2006-12-10 15:04:59.000000000 -0500
++++ irqbalance-0.55/irqbalance-0.55/cputree.c  2007-09-28 12:43:35.000000000 -0400
+@@ -26,6 +26,8 @@
+ #define _GNU_SOURCE
++#include <ctype.h>
++#include <fcntl.h>
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <unistd.h>
+@@ -131,34 +133,30 @@ static void fill_cache_domain(void)
+ }
+-static void do_one_cpu(char *path)
++static void do_one_cpu(int dfd, char *d_name)
+ {
+       struct cpu_core *cpu;
+       FILE *file;
+       char new_path[PATH_MAX];
+       /* skip offline cpus */
+-      snprintf(new_path, PATH_MAX, "%s/online", path);
+-      file = fopen(new_path, "r");
+-      if (file) {
+-              char *line = NULL;
+-              size_t size = 0;
+-              if (getline(&line, &size, file)==0)
++      snprintf(new_path, PATH_MAX, "%s/online", d_name);
++      int fd = openat(dfd, new_path, O_RDONLY);
++      if (fd != -1) {
++              char buf[1];
++              ssize_t n = read(fd, buf, sizeof(buf));
++              close(fd);
++              if (n != sizeof(buf))
+                       return;
+-              fclose(file);
+-              if (line && line[0]=='0') {
+-                      free(line);
++              if (buf[0] == '0')
+                       return;
+-              }
+-              free(line);
+       }
+-      cpu = malloc(sizeof(struct cpu_core));
++      cpu = calloc(1, sizeof(struct cpu_core));
+       if (!cpu)
+               return;
+-      memset(cpu, 0, sizeof(struct cpu_core));
+-      cpu->number = strtoul(&path[27], NULL, 10);
++      cpu->number = strtoul(&d_name[3], NULL, 10);
+       
+       cpu_set(cpu->number, cpu->mask);
+@@ -170,43 +168,45 @@ static void do_one_cpu(char *path)
+               return;
+       }
++      char *line = NULL;
++      size_t size = 0;
+       /* try to read the package mask; if it doesn't exist assume solitary */
+-      snprintf(new_path, PATH_MAX, "%s/topology/core_siblings", path);
+-      file = fopen(new_path, "r");
++      snprintf(new_path, PATH_MAX, "%s/topology/core_siblings", d_name);
++      fd = openat(dfd, new_path, O_RDONLY);
++      file = fd == -1 ? NULL : fdopen(fd, "r");
+       cpu_set(cpu->number, cpu->package_mask);
+       if (file) {
+-              char *line = NULL;
+-              size_t size = 0;
+               if (getline(&line, &size, file)) 
+                       cpumask_parse_user(line, strlen(line), cpu->package_mask);
+               fclose(file);
+-              free(line);
+-      }
++      } else if (fd != -1)
++              close(fd);
+       /* try to read the cache mask; if it doesn't exist assume solitary */
+       /* We want the deepest cache level available so try index1 first, then index2 */
+       cpu_set(cpu->number, cpu->cache_mask);
+-      snprintf(new_path, PATH_MAX, "%s/cache/index1/shared_cpu_map", path);
+-      file = fopen(new_path, "r");
++      snprintf(new_path, PATH_MAX, "%s/cache/index1/shared_cpu_map", d_name);
++      fd = openat(dfd, new_path, O_RDONLY);
++      file = fd == -1 ? NULL : fdopen(fd, "r");
+       if (file) {
+-              char *line = NULL;
+-              size_t size = 0;
+               if (getline(&line, &size, file)) 
+                       cpumask_parse_user(line, strlen(line), cpu->cache_mask);
+               fclose(file);
+-              free(line);
+-      }
+-      snprintf(new_path, PATH_MAX, "%s/cache/index2/shared_cpu_map", path);
+-      file = fopen(new_path, "r");
++      } else if (fd != -1)
++              close(fd);
++
++      snprintf(new_path, PATH_MAX, "%s/cache/index2/shared_cpu_map", d_name);
++      fd = openat(dfd, new_path, O_RDONLY);
++      file = fd == -1 ? NULL : fdopen(fd, "r");
+       if (file) {
+-              char *line = NULL;
+-              size_t size = 0;
+               if (getline(&line, &size, file)) 
+                       cpumask_parse_user(line, strlen(line), cpu->cache_mask);
+               fclose(file);
+-              free(line);
+-      }
++      } else if (fd != -1)
++              close(fd);
++
++      free(line);
+       /* 
+          blank out the banned cpus from the various masks so that interrupts
+@@ -311,18 +311,19 @@ void parse_cpu_tree(void)
+ {
+       DIR *dir;
+       struct dirent *entry;
++      int dfd;
+       cpus_complement(unbanned_cpus, banned_cpus);
+       dir = opendir("/sys/devices/system/cpu");
+       if (!dir)
+               return;
++      dfd = dirfd(dir);
+       do {
+               entry = readdir(dir);
+-                if (entry && strlen(entry->d_name)>3 && strstr(entry->d_name,"cpu")) {
+-                      char new_path[PATH_MAX];
+-                      sprintf(new_path, "/sys/devices/system/cpu/%s", entry->d_name);
+-                      do_one_cpu(new_path);
++                if (entry && strlen(entry->d_name)>3 && memcmp(entry->d_name,"cpu",3) == 0
++                  && isdigit(entry->d_name[3])) {
++                      do_one_cpu(dfd, entry->d_name);
+               }
+       } while (entry);
+       closedir(dir);  
This page took 0.031712 seconds and 4 git commands to generate.