aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorYinghai Lu <yinghai@kernel.org>2009-01-30 20:29:27 -0500
committerIngo Molnar <mingo@elte.hu>2009-02-05 16:27:56 -0500
commitc5e954820335ef5aed1662b70aaf5deb9de16735 (patch)
tree0517328a865ac68646f30981f5a1ca9763af1aac /arch
parentfdbecd9fd14198853bec4cbae8bc7af93f2e3de3 (diff)
x86: move default_ipi_xx back to ipi.c
Impact: cleanup only leave _default_ipi_xx etc in .h Beyond the cleanup factor, this saves a bit of code size as well: text data bss dec hex filename 7281931 1630144 1463304 10375379 9e50d3 vmlinux.before 7281753 1630144 1463304 10375201 9e5021 vmlinux.after Signed-off-by: Yinghai Lu <yinghai@kernel.org> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch')
-rw-r--r--arch/x86/include/asm/hw_irq.h6
-rw-r--r--arch/x86/include/asm/ipi.h127
-rw-r--r--arch/x86/kernel/ipi.c108
3 files changed, 121 insertions, 120 deletions
diff --git a/arch/x86/include/asm/hw_irq.h b/arch/x86/include/asm/hw_irq.h
index 3ef2bded97ac..1a20e3d12006 100644
--- a/arch/x86/include/asm/hw_irq.h
+++ b/arch/x86/include/asm/hw_irq.h
@@ -71,12 +71,6 @@ extern void setup_ioapic_dest(void);
71extern void enable_IO_APIC(void); 71extern void enable_IO_APIC(void);
72#endif 72#endif
73 73
74/* IPI functions */
75#ifdef CONFIG_X86_32
76extern void default_send_IPI_self(int vector);
77#endif
78extern void default_send_IPI(int dest, int vector);
79
80/* Statistics */ 74/* Statistics */
81extern atomic_t irq_err_count; 75extern atomic_t irq_err_count;
82extern atomic_t irq_mis_count; 76extern atomic_t irq_mis_count;
diff --git a/arch/x86/include/asm/ipi.h b/arch/x86/include/asm/ipi.h
index aa79945445b5..5f2efc5d9927 100644
--- a/arch/x86/include/asm/ipi.h
+++ b/arch/x86/include/asm/ipi.h
@@ -119,112 +119,22 @@ static inline void
119 native_apic_mem_write(APIC_ICR, cfg); 119 native_apic_mem_write(APIC_ICR, cfg);
120} 120}
121 121
122static inline void 122extern void default_send_IPI_mask_sequence_phys(const struct cpumask *mask,
123default_send_IPI_mask_sequence_phys(const struct cpumask *mask, int vector) 123 int vector);
124{ 124extern void default_send_IPI_mask_allbutself_phys(const struct cpumask *mask,
125 unsigned long query_cpu; 125 int vector);
126 unsigned long flags;
127
128 /*
129 * Hack. The clustered APIC addressing mode doesn't allow us to send
130 * to an arbitrary mask, so I do a unicast to each CPU instead.
131 * - mbligh
132 */
133 local_irq_save(flags);
134 for_each_cpu(query_cpu, mask) {
135 __default_send_IPI_dest_field(per_cpu(x86_cpu_to_apicid,
136 query_cpu), vector, APIC_DEST_PHYSICAL);
137 }
138 local_irq_restore(flags);
139}
140
141static inline void
142default_send_IPI_mask_allbutself_phys(const struct cpumask *mask, int vector)
143{
144 unsigned int this_cpu = smp_processor_id();
145 unsigned int query_cpu;
146 unsigned long flags;
147
148 /* See Hack comment above */
149
150 local_irq_save(flags);
151 for_each_cpu(query_cpu, mask) {
152 if (query_cpu == this_cpu)
153 continue;
154 __default_send_IPI_dest_field(per_cpu(x86_cpu_to_apicid,
155 query_cpu), vector, APIC_DEST_PHYSICAL);
156 }
157 local_irq_restore(flags);
158}
159
160#include <asm/genapic.h> 126#include <asm/genapic.h>
161 127
162static inline void 128extern void default_send_IPI_mask_sequence_logical(const struct cpumask *mask,
163default_send_IPI_mask_sequence_logical(const struct cpumask *mask, int vector) 129 int vector);
164{ 130extern void default_send_IPI_mask_allbutself_logical(const struct cpumask *mask,
165 unsigned long flags; 131 int vector);
166 unsigned int query_cpu;
167
168 /*
169 * Hack. The clustered APIC addressing mode doesn't allow us to send
170 * to an arbitrary mask, so I do a unicasts to each CPU instead. This
171 * should be modified to do 1 message per cluster ID - mbligh
172 */
173
174 local_irq_save(flags);
175 for_each_cpu(query_cpu, mask)
176 __default_send_IPI_dest_field(
177 apic->cpu_to_logical_apicid(query_cpu), vector,
178 apic->dest_logical);
179 local_irq_restore(flags);
180}
181
182static inline void
183default_send_IPI_mask_allbutself_logical(const struct cpumask *mask, int vector)
184{
185 unsigned long flags;
186 unsigned int query_cpu;
187 unsigned int this_cpu = smp_processor_id();
188
189 /* See Hack comment above */
190
191 local_irq_save(flags);
192 for_each_cpu(query_cpu, mask) {
193 if (query_cpu == this_cpu)
194 continue;
195 __default_send_IPI_dest_field(
196 apic->cpu_to_logical_apicid(query_cpu), vector,
197 apic->dest_logical);
198 }
199 local_irq_restore(flags);
200}
201 132
202/* Avoid include hell */ 133/* Avoid include hell */
203#define NMI_VECTOR 0x02 134#define NMI_VECTOR 0x02
204 135
205extern int no_broadcast; 136extern int no_broadcast;
206 137
207#ifndef CONFIG_X86_64
208/*
209 * This is only used on smaller machines.
210 */
211static inline void default_send_IPI_mask_bitmask_logical(const struct cpumask *cpumask, int vector)
212{
213 unsigned long mask = cpumask_bits(cpumask)[0];
214 unsigned long flags;
215
216 local_irq_save(flags);
217 WARN_ON(mask & ~cpumask_bits(cpu_online_mask)[0]);
218 __default_send_IPI_dest_field(mask, vector, apic->dest_logical);
219 local_irq_restore(flags);
220}
221
222static inline void default_send_IPI_mask_logical(const struct cpumask *mask, int vector)
223{
224 default_send_IPI_mask_bitmask_logical(mask, vector);
225}
226#endif
227
228static inline void __default_local_send_IPI_allbutself(int vector) 138static inline void __default_local_send_IPI_allbutself(int vector)
229{ 139{
230 if (no_broadcast || vector == NMI_VECTOR) 140 if (no_broadcast || vector == NMI_VECTOR)
@@ -242,22 +152,11 @@ static inline void __default_local_send_IPI_all(int vector)
242} 152}
243 153
244#ifdef CONFIG_X86_32 154#ifdef CONFIG_X86_32
245static inline void default_send_IPI_allbutself(int vector) 155extern void default_send_IPI_mask_logical(const struct cpumask *mask,
246{ 156 int vector);
247 /* 157extern void default_send_IPI_allbutself(int vector);
248 * if there are no other CPUs in the system then we get an APIC send 158extern void default_send_IPI_all(int vector);
249 * error if we try to broadcast, thus avoid sending IPIs in this case. 159extern void default_send_IPI_self(int vector);
250 */
251 if (!(num_online_cpus() > 1))
252 return;
253
254 __default_local_send_IPI_allbutself(vector);
255}
256
257static inline void default_send_IPI_all(int vector)
258{
259 __default_local_send_IPI_all(vector);
260}
261#endif 160#endif
262 161
263#endif 162#endif
diff --git a/arch/x86/kernel/ipi.c b/arch/x86/kernel/ipi.c
index 339f4f3feee5..dbf5445727a9 100644
--- a/arch/x86/kernel/ipi.c
+++ b/arch/x86/kernel/ipi.c
@@ -19,8 +19,116 @@
19#include <asm/proto.h> 19#include <asm/proto.h>
20#include <asm/ipi.h> 20#include <asm/ipi.h>
21 21
22void default_send_IPI_mask_sequence_phys(const struct cpumask *mask, int vector)
23{
24 unsigned long query_cpu;
25 unsigned long flags;
26
27 /*
28 * Hack. The clustered APIC addressing mode doesn't allow us to send
29 * to an arbitrary mask, so I do a unicast to each CPU instead.
30 * - mbligh
31 */
32 local_irq_save(flags);
33 for_each_cpu(query_cpu, mask) {
34 __default_send_IPI_dest_field(per_cpu(x86_cpu_to_apicid,
35 query_cpu), vector, APIC_DEST_PHYSICAL);
36 }
37 local_irq_restore(flags);
38}
39
40void default_send_IPI_mask_allbutself_phys(const struct cpumask *mask,
41 int vector)
42{
43 unsigned int this_cpu = smp_processor_id();
44 unsigned int query_cpu;
45 unsigned long flags;
46
47 /* See Hack comment above */
48
49 local_irq_save(flags);
50 for_each_cpu(query_cpu, mask) {
51 if (query_cpu == this_cpu)
52 continue;
53 __default_send_IPI_dest_field(per_cpu(x86_cpu_to_apicid,
54 query_cpu), vector, APIC_DEST_PHYSICAL);
55 }
56 local_irq_restore(flags);
57}
58
59void default_send_IPI_mask_sequence_logical(const struct cpumask *mask,
60 int vector)
61{
62 unsigned long flags;
63 unsigned int query_cpu;
64
65 /*
66 * Hack. The clustered APIC addressing mode doesn't allow us to send
67 * to an arbitrary mask, so I do a unicasts to each CPU instead. This
68 * should be modified to do 1 message per cluster ID - mbligh
69 */
70
71 local_irq_save(flags);
72 for_each_cpu(query_cpu, mask)
73 __default_send_IPI_dest_field(
74 apic->cpu_to_logical_apicid(query_cpu), vector,
75 apic->dest_logical);
76 local_irq_restore(flags);
77}
78
79void default_send_IPI_mask_allbutself_logical(const struct cpumask *mask,
80 int vector)
81{
82 unsigned long flags;
83 unsigned int query_cpu;
84 unsigned int this_cpu = smp_processor_id();
85
86 /* See Hack comment above */
87
88 local_irq_save(flags);
89 for_each_cpu(query_cpu, mask) {
90 if (query_cpu == this_cpu)
91 continue;
92 __default_send_IPI_dest_field(
93 apic->cpu_to_logical_apicid(query_cpu), vector,
94 apic->dest_logical);
95 }
96 local_irq_restore(flags);
97}
98
22#ifdef CONFIG_X86_32 99#ifdef CONFIG_X86_32
23 100
101/*
102 * This is only used on smaller machines.
103 */
104void default_send_IPI_mask_logical(const struct cpumask *cpumask, int vector)
105{
106 unsigned long mask = cpumask_bits(cpumask)[0];
107 unsigned long flags;
108
109 local_irq_save(flags);
110 WARN_ON(mask & ~cpumask_bits(cpu_online_mask)[0]);
111 __default_send_IPI_dest_field(mask, vector, apic->dest_logical);
112 local_irq_restore(flags);
113}
114
115void default_send_IPI_allbutself(int vector)
116{
117 /*
118 * if there are no other CPUs in the system then we get an APIC send
119 * error if we try to broadcast, thus avoid sending IPIs in this case.
120 */
121 if (!(num_online_cpus() > 1))
122 return;
123
124 __default_local_send_IPI_allbutself(vector);
125}
126
127void default_send_IPI_all(int vector)
128{
129 __default_local_send_IPI_all(vector);
130}
131
24void default_send_IPI_self(int vector) 132void default_send_IPI_self(int vector)
25{ 133{
26 __default_send_IPI_shortcut(APIC_DEST_SELF, vector, apic->dest_logical); 134 __default_send_IPI_shortcut(APIC_DEST_SELF, vector, apic->dest_logical);