diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2017-09-13 17:29:41 -0400 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2017-09-25 14:51:58 -0400 |
commit | 8d1e3dca7de6e8513872799a748a1d47d8dce60d (patch) | |
tree | 4c327c35569f939f32c5dd5ce201066081fda0f8 | |
parent | 8ed4f3e66665cd186bc6b1d35f25a481e35c62ab (diff) |
x86/vector: Add tracepoints for vector management
Add tracepoints for analysing the new vector management
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Tested-by: Juergen Gross <jgross@suse.com>
Tested-by: Yu Chen <yu.c.chen@intel.com>
Acked-by: Juergen Gross <jgross@suse.com>
Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Cc: Tony Luck <tony.luck@intel.com>
Cc: Marc Zyngier <marc.zyngier@arm.com>
Cc: Alok Kataria <akataria@vmware.com>
Cc: Joerg Roedel <joro@8bytes.org>
Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Rui Zhang <rui.zhang@intel.com>
Cc: "K. Y. Srinivasan" <kys@microsoft.com>
Cc: Arjan van de Ven <arjan@linux.intel.com>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Len Brown <lenb@kernel.org>
Link: https://lkml.kernel.org/r/20170913213155.357986795@linutronix.de
-rw-r--r-- | arch/x86/include/asm/trace/irq_vectors.h | 244 | ||||
-rw-r--r-- | arch/x86/kernel/apic/vector.c | 2 |
2 files changed, 246 insertions, 0 deletions
diff --git a/arch/x86/include/asm/trace/irq_vectors.h b/arch/x86/include/asm/trace/irq_vectors.h index 1599d394c8c1..bc09c5cf6390 100644 --- a/arch/x86/include/asm/trace/irq_vectors.h +++ b/arch/x86/include/asm/trace/irq_vectors.h | |||
@@ -137,6 +137,250 @@ DEFINE_IRQ_VECTOR_EVENT(deferred_error_apic); | |||
137 | DEFINE_IRQ_VECTOR_EVENT(thermal_apic); | 137 | DEFINE_IRQ_VECTOR_EVENT(thermal_apic); |
138 | #endif | 138 | #endif |
139 | 139 | ||
140 | TRACE_EVENT(vector_config, | ||
141 | |||
142 | TP_PROTO(unsigned int irq, unsigned int vector, | ||
143 | unsigned int cpu, unsigned int apicdest), | ||
144 | |||
145 | TP_ARGS(irq, vector, cpu, apicdest), | ||
146 | |||
147 | TP_STRUCT__entry( | ||
148 | __field( unsigned int, irq ) | ||
149 | __field( unsigned int, vector ) | ||
150 | __field( unsigned int, cpu ) | ||
151 | __field( unsigned int, apicdest ) | ||
152 | ), | ||
153 | |||
154 | TP_fast_assign( | ||
155 | __entry->irq = irq; | ||
156 | __entry->vector = vector; | ||
157 | __entry->cpu = cpu; | ||
158 | __entry->apicdest = apicdest; | ||
159 | ), | ||
160 | |||
161 | TP_printk("irq=%u vector=%u cpu=%u apicdest=0x%08x", | ||
162 | __entry->irq, __entry->vector, __entry->cpu, | ||
163 | __entry->apicdest) | ||
164 | ); | ||
165 | |||
166 | DECLARE_EVENT_CLASS(vector_mod, | ||
167 | |||
168 | TP_PROTO(unsigned int irq, unsigned int vector, | ||
169 | unsigned int cpu, unsigned int prev_vector, | ||
170 | unsigned int prev_cpu), | ||
171 | |||
172 | TP_ARGS(irq, vector, cpu, prev_vector, prev_cpu), | ||
173 | |||
174 | TP_STRUCT__entry( | ||
175 | __field( unsigned int, irq ) | ||
176 | __field( unsigned int, vector ) | ||
177 | __field( unsigned int, cpu ) | ||
178 | __field( unsigned int, prev_vector ) | ||
179 | __field( unsigned int, prev_cpu ) | ||
180 | ), | ||
181 | |||
182 | TP_fast_assign( | ||
183 | __entry->irq = irq; | ||
184 | __entry->vector = vector; | ||
185 | __entry->cpu = cpu; | ||
186 | __entry->prev_vector = prev_vector; | ||
187 | __entry->prev_cpu = prev_cpu; | ||
188 | |||
189 | ), | ||
190 | |||
191 | TP_printk("irq=%u vector=%u cpu=%u prev_vector=%u prev_cpu=%u", | ||
192 | __entry->irq, __entry->vector, __entry->cpu, | ||
193 | __entry->prev_vector, __entry->prev_cpu) | ||
194 | ); | ||
195 | |||
196 | #define DEFINE_IRQ_VECTOR_MOD_EVENT(name) \ | ||
197 | DEFINE_EVENT_FN(vector_mod, name, \ | ||
198 | TP_PROTO(unsigned int irq, unsigned int vector, \ | ||
199 | unsigned int cpu, unsigned int prev_vector, \ | ||
200 | unsigned int prev_cpu), \ | ||
201 | TP_ARGS(irq, vector, cpu, prev_vector, prev_cpu), NULL, NULL); \ | ||
202 | |||
203 | DEFINE_IRQ_VECTOR_MOD_EVENT(vector_update); | ||
204 | DEFINE_IRQ_VECTOR_MOD_EVENT(vector_clear); | ||
205 | |||
206 | DECLARE_EVENT_CLASS(vector_reserve, | ||
207 | |||
208 | TP_PROTO(unsigned int irq, int ret), | ||
209 | |||
210 | TP_ARGS(irq, ret), | ||
211 | |||
212 | TP_STRUCT__entry( | ||
213 | __field( unsigned int, irq ) | ||
214 | __field( int, ret ) | ||
215 | ), | ||
216 | |||
217 | TP_fast_assign( | ||
218 | __entry->irq = irq; | ||
219 | __entry->ret = ret; | ||
220 | ), | ||
221 | |||
222 | TP_printk("irq=%u ret=%d", __entry->irq, __entry->ret) | ||
223 | ); | ||
224 | |||
225 | #define DEFINE_IRQ_VECTOR_RESERVE_EVENT(name) \ | ||
226 | DEFINE_EVENT_FN(vector_reserve, name, \ | ||
227 | TP_PROTO(unsigned int irq, int ret), \ | ||
228 | TP_ARGS(irq, ret), NULL, NULL); \ | ||
229 | |||
230 | DEFINE_IRQ_VECTOR_RESERVE_EVENT(vector_reserve_managed); | ||
231 | DEFINE_IRQ_VECTOR_RESERVE_EVENT(vector_reserve); | ||
232 | |||
233 | TRACE_EVENT(vector_alloc, | ||
234 | |||
235 | TP_PROTO(unsigned int irq, unsigned int vector, bool reserved, | ||
236 | int ret), | ||
237 | |||
238 | TP_ARGS(irq, vector, ret, reserved), | ||
239 | |||
240 | TP_STRUCT__entry( | ||
241 | __field( unsigned int, irq ) | ||
242 | __field( unsigned int, vector ) | ||
243 | __field( bool, reserved ) | ||
244 | __field( int, ret ) | ||
245 | ), | ||
246 | |||
247 | TP_fast_assign( | ||
248 | __entry->irq = irq; | ||
249 | __entry->vector = ret < 0 ? 0 : vector; | ||
250 | __entry->reserved = reserved; | ||
251 | __entry->ret = ret > 0 ? 0 : ret; | ||
252 | ), | ||
253 | |||
254 | TP_printk("irq=%u vector=%u reserved=%d ret=%d", | ||
255 | __entry->irq, __entry->vector, | ||
256 | __entry->reserved, __entry->ret) | ||
257 | ); | ||
258 | |||
259 | TRACE_EVENT(vector_alloc_managed, | ||
260 | |||
261 | TP_PROTO(unsigned int irq, unsigned int vector, | ||
262 | int ret), | ||
263 | |||
264 | TP_ARGS(irq, vector, ret), | ||
265 | |||
266 | TP_STRUCT__entry( | ||
267 | __field( unsigned int, irq ) | ||
268 | __field( unsigned int, vector ) | ||
269 | __field( int, ret ) | ||
270 | ), | ||
271 | |||
272 | TP_fast_assign( | ||
273 | __entry->irq = irq; | ||
274 | __entry->vector = ret < 0 ? 0 : vector; | ||
275 | __entry->ret = ret > 0 ? 0 : ret; | ||
276 | ), | ||
277 | |||
278 | TP_printk("irq=%u vector=%u ret=%d", | ||
279 | __entry->irq, __entry->vector, __entry->ret) | ||
280 | ); | ||
281 | |||
282 | DECLARE_EVENT_CLASS(vector_activate, | ||
283 | |||
284 | TP_PROTO(unsigned int irq, bool is_managed, bool can_reserve, | ||
285 | bool early), | ||
286 | |||
287 | TP_ARGS(irq, is_managed, can_reserve, early), | ||
288 | |||
289 | TP_STRUCT__entry( | ||
290 | __field( unsigned int, irq ) | ||
291 | __field( bool, is_managed ) | ||
292 | __field( bool, can_reserve ) | ||
293 | __field( bool, early ) | ||
294 | ), | ||
295 | |||
296 | TP_fast_assign( | ||
297 | __entry->irq = irq; | ||
298 | __entry->is_managed = is_managed; | ||
299 | __entry->can_reserve = can_reserve; | ||
300 | __entry->early = early; | ||
301 | ), | ||
302 | |||
303 | TP_printk("irq=%u is_managed=%d can_reserve=%d early=%d", | ||
304 | __entry->irq, __entry->is_managed, __entry->can_reserve, | ||
305 | __entry->early) | ||
306 | ); | ||
307 | |||
308 | #define DEFINE_IRQ_VECTOR_ACTIVATE_EVENT(name) \ | ||
309 | DEFINE_EVENT_FN(vector_activate, name, \ | ||
310 | TP_PROTO(unsigned int irq, bool is_managed, \ | ||
311 | bool can_reserve, bool early), \ | ||
312 | TP_ARGS(irq, is_managed, can_reserve, early), NULL, NULL); \ | ||
313 | |||
314 | DEFINE_IRQ_VECTOR_ACTIVATE_EVENT(vector_activate); | ||
315 | DEFINE_IRQ_VECTOR_ACTIVATE_EVENT(vector_deactivate); | ||
316 | |||
317 | TRACE_EVENT(vector_teardown, | ||
318 | |||
319 | TP_PROTO(unsigned int irq, bool is_managed, bool has_reserved), | ||
320 | |||
321 | TP_ARGS(irq, is_managed, has_reserved), | ||
322 | |||
323 | TP_STRUCT__entry( | ||
324 | __field( unsigned int, irq ) | ||
325 | __field( bool, is_managed ) | ||
326 | __field( bool, has_reserved ) | ||
327 | ), | ||
328 | |||
329 | TP_fast_assign( | ||
330 | __entry->irq = irq; | ||
331 | __entry->is_managed = is_managed; | ||
332 | __entry->has_reserved = has_reserved; | ||
333 | ), | ||
334 | |||
335 | TP_printk("irq=%u is_managed=%d has_reserved=%d", | ||
336 | __entry->irq, __entry->is_managed, __entry->has_reserved) | ||
337 | ); | ||
338 | |||
339 | TRACE_EVENT(vector_setup, | ||
340 | |||
341 | TP_PROTO(unsigned int irq, bool is_legacy, int ret), | ||
342 | |||
343 | TP_ARGS(irq, is_legacy, ret), | ||
344 | |||
345 | TP_STRUCT__entry( | ||
346 | __field( unsigned int, irq ) | ||
347 | __field( bool, is_legacy ) | ||
348 | __field( int, ret ) | ||
349 | ), | ||
350 | |||
351 | TP_fast_assign( | ||
352 | __entry->irq = irq; | ||
353 | __entry->is_legacy = is_legacy; | ||
354 | __entry->ret = ret; | ||
355 | ), | ||
356 | |||
357 | TP_printk("irq=%u is_legacy=%d ret=%d", | ||
358 | __entry->irq, __entry->is_legacy, __entry->ret) | ||
359 | ); | ||
360 | |||
361 | TRACE_EVENT(vector_free_moved, | ||
362 | |||
363 | TP_PROTO(unsigned int irq, unsigned int vector, bool is_managed), | ||
364 | |||
365 | TP_ARGS(irq, vector, is_managed), | ||
366 | |||
367 | TP_STRUCT__entry( | ||
368 | __field( unsigned int, irq ) | ||
369 | __field( unsigned int, vector ) | ||
370 | __field( bool, is_managed ) | ||
371 | ), | ||
372 | |||
373 | TP_fast_assign( | ||
374 | __entry->irq = irq; | ||
375 | __entry->vector = vector; | ||
376 | __entry->is_managed = is_managed; | ||
377 | ), | ||
378 | |||
379 | TP_printk("irq=%u vector=%u is_managed=%d", | ||
380 | __entry->irq, __entry->vector, __entry->is_managed) | ||
381 | ); | ||
382 | |||
383 | |||
140 | #endif /* CONFIG_X86_LOCAL_APIC */ | 384 | #endif /* CONFIG_X86_LOCAL_APIC */ |
141 | 385 | ||
142 | #undef TRACE_INCLUDE_PATH | 386 | #undef TRACE_INCLUDE_PATH |
diff --git a/arch/x86/kernel/apic/vector.c b/arch/x86/kernel/apic/vector.c index acdc74df649d..a2761740d345 100644 --- a/arch/x86/kernel/apic/vector.c +++ b/arch/x86/kernel/apic/vector.c | |||
@@ -22,6 +22,8 @@ | |||
22 | #include <asm/desc.h> | 22 | #include <asm/desc.h> |
23 | #include <asm/irq_remapping.h> | 23 | #include <asm/irq_remapping.h> |
24 | 24 | ||
25 | #include <asm/trace/irq_vectors.h> | ||
26 | |||
25 | struct apic_chip_data { | 27 | struct apic_chip_data { |
26 | struct irq_cfg cfg; | 28 | struct irq_cfg cfg; |
27 | unsigned int cpu; | 29 | unsigned int cpu; |