diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2017-09-13 17:29:39 -0400 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2017-09-25 14:51:57 -0400 |
commit | 65d7ed57bd9708d562a37fa3f99bf9fd62052b9e (patch) | |
tree | 3dbe6f79f98d3594addd13d1629f2cd9a7eb18cf /arch/x86/kernel/apic/vector.c | |
parent | 0fa115da408f645cca419a60a5af8f4426ad4188 (diff) |
x86/vector: Add vector domain debugfs support
Add the debug callback for the vector domain, which gives a detailed
information about vector usage if invoked for the domain by using rhe
matrix allocator debug function and vector/target information when invoked
for a particular interrupt.
Extra information foir the Vector domain:
Online bitmaps: 32
Global available: 6352
Global reserved: 5
Total allocated: 20
System: 41: 0-19,32,50,128,238-255
| CPU | avl | man | act | vectors
0 183 4 19 33-48,51-53
1 199 4 1 33
2 199 4 0
Extra information for interrupts:
Vector: 42
Target: 4
This allows a detailed analysis of the vector usage and the association to
interrupts and devices.
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.188137174@linutronix.de
Diffstat (limited to 'arch/x86/kernel/apic/vector.c')
-rw-r--r-- | arch/x86/kernel/apic/vector.c | 50 |
1 files changed, 48 insertions, 2 deletions
diff --git a/arch/x86/kernel/apic/vector.c b/arch/x86/kernel/apic/vector.c index 078fbd08499c..acdc74df649d 100644 --- a/arch/x86/kernel/apic/vector.c +++ b/arch/x86/kernel/apic/vector.c | |||
@@ -11,6 +11,7 @@ | |||
11 | * published by the Free Software Foundation. | 11 | * published by the Free Software Foundation. |
12 | */ | 12 | */ |
13 | #include <linux/interrupt.h> | 13 | #include <linux/interrupt.h> |
14 | #include <linux/seq_file.h> | ||
14 | #include <linux/init.h> | 15 | #include <linux/init.h> |
15 | #include <linux/compiler.h> | 16 | #include <linux/compiler.h> |
16 | #include <linux/slab.h> | 17 | #include <linux/slab.h> |
@@ -373,9 +374,54 @@ error: | |||
373 | return err; | 374 | return err; |
374 | } | 375 | } |
375 | 376 | ||
377 | #ifdef CONFIG_GENERIC_IRQ_DEBUGFS | ||
378 | void x86_vector_debug_show(struct seq_file *m, struct irq_domain *d, | ||
379 | struct irq_data *irqd, int ind) | ||
380 | { | ||
381 | unsigned int cpu, vec, prev_cpu, prev_vec; | ||
382 | struct apic_chip_data *apicd; | ||
383 | unsigned long flags; | ||
384 | int irq; | ||
385 | |||
386 | if (!irqd) { | ||
387 | irq_matrix_debug_show(m, vector_matrix, ind); | ||
388 | return; | ||
389 | } | ||
390 | |||
391 | irq = irqd->irq; | ||
392 | if (irq < nr_legacy_irqs() && !test_bit(irq, &io_apic_irqs)) { | ||
393 | seq_printf(m, "%*sVector: %5d\n", ind, "", ISA_IRQ_VECTOR(irq)); | ||
394 | seq_printf(m, "%*sTarget: Legacy PIC all CPUs\n", ind, ""); | ||
395 | return; | ||
396 | } | ||
397 | |||
398 | apicd = irqd->chip_data; | ||
399 | if (!apicd) { | ||
400 | seq_printf(m, "%*sVector: Not assigned\n", ind, ""); | ||
401 | return; | ||
402 | } | ||
403 | |||
404 | raw_spin_lock_irqsave(&vector_lock, flags); | ||
405 | cpu = apicd->cpu; | ||
406 | vec = apicd->cfg.vector; | ||
407 | prev_cpu = apicd->prev_cpu; | ||
408 | prev_vec = apicd->cfg.old_vector; | ||
409 | raw_spin_unlock_irqrestore(&vector_lock, flags); | ||
410 | seq_printf(m, "%*sVector: %5u\n", ind, "", vec); | ||
411 | seq_printf(m, "%*sTarget: %5u\n", ind, "", cpu); | ||
412 | if (prev_vec) { | ||
413 | seq_printf(m, "%*sPrevious vector: %5u\n", ind, "", prev_vec); | ||
414 | seq_printf(m, "%*sPrevious target: %5u\n", ind, "", prev_cpu); | ||
415 | } | ||
416 | } | ||
417 | #endif | ||
418 | |||
376 | static const struct irq_domain_ops x86_vector_domain_ops = { | 419 | static const struct irq_domain_ops x86_vector_domain_ops = { |
377 | .alloc = x86_vector_alloc_irqs, | 420 | .alloc = x86_vector_alloc_irqs, |
378 | .free = x86_vector_free_irqs, | 421 | .free = x86_vector_free_irqs, |
422 | #ifdef CONFIG_GENERIC_IRQ_DEBUGFS | ||
423 | .debug_show = x86_vector_debug_show, | ||
424 | #endif | ||
379 | }; | 425 | }; |
380 | 426 | ||
381 | int __init arch_probe_nr_irqs(void) | 427 | int __init arch_probe_nr_irqs(void) |