summaryrefslogtreecommitdiffstats
path: root/meta/recipes-extended/procps/procps-3.2.8/procps-3.2.7-top-remcpu.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta/recipes-extended/procps/procps-3.2.8/procps-3.2.7-top-remcpu.patch')
-rw-r--r--meta/recipes-extended/procps/procps-3.2.8/procps-3.2.7-top-remcpu.patch111
1 files changed, 111 insertions, 0 deletions
diff --git a/meta/recipes-extended/procps/procps-3.2.8/procps-3.2.7-top-remcpu.patch b/meta/recipes-extended/procps/procps-3.2.8/procps-3.2.7-top-remcpu.patch
new file mode 100644
index 0000000000..0306c8d639
--- /dev/null
+++ b/meta/recipes-extended/procps/procps-3.2.8/procps-3.2.7-top-remcpu.patch
@@ -0,0 +1,111 @@
1Upstream-Status: Pending
2
3fix that top will quit after cpu offline
4
5top utiliy fails to read /proc/stat after cpu offline, because Cpu_tot
6is still the original cpu numbers when calling cpus_refresh, in which
7it is trying to read and sscanf Cpu_tot times /proc/stat.
8
9The patch is from procps-3.2.8-2.fc12.src.rpm
10
11Signed-off-by: Wenzong Fan <wenzong.fan@windriver.com>
12
13---
14--- procps-3.2.7/top.c.remcpu 2006-07-10 10:41:11.000000000 +0200
15+++ procps-3.2.7/top.c 2006-07-10 10:41:35.000000000 +0200
16@@ -912,6 +912,7 @@
17 static CPU_t *cpus_refresh (CPU_t *cpus)
18 {
19 static FILE *fp = NULL;
20+ static int cpu_max;
21 int i;
22 int num;
23 // enough for a /proc/stat CPU line (not the intr line)
24@@ -926,24 +927,29 @@
25 can hold tics representing the /proc/stat cpu summary (the first
26 line read) -- that slot supports our View_CPUSUM toggle */
27 cpus = alloc_c((1 + Cpu_tot) * sizeof(CPU_t));
28+ cpu_max = Cpu_tot;
29 }
30+ else if (cpu_max > Cpu_tot)
31+ /* move saved CUPs summary to cpu_max possition */
32+ memcpy(&cpus[cpu_max], &cpus[Cpu_tot], sizeof(CPU_t));
33+
34 rewind(fp);
35 fflush(fp);
36
37 // first value the last slot with the cpu summary line
38 if (!fgets(buf, sizeof(buf), fp)) std_err("failed /proc/stat read");
39- cpus[Cpu_tot].x = 0; // FIXME: can't tell by kernel version number
40- cpus[Cpu_tot].y = 0; // FIXME: can't tell by kernel version number
41- cpus[Cpu_tot].z = 0; // FIXME: can't tell by kernel version number
42+ cpus[cpu_max].x = 0; // FIXME: can't tell by kernel version number
43+ cpus[cpu_max].y = 0; // FIXME: can't tell by kernel version number
44+ cpus[cpu_max].z = 0; // FIXME: can't tell by kernel version number
45 num = sscanf(buf, "cpu %Lu %Lu %Lu %Lu %Lu %Lu %Lu %Lu",
46- &cpus[Cpu_tot].u,
47- &cpus[Cpu_tot].n,
48- &cpus[Cpu_tot].s,
49- &cpus[Cpu_tot].i,
50- &cpus[Cpu_tot].w,
51- &cpus[Cpu_tot].x,
52- &cpus[Cpu_tot].y,
53- &cpus[Cpu_tot].z
54+ &cpus[cpu_max].u,
55+ &cpus[cpu_max].n,
56+ &cpus[cpu_max].s,
57+ &cpus[cpu_max].i,
58+ &cpus[cpu_max].w,
59+ &cpus[cpu_max].x,
60+ &cpus[cpu_max].y,
61+ &cpus[cpu_max].z
62 );
63 if (num < 4)
64 std_err("failed /proc/stat read");
65@@ -955,7 +961,7 @@
66 }
67
68 // now value each separate cpu's tics
69- for (i = 0; 1 < Cpu_tot && i < Cpu_tot; i++) {
70+ for (i = 0; ; i++) {
71 if (!fgets(buf, sizeof(buf), fp)) std_err("failed /proc/stat read");
72 cpus[i].x = 0; // FIXME: can't tell by kernel version number
73 cpus[i].y = 0; // FIXME: can't tell by kernel version number
74@@ -964,9 +970,35 @@
75 &cpus[i].id,
76 &cpus[i].u, &cpus[i].n, &cpus[i].s, &cpus[i].i, &cpus[i].w, &cpus[i].x, &cpus[i].y, &cpus[i].z
77 );
78- if (num < 4)
79- std_err("failed /proc/stat read");
80+ if (num < 4) {
81+ Cpu_tot = i;
82+ break;
83+ }
84+ if (i == cpu_max - 1) {
85+ // Bump cpu_max and extend cpus
86+ cpu_max++;
87+ cpus = realloc(cpus, (1 + cpu_max) * sizeof(CPU_t));
88+ if (!cpus) std_err("realloc failed");
89+ memcpy(&cpus[cpu_max], &cpus[cpu_max-1], sizeof(CPU_t));
90+ }
91+ }
92+
93+ if (cpu_max > Cpu_tot)
94+ memcpy(&cpus[Cpu_tot], &cpus[cpu_max], sizeof(CPU_t));
95+
96+ // and just in case we're 2.2.xx compiled without SMP support...
97+ if (Cpu_tot == 1) {
98+ cpus[0].id = cpus[1].id = 0;
99+ cpus[0].u = cpus[1].u;
100+ cpus[0].n = cpus[1].n;
101+ cpus[0].s = cpus[1].s;
102+ cpus[0].i = cpus[1].i;
103+ cpus[0].w = cpus[1].w;
104+ cpus[0].x = cpus[1].x;
105+ cpus[0].y = cpus[1].y;
106+ cpus[0].z = cpus[1].z;
107 }
108+
109 return cpus;
110 }
111