mirror of
https://github.com/torvalds/linux.git
synced 2024-12-29 06:12:08 +00:00
s390/irq: remove split irq fields from /proc/stat
Now that irq sum accounting for /proc/stat's "intr" line works again we
have the oddity that the sum field (first field) contains only the sum
of the second (external irqs) and third field (I/O interrupts).
The reason for that is that these two fields are already sums of all other
fields. So if we would sum up everything we would count every interrupt
twice.
This is broken since the split interrupt accounting was merged two years
ago: 052ff461c8
"[S390] irq: have detailed
statistics for interrupt types".
To fix this remove the split interrupt fields from /proc/stat's "intr"
line again and only have them in /proc/interrupts.
This restores the old behaviour, seems to be the only sane fix and mimics
a behaviour from other architectures where /proc/interrupts also contains
more than /proc/stat's "intr" line does.
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
parent
add9bde216
commit
420f42ecf4
@ -2,43 +2,60 @@
|
||||
#define _ASM_IRQ_H
|
||||
|
||||
#include <linux/hardirq.h>
|
||||
#include <linux/percpu.h>
|
||||
#include <linux/cache.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
enum interruption_class {
|
||||
enum interruption_main_class {
|
||||
EXTERNAL_INTERRUPT,
|
||||
IO_INTERRUPT,
|
||||
EXTINT_CLK,
|
||||
EXTINT_EXC,
|
||||
EXTINT_EMS,
|
||||
EXTINT_TMR,
|
||||
EXTINT_TLA,
|
||||
EXTINT_PFL,
|
||||
EXTINT_DSD,
|
||||
EXTINT_VRT,
|
||||
EXTINT_SCP,
|
||||
EXTINT_IUC,
|
||||
EXTINT_CMS,
|
||||
EXTINT_CMC,
|
||||
EXTINT_CMR,
|
||||
IOINT_CIO,
|
||||
IOINT_QAI,
|
||||
IOINT_DAS,
|
||||
IOINT_C15,
|
||||
IOINT_C70,
|
||||
IOINT_TAP,
|
||||
IOINT_VMR,
|
||||
IOINT_LCS,
|
||||
IOINT_CLW,
|
||||
IOINT_CTC,
|
||||
IOINT_APB,
|
||||
IOINT_ADM,
|
||||
IOINT_CSC,
|
||||
IOINT_PCI,
|
||||
IOINT_MSI,
|
||||
NMI_NMI,
|
||||
NR_IRQS,
|
||||
NR_IRQS
|
||||
};
|
||||
|
||||
enum interruption_class {
|
||||
IRQEXT_CLK,
|
||||
IRQEXT_EXC,
|
||||
IRQEXT_EMS,
|
||||
IRQEXT_TMR,
|
||||
IRQEXT_TLA,
|
||||
IRQEXT_PFL,
|
||||
IRQEXT_DSD,
|
||||
IRQEXT_VRT,
|
||||
IRQEXT_SCP,
|
||||
IRQEXT_IUC,
|
||||
IRQEXT_CMS,
|
||||
IRQEXT_CMC,
|
||||
IRQEXT_CMR,
|
||||
IRQIO_CIO,
|
||||
IRQIO_QAI,
|
||||
IRQIO_DAS,
|
||||
IRQIO_C15,
|
||||
IRQIO_C70,
|
||||
IRQIO_TAP,
|
||||
IRQIO_VMR,
|
||||
IRQIO_LCS,
|
||||
IRQIO_CLW,
|
||||
IRQIO_CTC,
|
||||
IRQIO_APB,
|
||||
IRQIO_ADM,
|
||||
IRQIO_CSC,
|
||||
IRQIO_PCI,
|
||||
IRQIO_MSI,
|
||||
NMI_NMI,
|
||||
NR_ARCH_IRQS
|
||||
};
|
||||
|
||||
struct irq_stat {
|
||||
unsigned int irqs[NR_ARCH_IRQS];
|
||||
};
|
||||
|
||||
DECLARE_PER_CPU_SHARED_ALIGNED(struct irq_stat, irq_stat);
|
||||
|
||||
static __always_inline void inc_irq_stat(enum interruption_class irq)
|
||||
{
|
||||
__get_cpu_var(irq_stat).irqs[irq]++;
|
||||
}
|
||||
|
||||
struct ext_code {
|
||||
unsigned short subcode;
|
||||
unsigned short code;
|
||||
|
@ -24,42 +24,63 @@
|
||||
#include <asm/irq.h>
|
||||
#include "entry.h"
|
||||
|
||||
DEFINE_PER_CPU_SHARED_ALIGNED(struct irq_stat, irq_stat);
|
||||
EXPORT_PER_CPU_SYMBOL_GPL(irq_stat);
|
||||
|
||||
struct irq_class {
|
||||
char *name;
|
||||
char *desc;
|
||||
};
|
||||
|
||||
static const struct irq_class intrclass_names[] = {
|
||||
/*
|
||||
* The list of "main" irq classes on s390. This is the list of interrrupts
|
||||
* that appear both in /proc/stat ("intr" line) and /proc/interrupts.
|
||||
* Historically only external and I/O interrupts have been part of /proc/stat.
|
||||
* We can't add the split external and I/O sub classes since the first field
|
||||
* in the "intr" line in /proc/stat is supposed to be the sum of all other
|
||||
* fields.
|
||||
* Since the external and I/O interrupt fields are already sums we would end
|
||||
* up with having a sum which accounts each interrupt twice.
|
||||
*/
|
||||
static const struct irq_class irqclass_main_desc[NR_IRQS] = {
|
||||
[EXTERNAL_INTERRUPT] = {.name = "EXT"},
|
||||
[IO_INTERRUPT] = {.name = "I/O"},
|
||||
[EXTINT_CLK] = {.name = "CLK", .desc = "[EXT] Clock Comparator"},
|
||||
[EXTINT_EXC] = {.name = "EXC", .desc = "[EXT] External Call"},
|
||||
[EXTINT_EMS] = {.name = "EMS", .desc = "[EXT] Emergency Signal"},
|
||||
[EXTINT_TMR] = {.name = "TMR", .desc = "[EXT] CPU Timer"},
|
||||
[EXTINT_TLA] = {.name = "TAL", .desc = "[EXT] Timing Alert"},
|
||||
[EXTINT_PFL] = {.name = "PFL", .desc = "[EXT] Pseudo Page Fault"},
|
||||
[EXTINT_DSD] = {.name = "DSD", .desc = "[EXT] DASD Diag"},
|
||||
[EXTINT_VRT] = {.name = "VRT", .desc = "[EXT] Virtio"},
|
||||
[EXTINT_SCP] = {.name = "SCP", .desc = "[EXT] Service Call"},
|
||||
[EXTINT_IUC] = {.name = "IUC", .desc = "[EXT] IUCV"},
|
||||
[EXTINT_CMS] = {.name = "CMS", .desc = "[EXT] CPU-Measurement: Sampling"},
|
||||
[EXTINT_CMC] = {.name = "CMC", .desc = "[EXT] CPU-Measurement: Counter"},
|
||||
[EXTINT_CMR] = {.name = "CMR", .desc = "[EXT] CPU-Measurement: RI"},
|
||||
[IOINT_CIO] = {.name = "CIO", .desc = "[I/O] Common I/O Layer Interrupt"},
|
||||
[IOINT_QAI] = {.name = "QAI", .desc = "[I/O] QDIO Adapter Interrupt"},
|
||||
[IOINT_DAS] = {.name = "DAS", .desc = "[I/O] DASD"},
|
||||
[IOINT_C15] = {.name = "C15", .desc = "[I/O] 3215"},
|
||||
[IOINT_C70] = {.name = "C70", .desc = "[I/O] 3270"},
|
||||
[IOINT_TAP] = {.name = "TAP", .desc = "[I/O] Tape"},
|
||||
[IOINT_VMR] = {.name = "VMR", .desc = "[I/O] Unit Record Devices"},
|
||||
[IOINT_LCS] = {.name = "LCS", .desc = "[I/O] LCS"},
|
||||
[IOINT_CLW] = {.name = "CLW", .desc = "[I/O] CLAW"},
|
||||
[IOINT_CTC] = {.name = "CTC", .desc = "[I/O] CTC"},
|
||||
[IOINT_APB] = {.name = "APB", .desc = "[I/O] AP Bus"},
|
||||
[IOINT_ADM] = {.name = "ADM", .desc = "[I/O] EADM Subchannel"},
|
||||
[IOINT_CSC] = {.name = "CSC", .desc = "[I/O] CHSC Subchannel"},
|
||||
[IOINT_PCI] = {.name = "PCI", .desc = "[I/O] PCI Interrupt" },
|
||||
[IOINT_MSI] = {.name = "MSI", .desc = "[I/O] MSI Interrupt" },
|
||||
[IO_INTERRUPT] = {.name = "I/O"}
|
||||
};
|
||||
|
||||
/*
|
||||
* The list of split external and I/O interrupts that appear only in
|
||||
* /proc/interrupts.
|
||||
* In addition this list contains non external / I/O events like NMIs.
|
||||
*/
|
||||
static const struct irq_class irqclass_sub_desc[NR_ARCH_IRQS] = {
|
||||
[IRQEXT_CLK] = {.name = "CLK", .desc = "[EXT] Clock Comparator"},
|
||||
[IRQEXT_EXC] = {.name = "EXC", .desc = "[EXT] External Call"},
|
||||
[IRQEXT_EMS] = {.name = "EMS", .desc = "[EXT] Emergency Signal"},
|
||||
[IRQEXT_TMR] = {.name = "TMR", .desc = "[EXT] CPU Timer"},
|
||||
[IRQEXT_TLA] = {.name = "TAL", .desc = "[EXT] Timing Alert"},
|
||||
[IRQEXT_PFL] = {.name = "PFL", .desc = "[EXT] Pseudo Page Fault"},
|
||||
[IRQEXT_DSD] = {.name = "DSD", .desc = "[EXT] DASD Diag"},
|
||||
[IRQEXT_VRT] = {.name = "VRT", .desc = "[EXT] Virtio"},
|
||||
[IRQEXT_SCP] = {.name = "SCP", .desc = "[EXT] Service Call"},
|
||||
[IRQEXT_IUC] = {.name = "IUC", .desc = "[EXT] IUCV"},
|
||||
[IRQEXT_CMS] = {.name = "CMS", .desc = "[EXT] CPU-Measurement: Sampling"},
|
||||
[IRQEXT_CMC] = {.name = "CMC", .desc = "[EXT] CPU-Measurement: Counter"},
|
||||
[IRQEXT_CMR] = {.name = "CMR", .desc = "[EXT] CPU-Measurement: RI"},
|
||||
[IRQIO_CIO] = {.name = "CIO", .desc = "[I/O] Common I/O Layer Interrupt"},
|
||||
[IRQIO_QAI] = {.name = "QAI", .desc = "[I/O] QDIO Adapter Interrupt"},
|
||||
[IRQIO_DAS] = {.name = "DAS", .desc = "[I/O] DASD"},
|
||||
[IRQIO_C15] = {.name = "C15", .desc = "[I/O] 3215"},
|
||||
[IRQIO_C70] = {.name = "C70", .desc = "[I/O] 3270"},
|
||||
[IRQIO_TAP] = {.name = "TAP", .desc = "[I/O] Tape"},
|
||||
[IRQIO_VMR] = {.name = "VMR", .desc = "[I/O] Unit Record Devices"},
|
||||
[IRQIO_LCS] = {.name = "LCS", .desc = "[I/O] LCS"},
|
||||
[IRQIO_CLW] = {.name = "CLW", .desc = "[I/O] CLAW"},
|
||||
[IRQIO_CTC] = {.name = "CTC", .desc = "[I/O] CTC"},
|
||||
[IRQIO_APB] = {.name = "APB", .desc = "[I/O] AP Bus"},
|
||||
[IRQIO_ADM] = {.name = "ADM", .desc = "[I/O] EADM Subchannel"},
|
||||
[IRQIO_CSC] = {.name = "CSC", .desc = "[I/O] CHSC Subchannel"},
|
||||
[IRQIO_PCI] = {.name = "PCI", .desc = "[I/O] PCI Interrupt" },
|
||||
[IRQIO_MSI] = {.name = "MSI", .desc = "[I/O] MSI Interrupt" },
|
||||
[NMI_NMI] = {.name = "NMI", .desc = "[NMI] Machine Check"},
|
||||
};
|
||||
|
||||
@ -68,28 +89,32 @@ static const struct irq_class intrclass_names[] = {
|
||||
*/
|
||||
int show_interrupts(struct seq_file *p, void *v)
|
||||
{
|
||||
int i = *(loff_t *) v, j;
|
||||
int irq = *(loff_t *) v;
|
||||
int cpu;
|
||||
|
||||
get_online_cpus();
|
||||
if (i == 0) {
|
||||
if (irq == 0) {
|
||||
seq_puts(p, " ");
|
||||
for_each_online_cpu(j)
|
||||
seq_printf(p, "CPU%d ",j);
|
||||
for_each_online_cpu(cpu)
|
||||
seq_printf(p, "CPU%d ", cpu);
|
||||
seq_putc(p, '\n');
|
||||
}
|
||||
|
||||
if (i < NR_IRQS) {
|
||||
seq_printf(p, "%s: ", intrclass_names[i].name);
|
||||
#ifndef CONFIG_SMP
|
||||
seq_printf(p, "%10u ", kstat_irqs(i));
|
||||
#else
|
||||
for_each_online_cpu(j)
|
||||
seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]);
|
||||
#endif
|
||||
if (intrclass_names[i].desc)
|
||||
seq_printf(p, " %s", intrclass_names[i].desc);
|
||||
if (irq < NR_IRQS) {
|
||||
seq_printf(p, "%s: ", irqclass_main_desc[irq].name);
|
||||
for_each_online_cpu(cpu)
|
||||
seq_printf(p, "%10u ", kstat_cpu(cpu).irqs[irq]);
|
||||
seq_putc(p, '\n');
|
||||
goto skip_arch_irqs;
|
||||
}
|
||||
for (irq = 0; irq < NR_ARCH_IRQS; irq++) {
|
||||
seq_printf(p, "%s: ", irqclass_sub_desc[irq].name);
|
||||
for_each_online_cpu(cpu)
|
||||
seq_printf(p, "%10u ", per_cpu(irq_stat, cpu).irqs[irq]);
|
||||
if (irqclass_sub_desc[irq].desc)
|
||||
seq_printf(p, " %s", irqclass_sub_desc[irq].desc);
|
||||
seq_putc(p, '\n');
|
||||
}
|
||||
skip_arch_irqs:
|
||||
put_online_cpus();
|
||||
return 0;
|
||||
}
|
||||
|
@ -254,7 +254,7 @@ void notrace s390_do_machine_check(struct pt_regs *regs)
|
||||
int umode;
|
||||
|
||||
nmi_enter();
|
||||
kstat_cpu(smp_processor_id()).irqs[NMI_NMI]++;
|
||||
inc_irq_stat(NMI_NMI);
|
||||
mci = (struct mci *) &S390_lowcore.mcck_interruption_code;
|
||||
mcck = &__get_cpu_var(cpu_mcck);
|
||||
umode = user_mode(regs);
|
||||
|
@ -229,7 +229,7 @@ static void cpumf_measurement_alert(struct ext_code ext_code,
|
||||
if (!(alert & CPU_MF_INT_CF_MASK))
|
||||
return;
|
||||
|
||||
kstat_cpu(smp_processor_id()).irqs[EXTINT_CMC]++;
|
||||
inc_irq_stat(IRQEXT_CMC);
|
||||
cpuhw = &__get_cpu_var(cpu_hw_events);
|
||||
|
||||
/* Measurement alerts are shared and might happen when the PMU
|
||||
|
@ -71,7 +71,7 @@ static void runtime_instr_int_handler(struct ext_code ext_code,
|
||||
if (!(param32 & CPU_MF_INT_RI_MASK))
|
||||
return;
|
||||
|
||||
kstat_cpu(smp_processor_id()).irqs[EXTINT_CMR]++;
|
||||
inc_irq_stat(IRQEXT_CMR);
|
||||
|
||||
if (!current->thread.ri_cb)
|
||||
return;
|
||||
|
@ -433,9 +433,9 @@ static void do_ext_call_interrupt(struct ext_code ext_code,
|
||||
|
||||
cpu = smp_processor_id();
|
||||
if (ext_code.code == 0x1202)
|
||||
kstat_cpu(cpu).irqs[EXTINT_EXC]++;
|
||||
inc_irq_stat(IRQEXT_EXC);
|
||||
else
|
||||
kstat_cpu(cpu).irqs[EXTINT_EMS]++;
|
||||
inc_irq_stat(IRQEXT_EMS);
|
||||
/*
|
||||
* handle bit signal external calls
|
||||
*/
|
||||
|
@ -168,7 +168,7 @@ static void clock_comparator_interrupt(struct ext_code ext_code,
|
||||
unsigned int param32,
|
||||
unsigned long param64)
|
||||
{
|
||||
kstat_cpu(smp_processor_id()).irqs[EXTINT_CLK]++;
|
||||
inc_irq_stat(IRQEXT_CLK);
|
||||
if (S390_lowcore.clock_comparator == -1ULL)
|
||||
set_clock_comparator(S390_lowcore.clock_comparator);
|
||||
}
|
||||
@ -179,7 +179,7 @@ static void stp_timing_alert(struct stp_irq_parm *);
|
||||
static void timing_alert_interrupt(struct ext_code ext_code,
|
||||
unsigned int param32, unsigned long param64)
|
||||
{
|
||||
kstat_cpu(smp_processor_id()).irqs[EXTINT_TLA]++;
|
||||
inc_irq_stat(IRQEXT_TLA);
|
||||
if (param32 & 0x00c40000)
|
||||
etr_timing_alert((struct etr_irq_parm *) ¶m32);
|
||||
if (param32 & 0x00038000)
|
||||
|
@ -569,7 +569,7 @@ static void pfault_interrupt(struct ext_code ext_code,
|
||||
subcode = ext_code.subcode;
|
||||
if ((subcode & 0xff00) != __SUBCODE_MASK)
|
||||
return;
|
||||
kstat_cpu(smp_processor_id()).irqs[EXTINT_PFL]++;
|
||||
inc_irq_stat(IRQEXT_PFL);
|
||||
/* Get the token (= pid of the affected task). */
|
||||
pid = sizeof(void *) == 4 ? param32 : param64;
|
||||
rcu_read_lock();
|
||||
|
@ -233,7 +233,7 @@ static void hws_ext_handler(struct ext_code ext_code,
|
||||
if (!(param32 & CPU_MF_INT_SF_MASK))
|
||||
return;
|
||||
|
||||
kstat_cpu(smp_processor_id()).irqs[EXTINT_CMS]++;
|
||||
inc_irq_stat(IRQEXT_CMS);
|
||||
atomic_xchg(&cb->ext_params, atomic_read(&cb->ext_params) | param32);
|
||||
|
||||
if (hws_wq)
|
||||
|
@ -440,7 +440,7 @@ static void zpci_irq_handler(void *dont, void *need)
|
||||
int rescan = 0, max = aisb_max;
|
||||
struct zdev_irq_map *imap;
|
||||
|
||||
kstat_cpu(smp_processor_id()).irqs[IOINT_PCI]++;
|
||||
inc_irq_stat(IRQIO_PCI);
|
||||
sbit = start;
|
||||
|
||||
scan:
|
||||
@ -452,7 +452,7 @@ scan:
|
||||
/* find vector bit */
|
||||
imap = bucket->imap[sbit];
|
||||
for_each_set_bit_left(mbit, &imap->aibv, imap->msi_vecs) {
|
||||
kstat_cpu(smp_processor_id()).irqs[IOINT_MSI]++;
|
||||
inc_irq_stat(IRQIO_MSI);
|
||||
clear_bit(63 - mbit, &imap->aibv);
|
||||
|
||||
spin_lock(&imap->lock);
|
||||
|
@ -248,7 +248,7 @@ static void dasd_ext_handler(struct ext_code ext_code,
|
||||
default:
|
||||
return;
|
||||
}
|
||||
kstat_cpu(smp_processor_id()).irqs[EXTINT_DSD]++;
|
||||
inc_irq_stat(IRQEXT_DSD);
|
||||
if (!ip) { /* no intparm: unsolicited interrupt */
|
||||
DBF_EVENT(DBF_NOTICE, "%s", "caught unsolicited "
|
||||
"interrupt");
|
||||
|
@ -4274,7 +4274,7 @@ static struct ccw_driver dasd_eckd_driver = {
|
||||
.thaw = dasd_generic_restore_device,
|
||||
.restore = dasd_generic_restore_device,
|
||||
.uc_handler = dasd_generic_uc_handler,
|
||||
.int_class = IOINT_DAS,
|
||||
.int_class = IRQIO_DAS,
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -78,7 +78,7 @@ static struct ccw_driver dasd_fba_driver = {
|
||||
.freeze = dasd_generic_pm_freeze,
|
||||
.thaw = dasd_generic_restore_device,
|
||||
.restore = dasd_generic_restore_device,
|
||||
.int_class = IOINT_DAS,
|
||||
.int_class = IRQIO_DAS,
|
||||
};
|
||||
|
||||
static void
|
||||
|
@ -805,7 +805,7 @@ static struct ccw_driver raw3215_ccw_driver = {
|
||||
.freeze = &raw3215_pm_stop,
|
||||
.thaw = &raw3215_pm_start,
|
||||
.restore = &raw3215_pm_start,
|
||||
.int_class = IOINT_C15,
|
||||
.int_class = IRQIO_C15,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_TN3215_CONSOLE
|
||||
|
@ -1396,7 +1396,7 @@ static struct ccw_driver raw3270_ccw_driver = {
|
||||
.freeze = &raw3270_pm_stop,
|
||||
.thaw = &raw3270_pm_start,
|
||||
.restore = &raw3270_pm_start,
|
||||
.int_class = IOINT_C70,
|
||||
.int_class = IRQIO_C70,
|
||||
};
|
||||
|
||||
static int
|
||||
|
@ -400,7 +400,7 @@ static void sclp_interrupt_handler(struct ext_code ext_code,
|
||||
u32 finished_sccb;
|
||||
u32 evbuf_pending;
|
||||
|
||||
kstat_cpu(smp_processor_id()).irqs[EXTINT_SCP]++;
|
||||
inc_irq_stat(IRQEXT_SCP);
|
||||
spin_lock(&sclp_lock);
|
||||
finished_sccb = param32 & 0xfffffff8;
|
||||
evbuf_pending = param32 & 0x3;
|
||||
@ -813,7 +813,7 @@ static void sclp_check_handler(struct ext_code ext_code,
|
||||
{
|
||||
u32 finished_sccb;
|
||||
|
||||
kstat_cpu(smp_processor_id()).irqs[EXTINT_SCP]++;
|
||||
inc_irq_stat(IRQEXT_SCP);
|
||||
finished_sccb = param32 & 0xfffffff8;
|
||||
/* Is this the interrupt we are waiting for? */
|
||||
if (finished_sccb == 0)
|
||||
|
@ -1193,7 +1193,7 @@ static struct ccw_driver tape_34xx_driver = {
|
||||
.set_online = tape_34xx_online,
|
||||
.set_offline = tape_generic_offline,
|
||||
.freeze = tape_generic_pm_suspend,
|
||||
.int_class = IOINT_TAP,
|
||||
.int_class = IRQIO_TAP,
|
||||
};
|
||||
|
||||
static int
|
||||
|
@ -1656,7 +1656,7 @@ static struct ccw_driver tape_3590_driver = {
|
||||
.set_offline = tape_generic_offline,
|
||||
.set_online = tape_3590_online,
|
||||
.freeze = tape_generic_pm_suspend,
|
||||
.int_class = IOINT_TAP,
|
||||
.int_class = IRQIO_TAP,
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -74,7 +74,7 @@ static struct ccw_driver ur_driver = {
|
||||
.set_online = ur_set_online,
|
||||
.set_offline = ur_set_offline,
|
||||
.freeze = ur_pm_suspend,
|
||||
.int_class = IOINT_VMR,
|
||||
.int_class = IRQIO_VMR,
|
||||
};
|
||||
|
||||
static DEFINE_MUTEX(vmur_mutex);
|
||||
|
@ -58,7 +58,7 @@ static void chsc_subchannel_irq(struct subchannel *sch)
|
||||
|
||||
CHSC_LOG(4, "irb");
|
||||
CHSC_LOG_HEX(4, irb, sizeof(*irb));
|
||||
kstat_cpu(smp_processor_id()).irqs[IOINT_CSC]++;
|
||||
inc_irq_stat(IRQIO_CSC);
|
||||
|
||||
/* Copy irb to provided request and set done. */
|
||||
if (!request) {
|
||||
|
@ -619,7 +619,7 @@ void __irq_entry do_IRQ(struct pt_regs *regs)
|
||||
sch = (struct subchannel *)(unsigned long)tpi_info->intparm;
|
||||
if (!sch) {
|
||||
/* Clear pending interrupt condition. */
|
||||
kstat_cpu(smp_processor_id()).irqs[IOINT_CIO]++;
|
||||
inc_irq_stat(IRQIO_CIO);
|
||||
tsch(tpi_info->schid, irb);
|
||||
continue;
|
||||
}
|
||||
@ -633,9 +633,9 @@ void __irq_entry do_IRQ(struct pt_regs *regs)
|
||||
if (sch->driver && sch->driver->irq)
|
||||
sch->driver->irq(sch);
|
||||
else
|
||||
kstat_cpu(smp_processor_id()).irqs[IOINT_CIO]++;
|
||||
inc_irq_stat(IRQIO_CIO);
|
||||
} else
|
||||
kstat_cpu(smp_processor_id()).irqs[IOINT_CIO]++;
|
||||
inc_irq_stat(IRQIO_CIO);
|
||||
spin_unlock(sch->lock);
|
||||
/*
|
||||
* Are more interrupts pending?
|
||||
@ -678,7 +678,7 @@ static void cio_tsch(struct subchannel *sch)
|
||||
if (sch->driver && sch->driver->irq)
|
||||
sch->driver->irq(sch);
|
||||
else
|
||||
kstat_cpu(smp_processor_id()).irqs[IOINT_CIO]++;
|
||||
inc_irq_stat(IRQIO_CIO);
|
||||
if (!irq_context) {
|
||||
irq_exit();
|
||||
_local_bh_enable();
|
||||
|
@ -758,7 +758,7 @@ static int io_subchannel_initialize_dev(struct subchannel *sch,
|
||||
struct ccw_device *cdev)
|
||||
{
|
||||
cdev->private->cdev = cdev;
|
||||
cdev->private->int_class = IOINT_CIO;
|
||||
cdev->private->int_class = IRQIO_CIO;
|
||||
atomic_set(&cdev->private->onoff, 0);
|
||||
cdev->dev.parent = &sch->dev;
|
||||
cdev->dev.release = ccw_device_release;
|
||||
@ -1023,7 +1023,7 @@ static void io_subchannel_irq(struct subchannel *sch)
|
||||
if (cdev)
|
||||
dev_fsm_event(cdev, DEV_EVENT_INTERRUPT);
|
||||
else
|
||||
kstat_cpu(smp_processor_id()).irqs[IOINT_CIO]++;
|
||||
inc_irq_stat(IRQIO_CIO);
|
||||
}
|
||||
|
||||
void io_subchannel_init_config(struct subchannel *sch)
|
||||
@ -1634,7 +1634,7 @@ ccw_device_probe_console(void)
|
||||
memset(&console_private, 0, sizeof(struct ccw_device_private));
|
||||
console_cdev.private = &console_private;
|
||||
console_private.cdev = &console_cdev;
|
||||
console_private.int_class = IOINT_CIO;
|
||||
console_private.int_class = IRQIO_CIO;
|
||||
ret = ccw_device_console_enable(&console_cdev, sch);
|
||||
if (ret) {
|
||||
cio_release_console();
|
||||
@ -1715,13 +1715,13 @@ ccw_device_probe (struct device *dev)
|
||||
if (cdrv->int_class != 0)
|
||||
cdev->private->int_class = cdrv->int_class;
|
||||
else
|
||||
cdev->private->int_class = IOINT_CIO;
|
||||
cdev->private->int_class = IRQIO_CIO;
|
||||
|
||||
ret = cdrv->probe ? cdrv->probe(cdev) : -ENODEV;
|
||||
|
||||
if (ret) {
|
||||
cdev->drv = NULL;
|
||||
cdev->private->int_class = IOINT_CIO;
|
||||
cdev->private->int_class = IRQIO_CIO;
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -1755,7 +1755,7 @@ ccw_device_remove (struct device *dev)
|
||||
}
|
||||
ccw_device_set_timeout(cdev, 0);
|
||||
cdev->drv = NULL;
|
||||
cdev->private->int_class = IOINT_CIO;
|
||||
cdev->private->int_class = IRQIO_CIO;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -61,11 +61,10 @@ dev_fsm_event(struct ccw_device *cdev, enum dev_event dev_event)
|
||||
|
||||
if (dev_event == DEV_EVENT_INTERRUPT) {
|
||||
if (state == DEV_STATE_ONLINE)
|
||||
kstat_cpu(smp_processor_id()).
|
||||
irqs[cdev->private->int_class]++;
|
||||
inc_irq_stat(cdev->private->int_class);
|
||||
else if (state != DEV_STATE_CMFCHANGE &&
|
||||
state != DEV_STATE_CMFUPDATE)
|
||||
kstat_cpu(smp_processor_id()).irqs[IOINT_CIO]++;
|
||||
inc_irq_stat(IRQIO_CIO);
|
||||
}
|
||||
dev_jumptable[state][dev_event](cdev, dev_event);
|
||||
}
|
||||
|
@ -139,7 +139,7 @@ static void eadm_subchannel_irq(struct subchannel *sch)
|
||||
EADM_LOG(6, "irq");
|
||||
EADM_LOG_HEX(6, irb, sizeof(*irb));
|
||||
|
||||
kstat_cpu(smp_processor_id()).irqs[IOINT_ADM]++;
|
||||
inc_irq_stat(IRQIO_ADM);
|
||||
|
||||
if ((scsw->stctl & (SCSW_STCTL_ALERT_STATUS | SCSW_STCTL_STATUS_PEND))
|
||||
&& scsw->eswf == 1 && irb->esw.eadm.erw.r)
|
||||
|
@ -182,7 +182,7 @@ static void tiqdio_thinint_handler(void *alsi, void *data)
|
||||
struct qdio_q *q;
|
||||
|
||||
last_ai_time = S390_lowcore.int_clock;
|
||||
kstat_cpu(smp_processor_id()).irqs[IOINT_QAI]++;
|
||||
inc_irq_stat(IRQIO_QAI);
|
||||
|
||||
/* protect tiq_list entries, only changed in activate or shutdown */
|
||||
rcu_read_lock();
|
||||
|
@ -1272,7 +1272,7 @@ out:
|
||||
|
||||
static void ap_interrupt_handler(void *unused1, void *unused2)
|
||||
{
|
||||
kstat_cpu(smp_processor_id()).irqs[IOINT_APB]++;
|
||||
inc_irq_stat(IRQIO_APB);
|
||||
tasklet_schedule(&ap_tasklet);
|
||||
}
|
||||
|
||||
|
@ -392,7 +392,7 @@ static void kvm_extint_handler(struct ext_code ext_code,
|
||||
|
||||
if ((ext_code.subcode & 0xff00) != VIRTIO_SUBCODE_64)
|
||||
return;
|
||||
kstat_cpu(smp_processor_id()).irqs[EXTINT_VRT]++;
|
||||
inc_irq_stat(IRQEXT_VRT);
|
||||
|
||||
/* The LSB might be overloaded, we have to mask it */
|
||||
vq = (struct virtqueue *)(param64 & ~1UL);
|
||||
|
@ -282,7 +282,7 @@ static struct ccw_driver claw_ccw_driver = {
|
||||
.ids = claw_ids,
|
||||
.probe = ccwgroup_probe_ccwdev,
|
||||
.remove = ccwgroup_remove_ccwdev,
|
||||
.int_class = IOINT_CLW,
|
||||
.int_class = IRQIO_CLW,
|
||||
};
|
||||
|
||||
static ssize_t claw_driver_group_store(struct device_driver *ddrv,
|
||||
|
@ -1755,7 +1755,7 @@ static struct ccw_driver ctcm_ccw_driver = {
|
||||
.ids = ctcm_ids,
|
||||
.probe = ccwgroup_probe_ccwdev,
|
||||
.remove = ccwgroup_remove_ccwdev,
|
||||
.int_class = IOINT_CTC,
|
||||
.int_class = IRQIO_CTC,
|
||||
};
|
||||
|
||||
static struct ccwgroup_driver ctcm_group_driver = {
|
||||
|
@ -2384,7 +2384,7 @@ static struct ccw_driver lcs_ccw_driver = {
|
||||
.ids = lcs_ids,
|
||||
.probe = ccwgroup_probe_ccwdev,
|
||||
.remove = ccwgroup_remove_ccwdev,
|
||||
.int_class = IOINT_LCS,
|
||||
.int_class = IRQIO_LCS,
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -1806,7 +1806,7 @@ static void iucv_external_interrupt(struct ext_code ext_code,
|
||||
struct iucv_irq_data *p;
|
||||
struct iucv_irq_list *work;
|
||||
|
||||
kstat_cpu(smp_processor_id()).irqs[EXTINT_IUC]++;
|
||||
inc_irq_stat(IRQEXT_IUC);
|
||||
p = iucv_irq_data[smp_processor_id()];
|
||||
if (p->ippathid >= iucv_max_pathid) {
|
||||
WARN_ON(p->ippathid >= iucv_max_pathid);
|
||||
|
Loading…
Reference in New Issue
Block a user