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:
Linus Torvalds 2013-01-10 08:20:15 -08:00
commit 7be72c3954
40 changed files with 208 additions and 165 deletions

View File

@ -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 */

View File

@ -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>

View File

@ -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;

View File

@ -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

View File

@ -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

View File

@ -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;
} }

View File

@ -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;

View File

@ -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);

View File

@ -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

View File

@ -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;

View File

@ -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)
{ {

View File

@ -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;

View File

@ -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)

View File

@ -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 *) &param32); etr_timing_alert((struct etr_irq_parm *) &param32);
if (param32 & 0x00038000) if (param32 & 0x00038000)

View File

@ -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)
{ {

View File

@ -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();

View File

@ -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)

View File

@ -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);

View File

@ -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;

View File

@ -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");

View File

@ -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,
}; };
/* /*

View File

@ -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

View File

@ -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);

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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,
}; };
/* /*

View File

@ -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);

View File

@ -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) {

View File

@ -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();

View File

@ -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;
} }

View File

@ -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);
} }

View File

@ -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)

View File

@ -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();

View File

@ -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);
} }

View File

@ -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);

View File

@ -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,

View File

@ -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 = {

View File

@ -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,
}; };
/** /**

View File

@ -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);