mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-22 09:22:37 +00:00
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux
Pull s390 patches from Martin Schwidefsky: "Add the finit_module system call, fix the irq statistics in /proc/stat, fix a s390dbf lockdep problem, a patch revert for a problem that is not 100% understood yet, and a few patches to fix warnings." * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux: s390/pci: define read*_relaxed functions s390/topology: export cpu_topology s390/pm: export pm_power_off s390/pci: define isa_dma_bridge_buggy s390/3215: partially revert tty close handling fix s390/irq: count cpu restart events s390/irq: remove split irq fields from /proc/stat s390/irq: enable irq sum accounting for /proc/stat again s390/syscalls: wire up finit_module syscall s390/pci: remove dead code s390/smp: fix section mismatch for smp_add_present_cpu() s390/debug: Fix s390dbf lockdep problem in debug_(un)register_view()
This commit is contained in:
commit
7be72c3954
@ -10,4 +10,10 @@
|
|||||||
*/
|
*/
|
||||||
#define MAX_DMA_ADDRESS 0x80000000
|
#define MAX_DMA_ADDRESS 0x80000000
|
||||||
|
|
||||||
|
#ifdef CONFIG_PCI
|
||||||
|
extern int isa_dma_bridge_buggy;
|
||||||
|
#else
|
||||||
|
#define isa_dma_bridge_buggy (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* _ASM_S390_DMA_H */
|
#endif /* _ASM_S390_DMA_H */
|
||||||
|
@ -85,6 +85,11 @@ static inline void iounmap(volatile void __iomem *addr)
|
|||||||
#define __raw_writel zpci_write_u32
|
#define __raw_writel zpci_write_u32
|
||||||
#define __raw_writeq zpci_write_u64
|
#define __raw_writeq zpci_write_u64
|
||||||
|
|
||||||
|
#define readb_relaxed readb
|
||||||
|
#define readw_relaxed readw
|
||||||
|
#define readl_relaxed readl
|
||||||
|
#define readq_relaxed readq
|
||||||
|
|
||||||
#endif /* CONFIG_PCI */
|
#endif /* CONFIG_PCI */
|
||||||
|
|
||||||
#include <asm-generic/io.h>
|
#include <asm-generic/io.h>
|
||||||
|
@ -2,43 +2,61 @@
|
|||||||
#define _ASM_IRQ_H
|
#define _ASM_IRQ_H
|
||||||
|
|
||||||
#include <linux/hardirq.h>
|
#include <linux/hardirq.h>
|
||||||
|
#include <linux/percpu.h>
|
||||||
|
#include <linux/cache.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
|
|
||||||
enum interruption_class {
|
enum interruption_main_class {
|
||||||
EXTERNAL_INTERRUPT,
|
EXTERNAL_INTERRUPT,
|
||||||
IO_INTERRUPT,
|
IO_INTERRUPT,
|
||||||
EXTINT_CLK,
|
NR_IRQS
|
||||||
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,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
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,
|
||||||
|
CPU_RST,
|
||||||
|
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 {
|
struct ext_code {
|
||||||
unsigned short subcode;
|
unsigned short subcode;
|
||||||
unsigned short code;
|
unsigned short code;
|
||||||
|
@ -279,7 +279,8 @@
|
|||||||
#define __NR_process_vm_writev 341
|
#define __NR_process_vm_writev 341
|
||||||
#define __NR_s390_runtime_instr 342
|
#define __NR_s390_runtime_instr 342
|
||||||
#define __NR_kcmp 343
|
#define __NR_kcmp 343
|
||||||
#define NR_syscalls 344
|
#define __NR_finit_module 344
|
||||||
|
#define NR_syscalls 345
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* There are some system calls that are not present on 64 bit, some
|
* There are some system calls that are not present on 64 bit, some
|
||||||
|
@ -1659,3 +1659,9 @@ ENTRY(sys_kcmp_wrapper)
|
|||||||
llgfr %r5,%r5 # unsigned long
|
llgfr %r5,%r5 # unsigned long
|
||||||
llgfr %r6,%r6 # unsigned long
|
llgfr %r6,%r6 # unsigned long
|
||||||
jg sys_kcmp
|
jg sys_kcmp
|
||||||
|
|
||||||
|
ENTRY(sys_finit_module_wrapper)
|
||||||
|
lgfr %r2,%r2 # int
|
||||||
|
llgtr %r3,%r3 # const char __user *
|
||||||
|
lgfr %r4,%r4 # int
|
||||||
|
jg sys_finit_module
|
||||||
|
@ -1127,13 +1127,14 @@ debug_register_view(debug_info_t * id, struct debug_view *view)
|
|||||||
if (i == DEBUG_MAX_VIEWS) {
|
if (i == DEBUG_MAX_VIEWS) {
|
||||||
pr_err("Registering view %s/%s would exceed the maximum "
|
pr_err("Registering view %s/%s would exceed the maximum "
|
||||||
"number of views %i\n", id->name, view->name, i);
|
"number of views %i\n", id->name, view->name, i);
|
||||||
debugfs_remove(pde);
|
|
||||||
rc = -1;
|
rc = -1;
|
||||||
} else {
|
} else {
|
||||||
id->views[i] = view;
|
id->views[i] = view;
|
||||||
id->debugfs_entries[i] = pde;
|
id->debugfs_entries[i] = pde;
|
||||||
}
|
}
|
||||||
spin_unlock_irqrestore(&id->lock, flags);
|
spin_unlock_irqrestore(&id->lock, flags);
|
||||||
|
if (rc)
|
||||||
|
debugfs_remove(pde);
|
||||||
out:
|
out:
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@ -1146,9 +1147,9 @@ EXPORT_SYMBOL(debug_register_view);
|
|||||||
int
|
int
|
||||||
debug_unregister_view(debug_info_t * id, struct debug_view *view)
|
debug_unregister_view(debug_info_t * id, struct debug_view *view)
|
||||||
{
|
{
|
||||||
int rc = 0;
|
struct dentry *dentry = NULL;
|
||||||
int i;
|
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
int i, rc = 0;
|
||||||
|
|
||||||
if (!id)
|
if (!id)
|
||||||
goto out;
|
goto out;
|
||||||
@ -1160,10 +1161,12 @@ debug_unregister_view(debug_info_t * id, struct debug_view *view)
|
|||||||
if (i == DEBUG_MAX_VIEWS)
|
if (i == DEBUG_MAX_VIEWS)
|
||||||
rc = -1;
|
rc = -1;
|
||||||
else {
|
else {
|
||||||
debugfs_remove(id->debugfs_entries[i]);
|
dentry = id->debugfs_entries[i];
|
||||||
id->views[i] = NULL;
|
id->views[i] = NULL;
|
||||||
|
id->debugfs_entries[i] = NULL;
|
||||||
}
|
}
|
||||||
spin_unlock_irqrestore(&id->lock, flags);
|
spin_unlock_irqrestore(&id->lock, flags);
|
||||||
|
debugfs_remove(dentry);
|
||||||
out:
|
out:
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
@ -24,43 +24,65 @@
|
|||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
#include "entry.h"
|
#include "entry.h"
|
||||||
|
|
||||||
|
DEFINE_PER_CPU_SHARED_ALIGNED(struct irq_stat, irq_stat);
|
||||||
|
EXPORT_PER_CPU_SYMBOL_GPL(irq_stat);
|
||||||
|
|
||||||
struct irq_class {
|
struct irq_class {
|
||||||
char *name;
|
char *name;
|
||||||
char *desc;
|
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"},
|
[EXTERNAL_INTERRUPT] = {.name = "EXT"},
|
||||||
[IO_INTERRUPT] = {.name = "I/O"},
|
[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"},
|
* The list of split external and I/O interrupts that appear only in
|
||||||
[EXTINT_TLA] = {.name = "TAL", .desc = "[EXT] Timing Alert"},
|
* /proc/interrupts.
|
||||||
[EXTINT_PFL] = {.name = "PFL", .desc = "[EXT] Pseudo Page Fault"},
|
* In addition this list contains non external / I/O events like NMIs.
|
||||||
[EXTINT_DSD] = {.name = "DSD", .desc = "[EXT] DASD Diag"},
|
*/
|
||||||
[EXTINT_VRT] = {.name = "VRT", .desc = "[EXT] Virtio"},
|
static const struct irq_class irqclass_sub_desc[NR_ARCH_IRQS] = {
|
||||||
[EXTINT_SCP] = {.name = "SCP", .desc = "[EXT] Service Call"},
|
[IRQEXT_CLK] = {.name = "CLK", .desc = "[EXT] Clock Comparator"},
|
||||||
[EXTINT_IUC] = {.name = "IUC", .desc = "[EXT] IUCV"},
|
[IRQEXT_EXC] = {.name = "EXC", .desc = "[EXT] External Call"},
|
||||||
[EXTINT_CMS] = {.name = "CMS", .desc = "[EXT] CPU-Measurement: Sampling"},
|
[IRQEXT_EMS] = {.name = "EMS", .desc = "[EXT] Emergency Signal"},
|
||||||
[EXTINT_CMC] = {.name = "CMC", .desc = "[EXT] CPU-Measurement: Counter"},
|
[IRQEXT_TMR] = {.name = "TMR", .desc = "[EXT] CPU Timer"},
|
||||||
[EXTINT_CMR] = {.name = "CMR", .desc = "[EXT] CPU-Measurement: RI"},
|
[IRQEXT_TLA] = {.name = "TAL", .desc = "[EXT] Timing Alert"},
|
||||||
[IOINT_CIO] = {.name = "CIO", .desc = "[I/O] Common I/O Layer Interrupt"},
|
[IRQEXT_PFL] = {.name = "PFL", .desc = "[EXT] Pseudo Page Fault"},
|
||||||
[IOINT_QAI] = {.name = "QAI", .desc = "[I/O] QDIO Adapter Interrupt"},
|
[IRQEXT_DSD] = {.name = "DSD", .desc = "[EXT] DASD Diag"},
|
||||||
[IOINT_DAS] = {.name = "DAS", .desc = "[I/O] DASD"},
|
[IRQEXT_VRT] = {.name = "VRT", .desc = "[EXT] Virtio"},
|
||||||
[IOINT_C15] = {.name = "C15", .desc = "[I/O] 3215"},
|
[IRQEXT_SCP] = {.name = "SCP", .desc = "[EXT] Service Call"},
|
||||||
[IOINT_C70] = {.name = "C70", .desc = "[I/O] 3270"},
|
[IRQEXT_IUC] = {.name = "IUC", .desc = "[EXT] IUCV"},
|
||||||
[IOINT_TAP] = {.name = "TAP", .desc = "[I/O] Tape"},
|
[IRQEXT_CMS] = {.name = "CMS", .desc = "[EXT] CPU-Measurement: Sampling"},
|
||||||
[IOINT_VMR] = {.name = "VMR", .desc = "[I/O] Unit Record Devices"},
|
[IRQEXT_CMC] = {.name = "CMC", .desc = "[EXT] CPU-Measurement: Counter"},
|
||||||
[IOINT_LCS] = {.name = "LCS", .desc = "[I/O] LCS"},
|
[IRQEXT_CMR] = {.name = "CMR", .desc = "[EXT] CPU-Measurement: RI"},
|
||||||
[IOINT_CLW] = {.name = "CLW", .desc = "[I/O] CLAW"},
|
[IRQIO_CIO] = {.name = "CIO", .desc = "[I/O] Common I/O Layer Interrupt"},
|
||||||
[IOINT_CTC] = {.name = "CTC", .desc = "[I/O] CTC"},
|
[IRQIO_QAI] = {.name = "QAI", .desc = "[I/O] QDIO Adapter Interrupt"},
|
||||||
[IOINT_APB] = {.name = "APB", .desc = "[I/O] AP Bus"},
|
[IRQIO_DAS] = {.name = "DAS", .desc = "[I/O] DASD"},
|
||||||
[IOINT_ADM] = {.name = "ADM", .desc = "[I/O] EADM Subchannel"},
|
[IRQIO_C15] = {.name = "C15", .desc = "[I/O] 3215"},
|
||||||
[IOINT_CSC] = {.name = "CSC", .desc = "[I/O] CHSC Subchannel"},
|
[IRQIO_C70] = {.name = "C70", .desc = "[I/O] 3270"},
|
||||||
[IOINT_PCI] = {.name = "PCI", .desc = "[I/O] PCI Interrupt" },
|
[IRQIO_TAP] = {.name = "TAP", .desc = "[I/O] Tape"},
|
||||||
[IOINT_MSI] = {.name = "MSI", .desc = "[I/O] MSI Interrupt" },
|
[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"},
|
[NMI_NMI] = {.name = "NMI", .desc = "[NMI] Machine Check"},
|
||||||
|
[CPU_RST] = {.name = "RST", .desc = "[CPU] CPU Restart"},
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -68,30 +90,34 @@ static const struct irq_class intrclass_names[] = {
|
|||||||
*/
|
*/
|
||||||
int show_interrupts(struct seq_file *p, void *v)
|
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();
|
get_online_cpus();
|
||||||
if (i == 0) {
|
if (irq == 0) {
|
||||||
seq_puts(p, " ");
|
seq_puts(p, " ");
|
||||||
for_each_online_cpu(j)
|
for_each_online_cpu(cpu)
|
||||||
seq_printf(p, "CPU%d ",j);
|
seq_printf(p, "CPU%d ", cpu);
|
||||||
seq_putc(p, '\n');
|
seq_putc(p, '\n');
|
||||||
}
|
}
|
||||||
|
if (irq < NR_IRQS) {
|
||||||
if (i < NR_IRQS) {
|
seq_printf(p, "%s: ", irqclass_main_desc[irq].name);
|
||||||
seq_printf(p, "%s: ", intrclass_names[i].name);
|
for_each_online_cpu(cpu)
|
||||||
#ifndef CONFIG_SMP
|
seq_printf(p, "%10u ", kstat_cpu(cpu).irqs[irq]);
|
||||||
seq_printf(p, "%10u ", kstat_irqs(i));
|
seq_putc(p, '\n');
|
||||||
#else
|
goto skip_arch_irqs;
|
||||||
for_each_online_cpu(j)
|
}
|
||||||
seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]);
|
for (irq = 0; irq < NR_ARCH_IRQS; irq++) {
|
||||||
#endif
|
seq_printf(p, "%s: ", irqclass_sub_desc[irq].name);
|
||||||
if (intrclass_names[i].desc)
|
for_each_online_cpu(cpu)
|
||||||
seq_printf(p, " %s", intrclass_names[i].desc);
|
seq_printf(p, "%10u ", per_cpu(irq_stat, cpu).irqs[irq]);
|
||||||
seq_putc(p, '\n');
|
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();
|
put_online_cpus();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -222,7 +248,7 @@ void __irq_entry do_extint(struct pt_regs *regs, struct ext_code ext_code,
|
|||||||
/* Serve timer interrupts first. */
|
/* Serve timer interrupts first. */
|
||||||
clock_comparator_work();
|
clock_comparator_work();
|
||||||
}
|
}
|
||||||
kstat_cpu(smp_processor_id()).irqs[EXTERNAL_INTERRUPT]++;
|
kstat_incr_irqs_this_cpu(EXTERNAL_INTERRUPT, NULL);
|
||||||
if (ext_code.code != 0x1004)
|
if (ext_code.code != 0x1004)
|
||||||
__get_cpu_var(s390_idle).nohz_delay = 1;
|
__get_cpu_var(s390_idle).nohz_delay = 1;
|
||||||
|
|
||||||
|
@ -254,7 +254,7 @@ void notrace s390_do_machine_check(struct pt_regs *regs)
|
|||||||
int umode;
|
int umode;
|
||||||
|
|
||||||
nmi_enter();
|
nmi_enter();
|
||||||
kstat_cpu(smp_processor_id()).irqs[NMI_NMI]++;
|
inc_irq_stat(NMI_NMI);
|
||||||
mci = (struct mci *) &S390_lowcore.mcck_interruption_code;
|
mci = (struct mci *) &S390_lowcore.mcck_interruption_code;
|
||||||
mcck = &__get_cpu_var(cpu_mcck);
|
mcck = &__get_cpu_var(cpu_mcck);
|
||||||
umode = user_mode(regs);
|
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))
|
if (!(alert & CPU_MF_INT_CF_MASK))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
kstat_cpu(smp_processor_id()).irqs[EXTINT_CMC]++;
|
inc_irq_stat(IRQEXT_CMC);
|
||||||
cpuhw = &__get_cpu_var(cpu_hw_events);
|
cpuhw = &__get_cpu_var(cpu_hw_events);
|
||||||
|
|
||||||
/* Measurement alerts are shared and might happen when the PMU
|
/* 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))
|
if (!(param32 & CPU_MF_INT_RI_MASK))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
kstat_cpu(smp_processor_id()).irqs[EXTINT_CMR]++;
|
inc_irq_stat(IRQEXT_CMR);
|
||||||
|
|
||||||
if (!current->thread.ri_cb)
|
if (!current->thread.ri_cb)
|
||||||
return;
|
return;
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
|
#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
|
||||||
|
|
||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
#include <linux/module.h>
|
#include <linux/export.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/memblock.h>
|
#include <linux/memblock.h>
|
||||||
@ -289,6 +289,7 @@ void machine_power_off(void)
|
|||||||
* Dummy power off function.
|
* Dummy power off function.
|
||||||
*/
|
*/
|
||||||
void (*pm_power_off)(void) = machine_power_off;
|
void (*pm_power_off)(void) = machine_power_off;
|
||||||
|
EXPORT_SYMBOL_GPL(pm_power_off);
|
||||||
|
|
||||||
static int __init early_parse_mem(char *p)
|
static int __init early_parse_mem(char *p)
|
||||||
{
|
{
|
||||||
|
@ -433,9 +433,9 @@ static void do_ext_call_interrupt(struct ext_code ext_code,
|
|||||||
|
|
||||||
cpu = smp_processor_id();
|
cpu = smp_processor_id();
|
||||||
if (ext_code.code == 0x1202)
|
if (ext_code.code == 0x1202)
|
||||||
kstat_cpu(cpu).irqs[EXTINT_EXC]++;
|
inc_irq_stat(IRQEXT_EXC);
|
||||||
else
|
else
|
||||||
kstat_cpu(cpu).irqs[EXTINT_EMS]++;
|
inc_irq_stat(IRQEXT_EMS);
|
||||||
/*
|
/*
|
||||||
* handle bit signal external calls
|
* handle bit signal external calls
|
||||||
*/
|
*/
|
||||||
@ -623,9 +623,10 @@ static struct sclp_cpu_info *smp_get_cpu_info(void)
|
|||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int smp_add_present_cpu(int cpu);
|
static int __cpuinit smp_add_present_cpu(int cpu);
|
||||||
|
|
||||||
static int __smp_rescan_cpus(struct sclp_cpu_info *info, int sysfs_add)
|
static int __cpuinit __smp_rescan_cpus(struct sclp_cpu_info *info,
|
||||||
|
int sysfs_add)
|
||||||
{
|
{
|
||||||
struct pcpu *pcpu;
|
struct pcpu *pcpu;
|
||||||
cpumask_t avail;
|
cpumask_t avail;
|
||||||
@ -708,6 +709,7 @@ static void __cpuinit smp_start_secondary(void *cpuvoid)
|
|||||||
pfault_init();
|
pfault_init();
|
||||||
notify_cpu_starting(smp_processor_id());
|
notify_cpu_starting(smp_processor_id());
|
||||||
set_cpu_online(smp_processor_id(), true);
|
set_cpu_online(smp_processor_id(), true);
|
||||||
|
inc_irq_stat(CPU_RST);
|
||||||
local_irq_enable();
|
local_irq_enable();
|
||||||
/* cpu_idle will call schedule for us */
|
/* cpu_idle will call schedule for us */
|
||||||
cpu_idle();
|
cpu_idle();
|
||||||
@ -985,7 +987,7 @@ static int __cpuinit smp_cpu_notify(struct notifier_block *self,
|
|||||||
return notifier_from_errno(err);
|
return notifier_from_errno(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int smp_add_present_cpu(int cpu)
|
static int __cpuinit smp_add_present_cpu(int cpu)
|
||||||
{
|
{
|
||||||
struct cpu *c = &pcpu_devices[cpu].cpu;
|
struct cpu *c = &pcpu_devices[cpu].cpu;
|
||||||
struct device *s = &c->dev;
|
struct device *s = &c->dev;
|
||||||
|
@ -352,3 +352,4 @@ SYSCALL(sys_process_vm_readv,sys_process_vm_readv,compat_sys_process_vm_readv_wr
|
|||||||
SYSCALL(sys_process_vm_writev,sys_process_vm_writev,compat_sys_process_vm_writev_wrapper)
|
SYSCALL(sys_process_vm_writev,sys_process_vm_writev,compat_sys_process_vm_writev_wrapper)
|
||||||
SYSCALL(sys_ni_syscall,sys_s390_runtime_instr,sys_s390_runtime_instr_wrapper)
|
SYSCALL(sys_ni_syscall,sys_s390_runtime_instr,sys_s390_runtime_instr_wrapper)
|
||||||
SYSCALL(sys_kcmp,sys_kcmp,sys_kcmp_wrapper)
|
SYSCALL(sys_kcmp,sys_kcmp,sys_kcmp_wrapper)
|
||||||
|
SYSCALL(sys_finit_module,sys_finit_module,sys_finit_module_wrapper)
|
||||||
|
@ -168,7 +168,7 @@ static void clock_comparator_interrupt(struct ext_code ext_code,
|
|||||||
unsigned int param32,
|
unsigned int param32,
|
||||||
unsigned long param64)
|
unsigned long param64)
|
||||||
{
|
{
|
||||||
kstat_cpu(smp_processor_id()).irqs[EXTINT_CLK]++;
|
inc_irq_stat(IRQEXT_CLK);
|
||||||
if (S390_lowcore.clock_comparator == -1ULL)
|
if (S390_lowcore.clock_comparator == -1ULL)
|
||||||
set_clock_comparator(S390_lowcore.clock_comparator);
|
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,
|
static void timing_alert_interrupt(struct ext_code ext_code,
|
||||||
unsigned int param32, unsigned long param64)
|
unsigned int param32, unsigned long param64)
|
||||||
{
|
{
|
||||||
kstat_cpu(smp_processor_id()).irqs[EXTINT_TLA]++;
|
inc_irq_stat(IRQEXT_TLA);
|
||||||
if (param32 & 0x00c40000)
|
if (param32 & 0x00c40000)
|
||||||
etr_timing_alert((struct etr_irq_parm *) ¶m32);
|
etr_timing_alert((struct etr_irq_parm *) ¶m32);
|
||||||
if (param32 & 0x00038000)
|
if (param32 & 0x00038000)
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
#include <linux/bootmem.h>
|
#include <linux/bootmem.h>
|
||||||
#include <linux/cpuset.h>
|
#include <linux/cpuset.h>
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
|
#include <linux/export.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
@ -42,6 +43,7 @@ static struct mask_info socket_info;
|
|||||||
static struct mask_info book_info;
|
static struct mask_info book_info;
|
||||||
|
|
||||||
struct cpu_topology_s390 cpu_topology[NR_CPUS];
|
struct cpu_topology_s390 cpu_topology[NR_CPUS];
|
||||||
|
EXPORT_SYMBOL_GPL(cpu_topology);
|
||||||
|
|
||||||
static cpumask_t cpu_group_map(struct mask_info *info, unsigned int cpu)
|
static cpumask_t cpu_group_map(struct mask_info *info, unsigned int cpu)
|
||||||
{
|
{
|
||||||
|
@ -569,7 +569,7 @@ static void pfault_interrupt(struct ext_code ext_code,
|
|||||||
subcode = ext_code.subcode;
|
subcode = ext_code.subcode;
|
||||||
if ((subcode & 0xff00) != __SUBCODE_MASK)
|
if ((subcode & 0xff00) != __SUBCODE_MASK)
|
||||||
return;
|
return;
|
||||||
kstat_cpu(smp_processor_id()).irqs[EXTINT_PFL]++;
|
inc_irq_stat(IRQEXT_PFL);
|
||||||
/* Get the token (= pid of the affected task). */
|
/* Get the token (= pid of the affected task). */
|
||||||
pid = sizeof(void *) == 4 ? param32 : param64;
|
pid = sizeof(void *) == 4 ? param32 : param64;
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
|
@ -233,7 +233,7 @@ static void hws_ext_handler(struct ext_code ext_code,
|
|||||||
if (!(param32 & CPU_MF_INT_SF_MASK))
|
if (!(param32 & CPU_MF_INT_SF_MASK))
|
||||||
return;
|
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);
|
atomic_xchg(&cb->ext_params, atomic_read(&cb->ext_params) | param32);
|
||||||
|
|
||||||
if (hws_wq)
|
if (hws_wq)
|
||||||
|
@ -160,35 +160,6 @@ int pci_proc_domain(struct pci_bus *bus)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(pci_proc_domain);
|
EXPORT_SYMBOL_GPL(pci_proc_domain);
|
||||||
|
|
||||||
/* Store PCI function information block */
|
|
||||||
static int zpci_store_fib(struct zpci_dev *zdev, u8 *fc)
|
|
||||||
{
|
|
||||||
struct zpci_fib *fib;
|
|
||||||
u8 status, cc;
|
|
||||||
|
|
||||||
fib = (void *) get_zeroed_page(GFP_KERNEL);
|
|
||||||
if (!fib)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
do {
|
|
||||||
cc = __stpcifc(zdev->fh, 0, fib, &status);
|
|
||||||
if (cc == 2) {
|
|
||||||
msleep(ZPCI_INSN_BUSY_DELAY);
|
|
||||||
memset(fib, 0, PAGE_SIZE);
|
|
||||||
}
|
|
||||||
} while (cc == 2);
|
|
||||||
|
|
||||||
if (cc)
|
|
||||||
pr_err_once("%s: cc: %u status: %u\n",
|
|
||||||
__func__, cc, status);
|
|
||||||
|
|
||||||
/* Return PCI function controls */
|
|
||||||
*fc = fib->fc;
|
|
||||||
|
|
||||||
free_page((unsigned long) fib);
|
|
||||||
return (cc) ? -EIO : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Modify PCI: Register adapter interruptions */
|
/* Modify PCI: Register adapter interruptions */
|
||||||
static int zpci_register_airq(struct zpci_dev *zdev, unsigned int aisb,
|
static int zpci_register_airq(struct zpci_dev *zdev, unsigned int aisb,
|
||||||
u64 aibv)
|
u64 aibv)
|
||||||
@ -469,7 +440,7 @@ static void zpci_irq_handler(void *dont, void *need)
|
|||||||
int rescan = 0, max = aisb_max;
|
int rescan = 0, max = aisb_max;
|
||||||
struct zdev_irq_map *imap;
|
struct zdev_irq_map *imap;
|
||||||
|
|
||||||
kstat_cpu(smp_processor_id()).irqs[IOINT_PCI]++;
|
inc_irq_stat(IRQIO_PCI);
|
||||||
sbit = start;
|
sbit = start;
|
||||||
|
|
||||||
scan:
|
scan:
|
||||||
@ -481,7 +452,7 @@ scan:
|
|||||||
/* find vector bit */
|
/* find vector bit */
|
||||||
imap = bucket->imap[sbit];
|
imap = bucket->imap[sbit];
|
||||||
for_each_set_bit_left(mbit, &imap->aibv, imap->msi_vecs) {
|
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);
|
clear_bit(63 - mbit, &imap->aibv);
|
||||||
|
|
||||||
spin_lock(&imap->lock);
|
spin_lock(&imap->lock);
|
||||||
|
@ -13,8 +13,6 @@
|
|||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
#include <asm/pci_dma.h>
|
#include <asm/pci_dma.h>
|
||||||
|
|
||||||
static enum zpci_ioat_dtype zpci_ioat_dt = ZPCI_IOTA_RTTO;
|
|
||||||
|
|
||||||
static struct kmem_cache *dma_region_table_cache;
|
static struct kmem_cache *dma_region_table_cache;
|
||||||
static struct kmem_cache *dma_page_table_cache;
|
static struct kmem_cache *dma_page_table_cache;
|
||||||
|
|
||||||
|
@ -248,7 +248,7 @@ static void dasd_ext_handler(struct ext_code ext_code,
|
|||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
kstat_cpu(smp_processor_id()).irqs[EXTINT_DSD]++;
|
inc_irq_stat(IRQEXT_DSD);
|
||||||
if (!ip) { /* no intparm: unsolicited interrupt */
|
if (!ip) { /* no intparm: unsolicited interrupt */
|
||||||
DBF_EVENT(DBF_NOTICE, "%s", "caught unsolicited "
|
DBF_EVENT(DBF_NOTICE, "%s", "caught unsolicited "
|
||||||
"interrupt");
|
"interrupt");
|
||||||
|
@ -4274,7 +4274,7 @@ static struct ccw_driver dasd_eckd_driver = {
|
|||||||
.thaw = dasd_generic_restore_device,
|
.thaw = dasd_generic_restore_device,
|
||||||
.restore = dasd_generic_restore_device,
|
.restore = dasd_generic_restore_device,
|
||||||
.uc_handler = dasd_generic_uc_handler,
|
.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,
|
.freeze = dasd_generic_pm_freeze,
|
||||||
.thaw = dasd_generic_restore_device,
|
.thaw = dasd_generic_restore_device,
|
||||||
.restore = dasd_generic_restore_device,
|
.restore = dasd_generic_restore_device,
|
||||||
.int_class = IOINT_DAS,
|
.int_class = IRQIO_DAS,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -44,6 +44,7 @@
|
|||||||
#define RAW3215_NR_CCWS 3
|
#define RAW3215_NR_CCWS 3
|
||||||
#define RAW3215_TIMEOUT HZ/10 /* time for delayed output */
|
#define RAW3215_TIMEOUT HZ/10 /* time for delayed output */
|
||||||
|
|
||||||
|
#define RAW3215_FIXED 1 /* 3215 console device is not be freed */
|
||||||
#define RAW3215_WORKING 4 /* set if a request is being worked on */
|
#define RAW3215_WORKING 4 /* set if a request is being worked on */
|
||||||
#define RAW3215_THROTTLED 8 /* set if reading is disabled */
|
#define RAW3215_THROTTLED 8 /* set if reading is disabled */
|
||||||
#define RAW3215_STOPPED 16 /* set if writing is disabled */
|
#define RAW3215_STOPPED 16 /* set if writing is disabled */
|
||||||
@ -630,7 +631,8 @@ static void raw3215_shutdown(struct raw3215_info *raw)
|
|||||||
DECLARE_WAITQUEUE(wait, current);
|
DECLARE_WAITQUEUE(wait, current);
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
if (!(raw->port.flags & ASYNC_INITIALIZED))
|
if (!(raw->port.flags & ASYNC_INITIALIZED) ||
|
||||||
|
(raw->flags & RAW3215_FIXED))
|
||||||
return;
|
return;
|
||||||
/* Wait for outstanding requests, then free irq */
|
/* Wait for outstanding requests, then free irq */
|
||||||
spin_lock_irqsave(get_ccwdev_lock(raw->cdev), flags);
|
spin_lock_irqsave(get_ccwdev_lock(raw->cdev), flags);
|
||||||
@ -805,7 +807,7 @@ static struct ccw_driver raw3215_ccw_driver = {
|
|||||||
.freeze = &raw3215_pm_stop,
|
.freeze = &raw3215_pm_stop,
|
||||||
.thaw = &raw3215_pm_start,
|
.thaw = &raw3215_pm_start,
|
||||||
.restore = &raw3215_pm_start,
|
.restore = &raw3215_pm_start,
|
||||||
.int_class = IOINT_C15,
|
.int_class = IRQIO_C15,
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef CONFIG_TN3215_CONSOLE
|
#ifdef CONFIG_TN3215_CONSOLE
|
||||||
@ -927,6 +929,8 @@ static int __init con3215_init(void)
|
|||||||
dev_set_drvdata(&cdev->dev, raw);
|
dev_set_drvdata(&cdev->dev, raw);
|
||||||
cdev->handler = raw3215_irq;
|
cdev->handler = raw3215_irq;
|
||||||
|
|
||||||
|
raw->flags |= RAW3215_FIXED;
|
||||||
|
|
||||||
/* Request the console irq */
|
/* Request the console irq */
|
||||||
if (raw3215_startup(raw) != 0) {
|
if (raw3215_startup(raw) != 0) {
|
||||||
raw3215_free_info(raw);
|
raw3215_free_info(raw);
|
||||||
|
@ -1396,7 +1396,7 @@ static struct ccw_driver raw3270_ccw_driver = {
|
|||||||
.freeze = &raw3270_pm_stop,
|
.freeze = &raw3270_pm_stop,
|
||||||
.thaw = &raw3270_pm_start,
|
.thaw = &raw3270_pm_start,
|
||||||
.restore = &raw3270_pm_start,
|
.restore = &raw3270_pm_start,
|
||||||
.int_class = IOINT_C70,
|
.int_class = IRQIO_C70,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -400,7 +400,7 @@ static void sclp_interrupt_handler(struct ext_code ext_code,
|
|||||||
u32 finished_sccb;
|
u32 finished_sccb;
|
||||||
u32 evbuf_pending;
|
u32 evbuf_pending;
|
||||||
|
|
||||||
kstat_cpu(smp_processor_id()).irqs[EXTINT_SCP]++;
|
inc_irq_stat(IRQEXT_SCP);
|
||||||
spin_lock(&sclp_lock);
|
spin_lock(&sclp_lock);
|
||||||
finished_sccb = param32 & 0xfffffff8;
|
finished_sccb = param32 & 0xfffffff8;
|
||||||
evbuf_pending = param32 & 0x3;
|
evbuf_pending = param32 & 0x3;
|
||||||
@ -813,7 +813,7 @@ static void sclp_check_handler(struct ext_code ext_code,
|
|||||||
{
|
{
|
||||||
u32 finished_sccb;
|
u32 finished_sccb;
|
||||||
|
|
||||||
kstat_cpu(smp_processor_id()).irqs[EXTINT_SCP]++;
|
inc_irq_stat(IRQEXT_SCP);
|
||||||
finished_sccb = param32 & 0xfffffff8;
|
finished_sccb = param32 & 0xfffffff8;
|
||||||
/* Is this the interrupt we are waiting for? */
|
/* Is this the interrupt we are waiting for? */
|
||||||
if (finished_sccb == 0)
|
if (finished_sccb == 0)
|
||||||
|
@ -1193,7 +1193,7 @@ static struct ccw_driver tape_34xx_driver = {
|
|||||||
.set_online = tape_34xx_online,
|
.set_online = tape_34xx_online,
|
||||||
.set_offline = tape_generic_offline,
|
.set_offline = tape_generic_offline,
|
||||||
.freeze = tape_generic_pm_suspend,
|
.freeze = tape_generic_pm_suspend,
|
||||||
.int_class = IOINT_TAP,
|
.int_class = IRQIO_TAP,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -1656,7 +1656,7 @@ static struct ccw_driver tape_3590_driver = {
|
|||||||
.set_offline = tape_generic_offline,
|
.set_offline = tape_generic_offline,
|
||||||
.set_online = tape_3590_online,
|
.set_online = tape_3590_online,
|
||||||
.freeze = tape_generic_pm_suspend,
|
.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_online = ur_set_online,
|
||||||
.set_offline = ur_set_offline,
|
.set_offline = ur_set_offline,
|
||||||
.freeze = ur_pm_suspend,
|
.freeze = ur_pm_suspend,
|
||||||
.int_class = IOINT_VMR,
|
.int_class = IRQIO_VMR,
|
||||||
};
|
};
|
||||||
|
|
||||||
static DEFINE_MUTEX(vmur_mutex);
|
static DEFINE_MUTEX(vmur_mutex);
|
||||||
|
@ -58,7 +58,7 @@ static void chsc_subchannel_irq(struct subchannel *sch)
|
|||||||
|
|
||||||
CHSC_LOG(4, "irb");
|
CHSC_LOG(4, "irb");
|
||||||
CHSC_LOG_HEX(4, irb, sizeof(*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. */
|
/* Copy irb to provided request and set done. */
|
||||||
if (!request) {
|
if (!request) {
|
||||||
|
@ -611,7 +611,7 @@ void __irq_entry do_IRQ(struct pt_regs *regs)
|
|||||||
tpi_info = (struct tpi_info *)&S390_lowcore.subchannel_id;
|
tpi_info = (struct tpi_info *)&S390_lowcore.subchannel_id;
|
||||||
irb = (struct irb *)&S390_lowcore.irb;
|
irb = (struct irb *)&S390_lowcore.irb;
|
||||||
do {
|
do {
|
||||||
kstat_cpu(smp_processor_id()).irqs[IO_INTERRUPT]++;
|
kstat_incr_irqs_this_cpu(IO_INTERRUPT, NULL);
|
||||||
if (tpi_info->adapter_IO) {
|
if (tpi_info->adapter_IO) {
|
||||||
do_adapter_IO(tpi_info->isc);
|
do_adapter_IO(tpi_info->isc);
|
||||||
continue;
|
continue;
|
||||||
@ -619,7 +619,7 @@ void __irq_entry do_IRQ(struct pt_regs *regs)
|
|||||||
sch = (struct subchannel *)(unsigned long)tpi_info->intparm;
|
sch = (struct subchannel *)(unsigned long)tpi_info->intparm;
|
||||||
if (!sch) {
|
if (!sch) {
|
||||||
/* Clear pending interrupt condition. */
|
/* Clear pending interrupt condition. */
|
||||||
kstat_cpu(smp_processor_id()).irqs[IOINT_CIO]++;
|
inc_irq_stat(IRQIO_CIO);
|
||||||
tsch(tpi_info->schid, irb);
|
tsch(tpi_info->schid, irb);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -633,9 +633,9 @@ void __irq_entry do_IRQ(struct pt_regs *regs)
|
|||||||
if (sch->driver && sch->driver->irq)
|
if (sch->driver && sch->driver->irq)
|
||||||
sch->driver->irq(sch);
|
sch->driver->irq(sch);
|
||||||
else
|
else
|
||||||
kstat_cpu(smp_processor_id()).irqs[IOINT_CIO]++;
|
inc_irq_stat(IRQIO_CIO);
|
||||||
} else
|
} else
|
||||||
kstat_cpu(smp_processor_id()).irqs[IOINT_CIO]++;
|
inc_irq_stat(IRQIO_CIO);
|
||||||
spin_unlock(sch->lock);
|
spin_unlock(sch->lock);
|
||||||
/*
|
/*
|
||||||
* Are more interrupts pending?
|
* Are more interrupts pending?
|
||||||
@ -678,7 +678,7 @@ static void cio_tsch(struct subchannel *sch)
|
|||||||
if (sch->driver && sch->driver->irq)
|
if (sch->driver && sch->driver->irq)
|
||||||
sch->driver->irq(sch);
|
sch->driver->irq(sch);
|
||||||
else
|
else
|
||||||
kstat_cpu(smp_processor_id()).irqs[IOINT_CIO]++;
|
inc_irq_stat(IRQIO_CIO);
|
||||||
if (!irq_context) {
|
if (!irq_context) {
|
||||||
irq_exit();
|
irq_exit();
|
||||||
_local_bh_enable();
|
_local_bh_enable();
|
||||||
|
@ -758,7 +758,7 @@ static int io_subchannel_initialize_dev(struct subchannel *sch,
|
|||||||
struct ccw_device *cdev)
|
struct ccw_device *cdev)
|
||||||
{
|
{
|
||||||
cdev->private->cdev = cdev;
|
cdev->private->cdev = cdev;
|
||||||
cdev->private->int_class = IOINT_CIO;
|
cdev->private->int_class = IRQIO_CIO;
|
||||||
atomic_set(&cdev->private->onoff, 0);
|
atomic_set(&cdev->private->onoff, 0);
|
||||||
cdev->dev.parent = &sch->dev;
|
cdev->dev.parent = &sch->dev;
|
||||||
cdev->dev.release = ccw_device_release;
|
cdev->dev.release = ccw_device_release;
|
||||||
@ -1023,7 +1023,7 @@ static void io_subchannel_irq(struct subchannel *sch)
|
|||||||
if (cdev)
|
if (cdev)
|
||||||
dev_fsm_event(cdev, DEV_EVENT_INTERRUPT);
|
dev_fsm_event(cdev, DEV_EVENT_INTERRUPT);
|
||||||
else
|
else
|
||||||
kstat_cpu(smp_processor_id()).irqs[IOINT_CIO]++;
|
inc_irq_stat(IRQIO_CIO);
|
||||||
}
|
}
|
||||||
|
|
||||||
void io_subchannel_init_config(struct subchannel *sch)
|
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));
|
memset(&console_private, 0, sizeof(struct ccw_device_private));
|
||||||
console_cdev.private = &console_private;
|
console_cdev.private = &console_private;
|
||||||
console_private.cdev = &console_cdev;
|
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);
|
ret = ccw_device_console_enable(&console_cdev, sch);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
cio_release_console();
|
cio_release_console();
|
||||||
@ -1715,13 +1715,13 @@ ccw_device_probe (struct device *dev)
|
|||||||
if (cdrv->int_class != 0)
|
if (cdrv->int_class != 0)
|
||||||
cdev->private->int_class = cdrv->int_class;
|
cdev->private->int_class = cdrv->int_class;
|
||||||
else
|
else
|
||||||
cdev->private->int_class = IOINT_CIO;
|
cdev->private->int_class = IRQIO_CIO;
|
||||||
|
|
||||||
ret = cdrv->probe ? cdrv->probe(cdev) : -ENODEV;
|
ret = cdrv->probe ? cdrv->probe(cdev) : -ENODEV;
|
||||||
|
|
||||||
if (ret) {
|
if (ret) {
|
||||||
cdev->drv = NULL;
|
cdev->drv = NULL;
|
||||||
cdev->private->int_class = IOINT_CIO;
|
cdev->private->int_class = IRQIO_CIO;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1755,7 +1755,7 @@ ccw_device_remove (struct device *dev)
|
|||||||
}
|
}
|
||||||
ccw_device_set_timeout(cdev, 0);
|
ccw_device_set_timeout(cdev, 0);
|
||||||
cdev->drv = NULL;
|
cdev->drv = NULL;
|
||||||
cdev->private->int_class = IOINT_CIO;
|
cdev->private->int_class = IRQIO_CIO;
|
||||||
return 0;
|
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 (dev_event == DEV_EVENT_INTERRUPT) {
|
||||||
if (state == DEV_STATE_ONLINE)
|
if (state == DEV_STATE_ONLINE)
|
||||||
kstat_cpu(smp_processor_id()).
|
inc_irq_stat(cdev->private->int_class);
|
||||||
irqs[cdev->private->int_class]++;
|
|
||||||
else if (state != DEV_STATE_CMFCHANGE &&
|
else if (state != DEV_STATE_CMFCHANGE &&
|
||||||
state != DEV_STATE_CMFUPDATE)
|
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);
|
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(6, "irq");
|
||||||
EADM_LOG_HEX(6, irb, sizeof(*irb));
|
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))
|
if ((scsw->stctl & (SCSW_STCTL_ALERT_STATUS | SCSW_STCTL_STATUS_PEND))
|
||||||
&& scsw->eswf == 1 && irb->esw.eadm.erw.r)
|
&& 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;
|
struct qdio_q *q;
|
||||||
|
|
||||||
last_ai_time = S390_lowcore.int_clock;
|
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 */
|
/* protect tiq_list entries, only changed in activate or shutdown */
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
|
@ -1272,7 +1272,7 @@ out:
|
|||||||
|
|
||||||
static void ap_interrupt_handler(void *unused1, void *unused2)
|
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);
|
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)
|
if ((ext_code.subcode & 0xff00) != VIRTIO_SUBCODE_64)
|
||||||
return;
|
return;
|
||||||
kstat_cpu(smp_processor_id()).irqs[EXTINT_VRT]++;
|
inc_irq_stat(IRQEXT_VRT);
|
||||||
|
|
||||||
/* The LSB might be overloaded, we have to mask it */
|
/* The LSB might be overloaded, we have to mask it */
|
||||||
vq = (struct virtqueue *)(param64 & ~1UL);
|
vq = (struct virtqueue *)(param64 & ~1UL);
|
||||||
|
@ -282,7 +282,7 @@ static struct ccw_driver claw_ccw_driver = {
|
|||||||
.ids = claw_ids,
|
.ids = claw_ids,
|
||||||
.probe = ccwgroup_probe_ccwdev,
|
.probe = ccwgroup_probe_ccwdev,
|
||||||
.remove = ccwgroup_remove_ccwdev,
|
.remove = ccwgroup_remove_ccwdev,
|
||||||
.int_class = IOINT_CLW,
|
.int_class = IRQIO_CLW,
|
||||||
};
|
};
|
||||||
|
|
||||||
static ssize_t claw_driver_group_store(struct device_driver *ddrv,
|
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,
|
.ids = ctcm_ids,
|
||||||
.probe = ccwgroup_probe_ccwdev,
|
.probe = ccwgroup_probe_ccwdev,
|
||||||
.remove = ccwgroup_remove_ccwdev,
|
.remove = ccwgroup_remove_ccwdev,
|
||||||
.int_class = IOINT_CTC,
|
.int_class = IRQIO_CTC,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct ccwgroup_driver ctcm_group_driver = {
|
static struct ccwgroup_driver ctcm_group_driver = {
|
||||||
|
@ -2384,7 +2384,7 @@ static struct ccw_driver lcs_ccw_driver = {
|
|||||||
.ids = lcs_ids,
|
.ids = lcs_ids,
|
||||||
.probe = ccwgroup_probe_ccwdev,
|
.probe = ccwgroup_probe_ccwdev,
|
||||||
.remove = ccwgroup_remove_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_data *p;
|
||||||
struct iucv_irq_list *work;
|
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()];
|
p = iucv_irq_data[smp_processor_id()];
|
||||||
if (p->ippathid >= iucv_max_pathid) {
|
if (p->ippathid >= iucv_max_pathid) {
|
||||||
WARN_ON(p->ippathid >= iucv_max_pathid);
|
WARN_ON(p->ippathid >= iucv_max_pathid);
|
||||||
|
Loading…
Reference in New Issue
Block a user