Annotation of /trunk/kernel26-xen/patches-2.6.25-r1/1030-2.6.25-xen-patch-2.6.25-rc8-rc9.patch
Parent Directory | Revision Log
Revision 609 -
(hide annotations)
(download)
Fri May 23 17:35:37 2008 UTC (16 years, 4 months ago) by niro
File size: 4646 byte(s)
Fri May 23 17:35:37 2008 UTC (16 years, 4 months ago) by niro
File size: 4646 byte(s)
-using opensuse xen patchset, updated kernel configs
1 | niro | 609 | From: Greg Kroah-Hartman <gregkh@suse.de> |
2 | Subject: Linux 2.6.25-rc9 | ||
3 | |||
4 | Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> | ||
5 | |||
6 | Automatically created from "patches.kernel.org/patch-2.6.25-rc8-rc9" by xen-port-patches.py | ||
7 | Acked-by: jbeulich@novell.com | ||
8 | |||
9 | Index: head-2008-04-15/arch/x86/kernel/process_32-xen.c | ||
10 | =================================================================== | ||
11 | --- head-2008-04-15.orig/arch/x86/kernel/process_32-xen.c 2008-04-15 10:47:33.000000000 +0200 | ||
12 | +++ head-2008-04-15/arch/x86/kernel/process_32-xen.c 2008-04-15 10:47:44.000000000 +0200 | ||
13 | @@ -86,7 +86,6 @@ unsigned long thread_saved_pc(struct tas | ||
14 | */ | ||
15 | void (*pm_idle)(void); | ||
16 | EXPORT_SYMBOL(pm_idle); | ||
17 | -static DEFINE_PER_CPU(unsigned int, cpu_idle_state); | ||
18 | |||
19 | void disable_hlt(void) | ||
20 | { | ||
21 | @@ -177,9 +176,6 @@ void cpu_idle(void) | ||
22 | while (!need_resched()) { | ||
23 | void (*idle)(void); | ||
24 | |||
25 | - if (__get_cpu_var(cpu_idle_state)) | ||
26 | - __get_cpu_var(cpu_idle_state) = 0; | ||
27 | - | ||
28 | check_pgt_cache(); | ||
29 | rmb(); | ||
30 | idle = xen_idle; /* no alternatives */ | ||
31 | @@ -204,40 +200,19 @@ static void do_nothing(void *unused) | ||
32 | { | ||
33 | } | ||
34 | |||
35 | +/* | ||
36 | + * cpu_idle_wait - Used to ensure that all the CPUs discard old value of | ||
37 | + * pm_idle and update to new pm_idle value. Required while changing pm_idle | ||
38 | + * handler on SMP systems. | ||
39 | + * | ||
40 | + * Caller must have changed pm_idle to the new value before the call. Old | ||
41 | + * pm_idle value will not be used by any CPU after the return of this function. | ||
42 | + */ | ||
43 | void cpu_idle_wait(void) | ||
44 | { | ||
45 | - unsigned int cpu, this_cpu = get_cpu(); | ||
46 | - cpumask_t map, tmp = current->cpus_allowed; | ||
47 | - | ||
48 | - set_cpus_allowed(current, cpumask_of_cpu(this_cpu)); | ||
49 | - put_cpu(); | ||
50 | - | ||
51 | - cpus_clear(map); | ||
52 | - for_each_online_cpu(cpu) { | ||
53 | - per_cpu(cpu_idle_state, cpu) = 1; | ||
54 | - cpu_set(cpu, map); | ||
55 | - } | ||
56 | - | ||
57 | - __get_cpu_var(cpu_idle_state) = 0; | ||
58 | - | ||
59 | - wmb(); | ||
60 | - do { | ||
61 | - ssleep(1); | ||
62 | - for_each_online_cpu(cpu) { | ||
63 | - if (cpu_isset(cpu, map) && !per_cpu(cpu_idle_state, cpu)) | ||
64 | - cpu_clear(cpu, map); | ||
65 | - } | ||
66 | - cpus_and(map, map, cpu_online_map); | ||
67 | - /* | ||
68 | - * We waited 1 sec, if a CPU still did not call idle | ||
69 | - * it may be because it is in idle and not waking up | ||
70 | - * because it has nothing to do. | ||
71 | - * Give all the remaining CPUS a kick. | ||
72 | - */ | ||
73 | - smp_call_function_mask(map, do_nothing, NULL, 0); | ||
74 | - } while (!cpus_empty(map)); | ||
75 | - | ||
76 | - set_cpus_allowed(current, tmp); | ||
77 | + smp_mb(); | ||
78 | + /* kick all the CPUs so that they exit out of pm_idle */ | ||
79 | + smp_call_function(do_nothing, NULL, 0, 1); | ||
80 | } | ||
81 | EXPORT_SYMBOL_GPL(cpu_idle_wait); | ||
82 | |||
83 | Index: head-2008-04-15/arch/x86/kernel/process_64-xen.c | ||
84 | =================================================================== | ||
85 | --- head-2008-04-15.orig/arch/x86/kernel/process_64-xen.c 2008-04-15 10:47:33.000000000 +0200 | ||
86 | +++ head-2008-04-15/arch/x86/kernel/process_64-xen.c 2008-04-15 10:47:44.000000000 +0200 | ||
87 | @@ -72,7 +72,6 @@ EXPORT_SYMBOL(boot_option_idle_override) | ||
88 | */ | ||
89 | void (*pm_idle)(void); | ||
90 | EXPORT_SYMBOL(pm_idle); | ||
91 | -static DEFINE_PER_CPU(unsigned int, cpu_idle_state); | ||
92 | |||
93 | static ATOMIC_NOTIFIER_HEAD(idle_notifier); | ||
94 | |||
95 | @@ -171,9 +170,6 @@ void cpu_idle(void) | ||
96 | while (!need_resched()) { | ||
97 | void (*idle)(void); | ||
98 | |||
99 | - if (__get_cpu_var(cpu_idle_state)) | ||
100 | - __get_cpu_var(cpu_idle_state) = 0; | ||
101 | - | ||
102 | rmb(); | ||
103 | idle = xen_idle; /* no alternatives */ | ||
104 | if (cpu_is_offline(smp_processor_id())) | ||
105 | @@ -203,40 +199,19 @@ static void do_nothing(void *unused) | ||
106 | { | ||
107 | } | ||
108 | |||
109 | +/* | ||
110 | + * cpu_idle_wait - Used to ensure that all the CPUs discard old value of | ||
111 | + * pm_idle and update to new pm_idle value. Required while changing pm_idle | ||
112 | + * handler on SMP systems. | ||
113 | + * | ||
114 | + * Caller must have changed pm_idle to the new value before the call. Old | ||
115 | + * pm_idle value will not be used by any CPU after the return of this function. | ||
116 | + */ | ||
117 | void cpu_idle_wait(void) | ||
118 | { | ||
119 | - unsigned int cpu, this_cpu = get_cpu(); | ||
120 | - cpumask_t map, tmp = current->cpus_allowed; | ||
121 | - | ||
122 | - set_cpus_allowed(current, cpumask_of_cpu(this_cpu)); | ||
123 | - put_cpu(); | ||
124 | - | ||
125 | - cpus_clear(map); | ||
126 | - for_each_online_cpu(cpu) { | ||
127 | - per_cpu(cpu_idle_state, cpu) = 1; | ||
128 | - cpu_set(cpu, map); | ||
129 | - } | ||
130 | - | ||
131 | - __get_cpu_var(cpu_idle_state) = 0; | ||
132 | - | ||
133 | - wmb(); | ||
134 | - do { | ||
135 | - ssleep(1); | ||
136 | - for_each_online_cpu(cpu) { | ||
137 | - if (cpu_isset(cpu, map) && !per_cpu(cpu_idle_state, cpu)) | ||
138 | - cpu_clear(cpu, map); | ||
139 | - } | ||
140 | - cpus_and(map, map, cpu_online_map); | ||
141 | - /* | ||
142 | - * We waited 1 sec, if a CPU still did not call idle | ||
143 | - * it may be because it is in idle and not waking up | ||
144 | - * because it has nothing to do. | ||
145 | - * Give all the remaining CPUS a kick. | ||
146 | - */ | ||
147 | - smp_call_function_mask(map, do_nothing, 0, 0); | ||
148 | - } while (!cpus_empty(map)); | ||
149 | - | ||
150 | - set_cpus_allowed(current, tmp); | ||
151 | + smp_mb(); | ||
152 | + /* kick all the CPUs so that they exit out of pm_idle */ | ||
153 | + smp_call_function(do_nothing, NULL, 0, 1); | ||
154 | } | ||
155 | EXPORT_SYMBOL_GPL(cpu_idle_wait); | ||
156 |