Merge tag 'stream_open-5.2' of https://lab.nexedi.com/kirr/linux
[sfrench/cifs-2.6.git] / arch / s390 / kernel / irq.c
index 0cd5a5f96729dad40540016bf2d32acc1ff18893..8371855042dc2f07e37e5bf9e66300f645c04e83 100644 (file)
@@ -26,6 +26,7 @@
 #include <asm/lowcore.h>
 #include <asm/irq.h>
 #include <asm/hw_irq.h>
+#include <asm/stacktrace.h>
 #include "entry.h"
 
 DEFINE_PER_CPU_SHARED_ALIGNED(struct irq_stat, irq_stat);
@@ -73,7 +74,6 @@ static const struct irq_class irqclass_sub_desc[] = {
        {.irq = IRQEXT_CMC, .name = "CMC", .desc = "[EXT] CPU-Measurement: Counter"},
        {.irq = IRQEXT_FTP, .name = "FTP", .desc = "[EXT] HMC FTP Service"},
        {.irq = IRQIO_CIO,  .name = "CIO", .desc = "[I/O] Common I/O Layer Interrupt"},
-       {.irq = IRQIO_QAI,  .name = "QAI", .desc = "[I/O] QDIO Adapter Interrupt"},
        {.irq = IRQIO_DAS,  .name = "DAS", .desc = "[I/O] DASD"},
        {.irq = IRQIO_C15,  .name = "C15", .desc = "[I/O] 3215"},
        {.irq = IRQIO_C70,  .name = "C70", .desc = "[I/O] 3270"},
@@ -81,14 +81,16 @@ static const struct irq_class irqclass_sub_desc[] = {
        {.irq = IRQIO_VMR,  .name = "VMR", .desc = "[I/O] Unit Record Devices"},
        {.irq = IRQIO_LCS,  .name = "LCS", .desc = "[I/O] LCS"},
        {.irq = IRQIO_CTC,  .name = "CTC", .desc = "[I/O] CTC"},
-       {.irq = IRQIO_APB,  .name = "APB", .desc = "[I/O] AP Bus"},
        {.irq = IRQIO_ADM,  .name = "ADM", .desc = "[I/O] EADM Subchannel"},
        {.irq = IRQIO_CSC,  .name = "CSC", .desc = "[I/O] CHSC Subchannel"},
-       {.irq = IRQIO_PCI,  .name = "PCI", .desc = "[I/O] PCI Interrupt" },
-       {.irq = IRQIO_MSI,  .name = "MSI", .desc = "[I/O] MSI Interrupt" },
        {.irq = IRQIO_VIR,  .name = "VIR", .desc = "[I/O] Virtual I/O Devices"},
-       {.irq = IRQIO_VAI,  .name = "VAI", .desc = "[I/O] Virtual I/O Devices AI"},
-       {.irq = IRQIO_GAL,  .name = "GAL", .desc = "[I/O] GIB Alert"},
+       {.irq = IRQIO_QAI,  .name = "QAI", .desc = "[AIO] QDIO Adapter Interrupt"},
+       {.irq = IRQIO_APB,  .name = "APB", .desc = "[AIO] AP Bus"},
+       {.irq = IRQIO_PCF,  .name = "PCF", .desc = "[AIO] PCI Floating Interrupt"},
+       {.irq = IRQIO_PCD,  .name = "PCD", .desc = "[AIO] PCI Directed Interrupt"},
+       {.irq = IRQIO_MSI,  .name = "MSI", .desc = "[AIO] MSI Interrupt"},
+       {.irq = IRQIO_VAI,  .name = "VAI", .desc = "[AIO] Virtual I/O Devices AI"},
+       {.irq = IRQIO_GAL,  .name = "GAL", .desc = "[AIO] GIB Alert"},
        {.irq = NMI_NMI,    .name = "NMI", .desc = "[NMI] Machine Check"},
        {.irq = CPU_RST,    .name = "RST", .desc = "[CPU] CPU Restart"},
 };
@@ -116,6 +118,34 @@ void do_IRQ(struct pt_regs *regs, int irq)
        set_irq_regs(old_regs);
 }
 
+static void show_msi_interrupt(struct seq_file *p, int irq)
+{
+       struct irq_desc *desc;
+       unsigned long flags;
+       int cpu;
+
+       irq_lock_sparse();
+       desc = irq_to_desc(irq);
+       if (!desc)
+               goto out;
+
+       raw_spin_lock_irqsave(&desc->lock, flags);
+       seq_printf(p, "%3d: ", irq);
+       for_each_online_cpu(cpu)
+               seq_printf(p, "%10u ", kstat_irqs_cpu(irq, cpu));
+
+       if (desc->irq_data.chip)
+               seq_printf(p, " %8s", desc->irq_data.chip->name);
+
+       if (desc->action)
+               seq_printf(p, "  %s", desc->action->name);
+
+       seq_putc(p, '\n');
+       raw_spin_unlock_irqrestore(&desc->lock, flags);
+out:
+       irq_unlock_sparse();
+}
+
 /*
  * show_interrupts is needed by /proc/interrupts.
  */
@@ -128,7 +158,7 @@ int show_interrupts(struct seq_file *p, void *v)
        if (index == 0) {
                seq_puts(p, "           ");
                for_each_online_cpu(cpu)
-                       seq_printf(p, "CPU%d       ", cpu);
+                       seq_printf(p, "CPU%-8d", cpu);
                seq_putc(p, '\n');
        }
        if (index < NR_IRQS_BASE) {
@@ -139,9 +169,10 @@ int show_interrupts(struct seq_file *p, void *v)
                seq_putc(p, '\n');
                goto out;
        }
-       if (index > NR_IRQS_BASE)
+       if (index < nr_irqs) {
+               show_msi_interrupt(p, index);
                goto out;
-
+       }
        for (index = 0; index < NR_ARCH_IRQS; index++) {
                seq_printf(p, "%s: ", irqclass_sub_desc[index].name);
                irq = irqclass_sub_desc[index].irq;