~ubuntu-branches/debian/squeeze/irqbalance/squeeze

« back to all changes in this revision

Viewing changes to debian/patches/01-cputree-parse.patch

  • Committer: Bazaar Package Importer
  • Author(s): Kyle McMartin
  • Date: 2009-03-10 14:41:18 UTC
  • Revision ID: james.westby@ubuntu.com-20090310144118-ivnubwmx6y8mgt6v
Tags: 0.55-3
* Ack NMUs.
* 01-cputree-parse.patch:
  - Patch from Fedora to fix issues with cpuidle file. (closes: 517183)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
diff -up irqbalance-0.55/irqbalance-0.55/cputree.c.orig irqbalance-0.55/irqbalance-0.55/cputree.c
 
2
--- irqbalance-0.55/irqbalance-0.55/cputree.c.orig      2006-12-10 15:04:59.000000000 -0500
 
3
+++ irqbalance-0.55/irqbalance-0.55/cputree.c   2007-09-28 12:43:35.000000000 -0400
 
4
@@ -26,6 +26,8 @@
 
5
 
 
6
 #define _GNU_SOURCE
 
7
 
 
8
+#include <ctype.h>
 
9
+#include <fcntl.h>
 
10
 #include <stdio.h>
 
11
 #include <stdlib.h>
 
12
 #include <unistd.h>
 
13
@@ -131,34 +133,30 @@ static void fill_cache_domain(void)
 
14
 }
 
15
 
 
16
 
 
17
-static void do_one_cpu(char *path)
 
18
+static void do_one_cpu(int dfd, char *d_name)
 
19
 {
 
20
        struct cpu_core *cpu;
 
21
        FILE *file;
 
22
        char new_path[PATH_MAX];
 
23
 
 
24
        /* skip offline cpus */
 
25
-       snprintf(new_path, PATH_MAX, "%s/online", path);
 
26
-       file = fopen(new_path, "r");
 
27
-       if (file) {
 
28
-               char *line = NULL;
 
29
-               size_t size = 0;
 
30
-               if (getline(&line, &size, file)==0)
 
31
+       snprintf(new_path, PATH_MAX, "%s/online", d_name);
 
32
+       int fd = openat(dfd, new_path, O_RDONLY);
 
33
+       if (fd != -1) {
 
34
+               char buf[1];
 
35
+               ssize_t n = read(fd, buf, sizeof(buf));
 
36
+               close(fd);
 
37
+               if (n != sizeof(buf))
 
38
                        return;
 
39
-               fclose(file);
 
40
-               if (line && line[0]=='0') {
 
41
-                       free(line);
 
42
+               if (buf[0] == '0')
 
43
                        return;
 
44
-               }
 
45
-               free(line);
 
46
        }
 
47
 
 
48
-       cpu = malloc(sizeof(struct cpu_core));
 
49
+       cpu = calloc(1, sizeof(struct cpu_core));
 
50
        if (!cpu)
 
51
                return;
 
52
-       memset(cpu, 0, sizeof(struct cpu_core));
 
53
 
 
54
-       cpu->number = strtoul(&path[27], NULL, 10);
 
55
+       cpu->number = strtoul(&d_name[3], NULL, 10);
 
56
        
 
57
        cpu_set(cpu->number, cpu->mask);
 
58
 
 
59
@@ -170,43 +168,45 @@ static void do_one_cpu(char *path)
 
60
                return;
 
61
        }
 
62
 
 
63
+       char *line = NULL;
 
64
+       size_t size = 0;
 
65
 
 
66
        /* try to read the package mask; if it doesn't exist assume solitary */
 
67
-       snprintf(new_path, PATH_MAX, "%s/topology/core_siblings", path);
 
68
-       file = fopen(new_path, "r");
 
69
+       snprintf(new_path, PATH_MAX, "%s/topology/core_siblings", d_name);
 
70
+       fd = openat(dfd, new_path, O_RDONLY);
 
71
+       file = fd == -1 ? NULL : fdopen(fd, "r");
 
72
        cpu_set(cpu->number, cpu->package_mask);
 
73
        if (file) {
 
74
-               char *line = NULL;
 
75
-               size_t size = 0;
 
76
                if (getline(&line, &size, file)) 
 
77
                        cpumask_parse_user(line, strlen(line), cpu->package_mask);
 
78
                fclose(file);
 
79
-               free(line);
 
80
-       }
 
81
+       } else if (fd != -1)
 
82
+               close(fd);
 
83
 
 
84
        /* try to read the cache mask; if it doesn't exist assume solitary */
 
85
        /* We want the deepest cache level available so try index1 first, then index2 */
 
86
        cpu_set(cpu->number, cpu->cache_mask);
 
87
-       snprintf(new_path, PATH_MAX, "%s/cache/index1/shared_cpu_map", path);
 
88
-       file = fopen(new_path, "r");
 
89
+       snprintf(new_path, PATH_MAX, "%s/cache/index1/shared_cpu_map", d_name);
 
90
+       fd = openat(dfd, new_path, O_RDONLY);
 
91
+       file = fd == -1 ? NULL : fdopen(fd, "r");
 
92
        if (file) {
 
93
-               char *line = NULL;
 
94
-               size_t size = 0;
 
95
                if (getline(&line, &size, file)) 
 
96
                        cpumask_parse_user(line, strlen(line), cpu->cache_mask);
 
97
                fclose(file);
 
98
-               free(line);
 
99
-       }
 
100
-       snprintf(new_path, PATH_MAX, "%s/cache/index2/shared_cpu_map", path);
 
101
-       file = fopen(new_path, "r");
 
102
+       } else if (fd != -1)
 
103
+               close(fd);
 
104
+
 
105
+       snprintf(new_path, PATH_MAX, "%s/cache/index2/shared_cpu_map", d_name);
 
106
+       fd = openat(dfd, new_path, O_RDONLY);
 
107
+       file = fd == -1 ? NULL : fdopen(fd, "r");
 
108
        if (file) {
 
109
-               char *line = NULL;
 
110
-               size_t size = 0;
 
111
                if (getline(&line, &size, file)) 
 
112
                        cpumask_parse_user(line, strlen(line), cpu->cache_mask);
 
113
                fclose(file);
 
114
-               free(line);
 
115
-       }
 
116
+       } else if (fd != -1)
 
117
+               close(fd);
 
118
+
 
119
+       free(line);
 
120
 
 
121
        /* 
 
122
           blank out the banned cpus from the various masks so that interrupts
 
123
@@ -311,18 +311,19 @@ void parse_cpu_tree(void)
 
124
 {
 
125
        DIR *dir;
 
126
        struct dirent *entry;
 
127
+       int dfd;
 
128
 
 
129
        cpus_complement(unbanned_cpus, banned_cpus);
 
130
 
 
131
        dir = opendir("/sys/devices/system/cpu");
 
132
        if (!dir)
 
133
                return;
 
134
+       dfd = dirfd(dir);
 
135
        do {
 
136
                entry = readdir(dir);
 
137
-                if (entry && strlen(entry->d_name)>3 && strstr(entry->d_name,"cpu")) {
 
138
-                       char new_path[PATH_MAX];
 
139
-                       sprintf(new_path, "/sys/devices/system/cpu/%s", entry->d_name);
 
140
-                       do_one_cpu(new_path);
 
141
+                if (entry && strlen(entry->d_name)>3 && memcmp(entry->d_name,"cpu",3) == 0
 
142
+                   && isdigit(entry->d_name[3])) {
 
143
+                       do_one_cpu(dfd, entry->d_name);
 
144
                }
 
145
        } while (entry);
 
146
        closedir(dir);