aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/apic/vector.c
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2017-09-13 17:29:39 -0400
committerThomas Gleixner <tglx@linutronix.de>2017-09-25 14:51:57 -0400
commit65d7ed57bd9708d562a37fa3f99bf9fd62052b9e (patch)
tree3dbe6f79f98d3594addd13d1629f2cd9a7eb18cf /arch/x86/kernel/apic/vector.c
parent0fa115da408f645cca419a60a5af8f4426ad4188 (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.c50
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
378void 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
376static const struct irq_domain_ops x86_vector_domain_ops = { 419static 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
381int __init arch_probe_nr_irqs(void) 427int __init arch_probe_nr_irqs(void)