aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2013-09-11 11:36:03 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2013-09-11 11:36:03 -0400
commite831cbfc1ad843b5542cc45f777e1a00b73c0685 (patch)
treee62571d8129919b94f887bf1e2d252883018cd17 /arch/s390
parent5b4197845ad1a33bc57da7ee5ea41de58c2f86bf (diff)
parent9e75c6274a7365ad493fc3e75c8dd35f0185b7ca (diff)
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux
Pull more s390 updates from Heiko Carstens: "This includes one bpf/jit bug fix where the jit compiler could sometimes write generated code out of bounds of the allocated memory area. The rest of the patches are only cleanups and minor improvements" * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux: s390/irq: reduce size of external interrupt handler hash array s390/compat,uid16: use current_cred() s390/ap_bus: use and-mask instead of a cast s390/ftrace: avoid pointer arithmetics with function pointers s390: make various functions static, add declarations to header files s390/compat signal: add couple of __force annotations s390/mm: add __releases()/__acquires() annotations to gmap_alloc_table() s390: keep Kconfig sorted s390/irq: rework irq subclass handling s390/irq: use hlists for external interrupt handler array s390/dumpstack: convert print_symbol to %pSR s390/perf: Remove print_hex_dump_bytes() debug output s390: update defconfig s390/bpf,jit: fix address randomization
Diffstat (limited to 'arch/s390')
-rw-r--r--arch/s390/Kconfig6
-rw-r--r--arch/s390/defconfig39
-rw-r--r--arch/s390/include/asm/irq.h12
-rw-r--r--arch/s390/kernel/compat_linux.c9
-rw-r--r--arch/s390/kernel/compat_signal.c10
-rw-r--r--arch/s390/kernel/dumpstack.c20
-rw-r--r--arch/s390/kernel/entry.h18
-rw-r--r--arch/s390/kernel/ftrace.c5
-rw-r--r--arch/s390/kernel/irq.c85
-rw-r--r--arch/s390/kernel/machine_kexec.c2
-rw-r--r--arch/s390/kernel/perf_cpum_cf.c4
-rw-r--r--arch/s390/kernel/perf_event.c5
-rw-r--r--arch/s390/kernel/runtime_instr.c4
-rw-r--r--arch/s390/kernel/smp.c2
-rw-r--r--arch/s390/kernel/suspend.c1
-rw-r--r--arch/s390/mm/fault.c2
-rw-r--r--arch/s390/mm/maccess.c1
-rw-r--r--arch/s390/mm/pgtable.c6
-rw-r--r--arch/s390/net/bpf_jit_comp.c2
-rw-r--r--arch/s390/oprofile/hwsampler.c6
20 files changed, 117 insertions, 122 deletions
diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig
index c696ad7d3439..fb2723e8ba65 100644
--- a/arch/s390/Kconfig
+++ b/arch/s390/Kconfig
@@ -62,6 +62,7 @@ config S390
62 def_bool y 62 def_bool y
63 select ARCH_DISCARD_MEMBLOCK 63 select ARCH_DISCARD_MEMBLOCK
64 select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE 64 select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE
65 select ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS
65 select ARCH_HAVE_NMI_SAFE_CMPXCHG 66 select ARCH_HAVE_NMI_SAFE_CMPXCHG
66 select ARCH_INLINE_READ_LOCK 67 select ARCH_INLINE_READ_LOCK
67 select ARCH_INLINE_READ_LOCK_BH 68 select ARCH_INLINE_READ_LOCK_BH
@@ -91,7 +92,6 @@ config S390
91 select ARCH_INLINE_WRITE_UNLOCK_BH 92 select ARCH_INLINE_WRITE_UNLOCK_BH
92 select ARCH_INLINE_WRITE_UNLOCK_IRQ 93 select ARCH_INLINE_WRITE_UNLOCK_IRQ
93 select ARCH_INLINE_WRITE_UNLOCK_IRQRESTORE 94 select ARCH_INLINE_WRITE_UNLOCK_IRQRESTORE
94 select ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS
95 select ARCH_SAVE_PAGE_KEYS if HIBERNATION 95 select ARCH_SAVE_PAGE_KEYS if HIBERNATION
96 select ARCH_WANT_IPC_PARSE_VERSION 96 select ARCH_WANT_IPC_PARSE_VERSION
97 select BUILDTIME_EXTABLE_SORT 97 select BUILDTIME_EXTABLE_SORT
@@ -135,15 +135,15 @@ config S390
135 select HAVE_SYSCALL_TRACEPOINTS 135 select HAVE_SYSCALL_TRACEPOINTS
136 select HAVE_UID16 if 32BIT 136 select HAVE_UID16 if 32BIT
137 select HAVE_VIRT_CPU_ACCOUNTING 137 select HAVE_VIRT_CPU_ACCOUNTING
138 select VIRT_TO_BUS
139 select INIT_ALL_POSSIBLE 138 select INIT_ALL_POSSIBLE
140 select KTIME_SCALAR if 32BIT 139 select KTIME_SCALAR if 32BIT
141 select MODULES_USE_ELF_RELA 140 select MODULES_USE_ELF_RELA
142 select OLD_SIGSUSPEND3
143 select OLD_SIGACTION 141 select OLD_SIGACTION
142 select OLD_SIGSUSPEND3
144 select SYSCTL_EXCEPTION_TRACE 143 select SYSCTL_EXCEPTION_TRACE
145 select USE_GENERIC_SMP_HELPERS if SMP 144 select USE_GENERIC_SMP_HELPERS if SMP
146 select VIRT_CPU_ACCOUNTING 145 select VIRT_CPU_ACCOUNTING
146 select VIRT_TO_BUS
147 147
148config SCHED_OMIT_FRAME_POINTER 148config SCHED_OMIT_FRAME_POINTER
149 def_bool y 149 def_bool y
diff --git a/arch/s390/defconfig b/arch/s390/defconfig
index b74400e3e035..d204c65bf722 100644
--- a/arch/s390/defconfig
+++ b/arch/s390/defconfig
@@ -1,14 +1,13 @@
1CONFIG_EXPERIMENTAL=y
2CONFIG_SYSVIPC=y 1CONFIG_SYSVIPC=y
3CONFIG_POSIX_MQUEUE=y 2CONFIG_POSIX_MQUEUE=y
4CONFIG_FHANDLE=y 3CONFIG_FHANDLE=y
4CONFIG_AUDIT=y
5CONFIG_NO_HZ=y
6CONFIG_HIGH_RES_TIMERS=y
5CONFIG_TASKSTATS=y 7CONFIG_TASKSTATS=y
6CONFIG_TASK_DELAY_ACCT=y 8CONFIG_TASK_DELAY_ACCT=y
7CONFIG_TASK_XACCT=y 9CONFIG_TASK_XACCT=y
8CONFIG_TASK_IO_ACCOUNTING=y 10CONFIG_TASK_IO_ACCOUNTING=y
9CONFIG_AUDIT=y
10CONFIG_NO_HZ=y
11CONFIG_HIGH_RES_TIMERS=y
12CONFIG_RCU_FAST_NO_HZ=y 11CONFIG_RCU_FAST_NO_HZ=y
13CONFIG_IKCONFIG=y 12CONFIG_IKCONFIG=y
14CONFIG_IKCONFIG_PROC=y 13CONFIG_IKCONFIG_PROC=y
@@ -27,6 +26,7 @@ CONFIG_RD_BZIP2=y
27CONFIG_RD_LZMA=y 26CONFIG_RD_LZMA=y
28CONFIG_RD_XZ=y 27CONFIG_RD_XZ=y
29CONFIG_RD_LZO=y 28CONFIG_RD_LZO=y
29CONFIG_RD_LZ4=y
30CONFIG_EXPERT=y 30CONFIG_EXPERT=y
31# CONFIG_COMPAT_BRK is not set 31# CONFIG_COMPAT_BRK is not set
32CONFIG_PROFILING=y 32CONFIG_PROFILING=y
@@ -38,11 +38,13 @@ CONFIG_MODULE_UNLOAD=y
38CONFIG_MODVERSIONS=y 38CONFIG_MODVERSIONS=y
39CONFIG_PARTITION_ADVANCED=y 39CONFIG_PARTITION_ADVANCED=y
40CONFIG_IBM_PARTITION=y 40CONFIG_IBM_PARTITION=y
41# CONFIG_EFI_PARTITION is not set
41CONFIG_DEFAULT_DEADLINE=y 42CONFIG_DEFAULT_DEADLINE=y
42CONFIG_HZ_100=y 43CONFIG_HZ_100=y
43CONFIG_MEMORY_HOTPLUG=y 44CONFIG_MEMORY_HOTPLUG=y
44CONFIG_MEMORY_HOTREMOVE=y 45CONFIG_MEMORY_HOTREMOVE=y
45CONFIG_KSM=y 46CONFIG_KSM=y
47CONFIG_TRANSPARENT_HUGEPAGE=y
46CONFIG_CRASH_DUMP=y 48CONFIG_CRASH_DUMP=y
47CONFIG_BINFMT_MISC=m 49CONFIG_BINFMT_MISC=m
48CONFIG_HIBERNATION=y 50CONFIG_HIBERNATION=y
@@ -92,40 +94,49 @@ CONFIG_SCSI_CONSTANTS=y
92CONFIG_SCSI_LOGGING=y 94CONFIG_SCSI_LOGGING=y
93CONFIG_SCSI_SCAN_ASYNC=y 95CONFIG_SCSI_SCAN_ASYNC=y
94CONFIG_ZFCP=y 96CONFIG_ZFCP=y
97CONFIG_SCSI_VIRTIO=y
95CONFIG_NETDEVICES=y 98CONFIG_NETDEVICES=y
96CONFIG_BONDING=m 99CONFIG_BONDING=m
97CONFIG_DUMMY=m 100CONFIG_DUMMY=m
98CONFIG_EQUALIZER=m 101CONFIG_EQUALIZER=m
99CONFIG_TUN=m 102CONFIG_TUN=m
100CONFIG_VIRTIO_NET=y 103CONFIG_VIRTIO_NET=y
104# CONFIG_INPUT is not set
105# CONFIG_SERIO is not set
101CONFIG_RAW_DRIVER=m 106CONFIG_RAW_DRIVER=m
102CONFIG_VIRTIO_BALLOON=y 107CONFIG_VIRTIO_BALLOON=y
103CONFIG_EXT2_FS=y
104CONFIG_EXT3_FS=y
105# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
106CONFIG_EXT4_FS=y 108CONFIG_EXT4_FS=y
107CONFIG_EXT4_FS_POSIX_ACL=y 109CONFIG_EXT4_FS_POSIX_ACL=y
108CONFIG_EXT4_FS_SECURITY=y 110CONFIG_EXT4_FS_SECURITY=y
111CONFIG_XFS_FS=y
112CONFIG_XFS_QUOTA=y
113CONFIG_XFS_POSIX_ACL=y
114CONFIG_XFS_RT=y
115CONFIG_BTRFS_FS=y
116CONFIG_BTRFS_FS_POSIX_ACL=y
117CONFIG_FANOTIFY=y
118CONFIG_FUSE_FS=y
109CONFIG_PROC_KCORE=y 119CONFIG_PROC_KCORE=y
110CONFIG_TMPFS=y 120CONFIG_TMPFS=y
111CONFIG_TMPFS_POSIX_ACL=y 121CONFIG_TMPFS_POSIX_ACL=y
122CONFIG_HUGETLBFS=y
112# CONFIG_NETWORK_FILESYSTEMS is not set 123# CONFIG_NETWORK_FILESYSTEMS is not set
124CONFIG_DEBUG_FORCE_WEAK_PER_CPU=y
113CONFIG_MAGIC_SYSRQ=y 125CONFIG_MAGIC_SYSRQ=y
126CONFIG_DEBUG_PAGEALLOC=y
114CONFIG_TIMER_STATS=y 127CONFIG_TIMER_STATS=y
115CONFIG_PROVE_LOCKING=y 128CONFIG_PROVE_LOCKING=y
116CONFIG_PROVE_RCU=y
117CONFIG_LOCK_STAT=y 129CONFIG_LOCK_STAT=y
118CONFIG_DEBUG_LOCKDEP=y 130CONFIG_DEBUG_LOCKDEP=y
119CONFIG_DEBUG_LIST=y 131CONFIG_DEBUG_LIST=y
120CONFIG_DEBUG_NOTIFIERS=y 132CONFIG_DEBUG_NOTIFIERS=y
133CONFIG_PROVE_RCU=y
134CONFIG_RCU_CPU_STALL_TIMEOUT=60
121CONFIG_RCU_TRACE=y 135CONFIG_RCU_TRACE=y
122CONFIG_KPROBES_SANITY_TEST=y
123CONFIG_DEBUG_FORCE_WEAK_PER_CPU=y
124CONFIG_LATENCYTOP=y 136CONFIG_LATENCYTOP=y
125CONFIG_DEBUG_PAGEALLOC=y
126CONFIG_BLK_DEV_IO_TRACE=y 137CONFIG_BLK_DEV_IO_TRACE=y
138CONFIG_KPROBES_SANITY_TEST=y
127# CONFIG_STRICT_DEVMEM is not set 139# CONFIG_STRICT_DEVMEM is not set
128CONFIG_CRYPTO_NULL=m
129CONFIG_CRYPTO_CRYPTD=m 140CONFIG_CRYPTO_CRYPTD=m
130CONFIG_CRYPTO_AUTHENC=m 141CONFIG_CRYPTO_AUTHENC=m
131CONFIG_CRYPTO_TEST=m 142CONFIG_CRYPTO_TEST=m
@@ -137,8 +148,10 @@ CONFIG_CRYPTO_ECB=m
137CONFIG_CRYPTO_LRW=m 148CONFIG_CRYPTO_LRW=m
138CONFIG_CRYPTO_PCBC=m 149CONFIG_CRYPTO_PCBC=m
139CONFIG_CRYPTO_XTS=m 150CONFIG_CRYPTO_XTS=m
151CONFIG_CRYPTO_CMAC=m
140CONFIG_CRYPTO_XCBC=m 152CONFIG_CRYPTO_XCBC=m
141CONFIG_CRYPTO_VMAC=m 153CONFIG_CRYPTO_VMAC=m
154CONFIG_CRYPTO_CRC32=m
142CONFIG_CRYPTO_MD4=m 155CONFIG_CRYPTO_MD4=m
143CONFIG_CRYPTO_MICHAEL_MIC=m 156CONFIG_CRYPTO_MICHAEL_MIC=m
144CONFIG_CRYPTO_RMD128=m 157CONFIG_CRYPTO_RMD128=m
@@ -165,6 +178,8 @@ CONFIG_CRYPTO_TWOFISH=m
165CONFIG_CRYPTO_DEFLATE=m 178CONFIG_CRYPTO_DEFLATE=m
166CONFIG_CRYPTO_ZLIB=m 179CONFIG_CRYPTO_ZLIB=m
167CONFIG_CRYPTO_LZO=m 180CONFIG_CRYPTO_LZO=m
181CONFIG_CRYPTO_LZ4=m
182CONFIG_CRYPTO_LZ4HC=m
168CONFIG_ZCRYPT=m 183CONFIG_ZCRYPT=m
169CONFIG_CRYPTO_SHA1_S390=m 184CONFIG_CRYPTO_SHA1_S390=m
170CONFIG_CRYPTO_SHA256_S390=m 185CONFIG_CRYPTO_SHA256_S390=m
diff --git a/arch/s390/include/asm/irq.h b/arch/s390/include/asm/irq.h
index 1eaa3625803c..5f8bcc5fe423 100644
--- a/arch/s390/include/asm/irq.h
+++ b/arch/s390/include/asm/irq.h
@@ -78,10 +78,14 @@ typedef void (*ext_int_handler_t)(struct ext_code, unsigned int, unsigned long);
78 78
79int register_external_interrupt(u16 code, ext_int_handler_t handler); 79int register_external_interrupt(u16 code, ext_int_handler_t handler);
80int unregister_external_interrupt(u16 code, ext_int_handler_t handler); 80int unregister_external_interrupt(u16 code, ext_int_handler_t handler);
81void service_subclass_irq_register(void); 81
82void service_subclass_irq_unregister(void); 82enum irq_subclass {
83void measurement_alert_subclass_register(void); 83 IRQ_SUBCLASS_MEASUREMENT_ALERT = 5,
84void measurement_alert_subclass_unregister(void); 84 IRQ_SUBCLASS_SERVICE_SIGNAL = 9,
85};
86
87void irq_subclass_register(enum irq_subclass subclass);
88void irq_subclass_unregister(enum irq_subclass subclass);
85 89
86#define irq_canonicalize(irq) (irq) 90#define irq_canonicalize(irq) (irq)
87 91
diff --git a/arch/s390/kernel/compat_linux.c b/arch/s390/kernel/compat_linux.c
index 8b6e4f5288a2..1f1b8c70ab97 100644
--- a/arch/s390/kernel/compat_linux.c
+++ b/arch/s390/kernel/compat_linux.c
@@ -221,25 +221,26 @@ static int groups16_from_user(struct group_info *group_info, u16 __user *groupli
221 221
222asmlinkage long sys32_getgroups16(int gidsetsize, u16 __user *grouplist) 222asmlinkage long sys32_getgroups16(int gidsetsize, u16 __user *grouplist)
223{ 223{
224 const struct cred *cred = current_cred();
224 int i; 225 int i;
225 226
226 if (gidsetsize < 0) 227 if (gidsetsize < 0)
227 return -EINVAL; 228 return -EINVAL;
228 229
229 get_group_info(current->cred->group_info); 230 get_group_info(cred->group_info);
230 i = current->cred->group_info->ngroups; 231 i = cred->group_info->ngroups;
231 if (gidsetsize) { 232 if (gidsetsize) {
232 if (i > gidsetsize) { 233 if (i > gidsetsize) {
233 i = -EINVAL; 234 i = -EINVAL;
234 goto out; 235 goto out;
235 } 236 }
236 if (groups16_to_user(grouplist, current->cred->group_info)) { 237 if (groups16_to_user(grouplist, cred->group_info)) {
237 i = -EFAULT; 238 i = -EFAULT;
238 goto out; 239 goto out;
239 } 240 }
240 } 241 }
241out: 242out:
242 put_group_info(current->cred->group_info); 243 put_group_info(cred->group_info);
243 return i; 244 return i;
244} 245}
245 246
diff --git a/arch/s390/kernel/compat_signal.c b/arch/s390/kernel/compat_signal.c
index c439ac9ced09..1389b637dae5 100644
--- a/arch/s390/kernel/compat_signal.c
+++ b/arch/s390/kernel/compat_signal.c
@@ -332,9 +332,9 @@ static int setup_frame32(int sig, struct k_sigaction *ka,
332 /* Set up to return from userspace. If provided, use a stub 332 /* Set up to return from userspace. If provided, use a stub
333 already in userspace. */ 333 already in userspace. */
334 if (ka->sa.sa_flags & SA_RESTORER) { 334 if (ka->sa.sa_flags & SA_RESTORER) {
335 regs->gprs[14] = (__u64) ka->sa.sa_restorer | PSW32_ADDR_AMODE; 335 regs->gprs[14] = (__u64 __force) ka->sa.sa_restorer | PSW32_ADDR_AMODE;
336 } else { 336 } else {
337 regs->gprs[14] = (__u64) frame->retcode | PSW32_ADDR_AMODE; 337 regs->gprs[14] = (__u64 __force) frame->retcode | PSW32_ADDR_AMODE;
338 if (__put_user(S390_SYSCALL_OPCODE | __NR_sigreturn, 338 if (__put_user(S390_SYSCALL_OPCODE | __NR_sigreturn,
339 (u16 __force __user *)(frame->retcode))) 339 (u16 __force __user *)(frame->retcode)))
340 goto give_sigsegv; 340 goto give_sigsegv;
@@ -400,9 +400,9 @@ static int setup_rt_frame32(int sig, struct k_sigaction *ka, siginfo_t *info,
400 /* Set up to return from userspace. If provided, use a stub 400 /* Set up to return from userspace. If provided, use a stub
401 already in userspace. */ 401 already in userspace. */
402 if (ka->sa.sa_flags & SA_RESTORER) { 402 if (ka->sa.sa_flags & SA_RESTORER) {
403 regs->gprs[14] = (__u64) ka->sa.sa_restorer | PSW32_ADDR_AMODE; 403 regs->gprs[14] = (__u64 __force) ka->sa.sa_restorer | PSW32_ADDR_AMODE;
404 } else { 404 } else {
405 regs->gprs[14] = (__u64) frame->retcode | PSW32_ADDR_AMODE; 405 regs->gprs[14] = (__u64 __force) frame->retcode | PSW32_ADDR_AMODE;
406 err |= __put_user(S390_SYSCALL_OPCODE | __NR_rt_sigreturn, 406 err |= __put_user(S390_SYSCALL_OPCODE | __NR_rt_sigreturn,
407 (u16 __force __user *)(frame->retcode)); 407 (u16 __force __user *)(frame->retcode));
408 } 408 }
@@ -417,7 +417,7 @@ static int setup_rt_frame32(int sig, struct k_sigaction *ka, siginfo_t *info,
417 regs->psw.mask = PSW_MASK_BA | 417 regs->psw.mask = PSW_MASK_BA |
418 (psw_user_bits & PSW_MASK_ASC) | 418 (psw_user_bits & PSW_MASK_ASC) |
419 (regs->psw.mask & ~PSW_MASK_ASC); 419 (regs->psw.mask & ~PSW_MASK_ASC);
420 regs->psw.addr = (__u64) ka->sa.sa_handler; 420 regs->psw.addr = (__u64 __force) ka->sa.sa_handler;
421 421
422 regs->gprs[2] = map_signal(sig); 422 regs->gprs[2] = map_signal(sig);
423 regs->gprs[3] = (__force __u64) &frame->info; 423 regs->gprs[3] = (__force __u64) &frame->info;
diff --git a/arch/s390/kernel/dumpstack.c b/arch/s390/kernel/dumpstack.c
index 87acc38f73c6..99e7f6035895 100644
--- a/arch/s390/kernel/dumpstack.c
+++ b/arch/s390/kernel/dumpstack.c
@@ -40,14 +40,15 @@ __show_trace(unsigned long sp, unsigned long low, unsigned long high)
40{ 40{
41 struct stack_frame *sf; 41 struct stack_frame *sf;
42 struct pt_regs *regs; 42 struct pt_regs *regs;
43 unsigned long addr;
43 44
44 while (1) { 45 while (1) {
45 sp = sp & PSW_ADDR_INSN; 46 sp = sp & PSW_ADDR_INSN;
46 if (sp < low || sp > high - sizeof(*sf)) 47 if (sp < low || sp > high - sizeof(*sf))
47 return sp; 48 return sp;
48 sf = (struct stack_frame *) sp; 49 sf = (struct stack_frame *) sp;
49 printk("([<%016lx>] ", sf->gprs[8] & PSW_ADDR_INSN); 50 addr = sf->gprs[8] & PSW_ADDR_INSN;
50 print_symbol("%s)\n", sf->gprs[8] & PSW_ADDR_INSN); 51 printk("([<%016lx>] %pSR)\n", addr, (void *)addr);
51 /* Follow the backchain. */ 52 /* Follow the backchain. */
52 while (1) { 53 while (1) {
53 low = sp; 54 low = sp;
@@ -57,16 +58,16 @@ __show_trace(unsigned long sp, unsigned long low, unsigned long high)
57 if (sp <= low || sp > high - sizeof(*sf)) 58 if (sp <= low || sp > high - sizeof(*sf))
58 return sp; 59 return sp;
59 sf = (struct stack_frame *) sp; 60 sf = (struct stack_frame *) sp;
60 printk(" [<%016lx>] ", sf->gprs[8] & PSW_ADDR_INSN); 61 addr = sf->gprs[8] & PSW_ADDR_INSN;
61 print_symbol("%s\n", sf->gprs[8] & PSW_ADDR_INSN); 62 printk(" [<%016lx>] %pSR\n", addr, (void *)addr);
62 } 63 }
63 /* Zero backchain detected, check for interrupt frame. */ 64 /* Zero backchain detected, check for interrupt frame. */
64 sp = (unsigned long) (sf + 1); 65 sp = (unsigned long) (sf + 1);
65 if (sp <= low || sp > high - sizeof(*regs)) 66 if (sp <= low || sp > high - sizeof(*regs))
66 return sp; 67 return sp;
67 regs = (struct pt_regs *) sp; 68 regs = (struct pt_regs *) sp;
68 printk(" [<%016lx>] ", regs->psw.addr & PSW_ADDR_INSN); 69 addr = regs->psw.addr & PSW_ADDR_INSN;
69 print_symbol("%s\n", regs->psw.addr & PSW_ADDR_INSN); 70 printk(" [<%016lx>] %pSR\n", addr, (void *)addr);
70 low = sp; 71 low = sp;
71 sp = regs->gprs[15]; 72 sp = regs->gprs[15];
72 } 73 }
@@ -128,8 +129,7 @@ static void show_last_breaking_event(struct pt_regs *regs)
128{ 129{
129#ifdef CONFIG_64BIT 130#ifdef CONFIG_64BIT
130 printk("Last Breaking-Event-Address:\n"); 131 printk("Last Breaking-Event-Address:\n");
131 printk(" [<%016lx>] ", regs->args[0] & PSW_ADDR_INSN); 132 printk(" [<%016lx>] %pSR\n", regs->args[0], (void *)regs->args[0]);
132 print_symbol("%s\n", regs->args[0] & PSW_ADDR_INSN);
133#endif 133#endif
134} 134}
135 135
@@ -143,10 +143,10 @@ void show_registers(struct pt_regs *regs)
143 char *mode; 143 char *mode;
144 144
145 mode = user_mode(regs) ? "User" : "Krnl"; 145 mode = user_mode(regs) ? "User" : "Krnl";
146 printk("%s PSW : %p %p", 146 printk("%s PSW : %p %p (%pSR)\n",
147 mode, (void *) regs->psw.mask, 147 mode, (void *) regs->psw.mask,
148 (void *) regs->psw.addr,
148 (void *) regs->psw.addr); 149 (void *) regs->psw.addr);
149 print_symbol(" (%s)\n", regs->psw.addr & PSW_ADDR_INSN);
150 printk(" R:%x T:%x IO:%x EX:%x Key:%x M:%x W:%x " 150 printk(" R:%x T:%x IO:%x EX:%x Key:%x M:%x W:%x "
151 "P:%x AS:%x CC:%x PM:%x", mask_bits(regs, PSW_MASK_PER), 151 "P:%x AS:%x CC:%x PM:%x", mask_bits(regs, PSW_MASK_PER),
152 mask_bits(regs, PSW_MASK_DAT), mask_bits(regs, PSW_MASK_IO), 152 mask_bits(regs, PSW_MASK_DAT), mask_bits(regs, PSW_MASK_IO),
diff --git a/arch/s390/kernel/entry.h b/arch/s390/kernel/entry.h
index 3ddbc26d246e..e9b04c33d383 100644
--- a/arch/s390/kernel/entry.h
+++ b/arch/s390/kernel/entry.h
@@ -53,27 +53,21 @@ void handle_signal32(unsigned long sig, struct k_sigaction *ka,
53 siginfo_t *info, sigset_t *oldset, struct pt_regs *regs); 53 siginfo_t *info, sigset_t *oldset, struct pt_regs *regs);
54void do_notify_resume(struct pt_regs *regs); 54void do_notify_resume(struct pt_regs *regs);
55 55
56struct ext_code; 56void __init init_IRQ(void);
57void do_extint(struct pt_regs *regs); 57void do_IRQ(struct pt_regs *regs, int irq);
58void do_restart(void); 58void do_restart(void);
59void __init startup_init(void); 59void __init startup_init(void);
60void die(struct pt_regs *regs, const char *str); 60void die(struct pt_regs *regs, const char *str);
61 61int setup_profiling_timer(unsigned int multiplier);
62void __init time_init(void); 62void __init time_init(void);
63int pfn_is_nosave(unsigned long);
64void s390_early_resume(void);
65unsigned long prepare_ftrace_return(unsigned long parent, unsigned long ip);
63 66
64struct s390_mmap_arg_struct; 67struct s390_mmap_arg_struct;
65struct fadvise64_64_args; 68struct fadvise64_64_args;
66struct old_sigaction; 69struct old_sigaction;
67 70
68long sys_mmap2(struct s390_mmap_arg_struct __user *arg);
69long sys_s390_ipc(uint call, int first, unsigned long second,
70 unsigned long third, void __user *ptr);
71long sys_s390_personality(unsigned int personality);
72long sys_s390_fadvise64(int fd, u32 offset_high, u32 offset_low,
73 size_t len, int advice);
74long sys_s390_fadvise64_64(struct fadvise64_64_args __user *args);
75long sys_s390_fallocate(int fd, int mode, loff_t offset, u32 len_high,
76 u32 len_low);
77long sys_sigreturn(void); 71long sys_sigreturn(void);
78long sys_rt_sigreturn(void); 72long sys_rt_sigreturn(void);
79long sys32_sigreturn(void); 73long sys32_sigreturn(void);
diff --git a/arch/s390/kernel/ftrace.c b/arch/s390/kernel/ftrace.c
index e3043aef87a9..1014ad5f7693 100644
--- a/arch/s390/kernel/ftrace.c
+++ b/arch/s390/kernel/ftrace.c
@@ -15,6 +15,7 @@
15#include <linux/kprobes.h> 15#include <linux/kprobes.h>
16#include <trace/syscall.h> 16#include <trace/syscall.h>
17#include <asm/asm-offsets.h> 17#include <asm/asm-offsets.h>
18#include "entry.h"
18 19
19#ifdef CONFIG_DYNAMIC_FTRACE 20#ifdef CONFIG_DYNAMIC_FTRACE
20 21
@@ -177,7 +178,7 @@ int ftrace_enable_ftrace_graph_caller(void)
177 178
178 offset = ((void *) prepare_ftrace_return - 179 offset = ((void *) prepare_ftrace_return -
179 (void *) ftrace_graph_caller) / 2; 180 (void *) ftrace_graph_caller) / 2;
180 return probe_kernel_write(ftrace_graph_caller + 2, 181 return probe_kernel_write((void *) ftrace_graph_caller + 2,
181 &offset, sizeof(offset)); 182 &offset, sizeof(offset));
182} 183}
183 184
@@ -185,7 +186,7 @@ int ftrace_disable_ftrace_graph_caller(void)
185{ 186{
186 static unsigned short offset = 0x0002; 187 static unsigned short offset = 0x0002;
187 188
188 return probe_kernel_write(ftrace_graph_caller + 2, 189 return probe_kernel_write((void *) ftrace_graph_caller + 2,
189 &offset, sizeof(offset)); 190 &offset, sizeof(offset));
190} 191}
191 192
diff --git a/arch/s390/kernel/irq.c b/arch/s390/kernel/irq.c
index b34ba0ea96a9..8ac2097f13d4 100644
--- a/arch/s390/kernel/irq.c
+++ b/arch/s390/kernel/irq.c
@@ -196,21 +196,23 @@ asmlinkage void do_softirq(void)
196 * ext_int_hash[index] is the list head for all external interrupts that hash 196 * ext_int_hash[index] is the list head for all external interrupts that hash
197 * to this index. 197 * to this index.
198 */ 198 */
199static struct list_head ext_int_hash[256]; 199static struct hlist_head ext_int_hash[32] ____cacheline_aligned;
200 200
201struct ext_int_info { 201struct ext_int_info {
202 ext_int_handler_t handler; 202 ext_int_handler_t handler;
203 u16 code; 203 struct hlist_node entry;
204 struct list_head entry;
205 struct rcu_head rcu; 204 struct rcu_head rcu;
205 u16 code;
206}; 206};
207 207
208/* ext_int_hash_lock protects the handler lists for external interrupts */ 208/* ext_int_hash_lock protects the handler lists for external interrupts */
209DEFINE_SPINLOCK(ext_int_hash_lock); 209static DEFINE_SPINLOCK(ext_int_hash_lock);
210 210
211static inline int ext_hash(u16 code) 211static inline int ext_hash(u16 code)
212{ 212{
213 return (code + (code >> 9)) & 0xff; 213 BUILD_BUG_ON(!is_power_of_2(ARRAY_SIZE(ext_int_hash)));
214
215 return (code + (code >> 9)) & (ARRAY_SIZE(ext_int_hash) - 1);
214} 216}
215 217
216int register_external_interrupt(u16 code, ext_int_handler_t handler) 218int register_external_interrupt(u16 code, ext_int_handler_t handler)
@@ -227,7 +229,7 @@ int register_external_interrupt(u16 code, ext_int_handler_t handler)
227 index = ext_hash(code); 229 index = ext_hash(code);
228 230
229 spin_lock_irqsave(&ext_int_hash_lock, flags); 231 spin_lock_irqsave(&ext_int_hash_lock, flags);
230 list_add_rcu(&p->entry, &ext_int_hash[index]); 232 hlist_add_head_rcu(&p->entry, &ext_int_hash[index]);
231 spin_unlock_irqrestore(&ext_int_hash_lock, flags); 233 spin_unlock_irqrestore(&ext_int_hash_lock, flags);
232 return 0; 234 return 0;
233} 235}
@@ -240,9 +242,9 @@ int unregister_external_interrupt(u16 code, ext_int_handler_t handler)
240 int index = ext_hash(code); 242 int index = ext_hash(code);
241 243
242 spin_lock_irqsave(&ext_int_hash_lock, flags); 244 spin_lock_irqsave(&ext_int_hash_lock, flags);
243 list_for_each_entry_rcu(p, &ext_int_hash[index], entry) { 245 hlist_for_each_entry_rcu(p, &ext_int_hash[index], entry) {
244 if (p->code == code && p->handler == handler) { 246 if (p->code == code && p->handler == handler) {
245 list_del_rcu(&p->entry); 247 hlist_del_rcu(&p->entry);
246 kfree_rcu(p, rcu); 248 kfree_rcu(p, rcu);
247 } 249 }
248 } 250 }
@@ -264,12 +266,12 @@ static irqreturn_t do_ext_interrupt(int irq, void *dummy)
264 266
265 index = ext_hash(ext_code.code); 267 index = ext_hash(ext_code.code);
266 rcu_read_lock(); 268 rcu_read_lock();
267 list_for_each_entry_rcu(p, &ext_int_hash[index], entry) 269 hlist_for_each_entry_rcu(p, &ext_int_hash[index], entry) {
268 if (likely(p->code == ext_code.code)) 270 if (unlikely(p->code != ext_code.code))
269 p->handler(ext_code, regs->int_parm, 271 continue;
270 regs->int_parm_long); 272 p->handler(ext_code, regs->int_parm, regs->int_parm_long);
273 }
271 rcu_read_unlock(); 274 rcu_read_unlock();
272
273 return IRQ_HANDLED; 275 return IRQ_HANDLED;
274} 276}
275 277
@@ -283,55 +285,32 @@ void __init init_ext_interrupts(void)
283 int idx; 285 int idx;
284 286
285 for (idx = 0; idx < ARRAY_SIZE(ext_int_hash); idx++) 287 for (idx = 0; idx < ARRAY_SIZE(ext_int_hash); idx++)
286 INIT_LIST_HEAD(&ext_int_hash[idx]); 288 INIT_HLIST_HEAD(&ext_int_hash[idx]);
287 289
288 irq_set_chip_and_handler(EXT_INTERRUPT, 290 irq_set_chip_and_handler(EXT_INTERRUPT,
289 &dummy_irq_chip, handle_percpu_irq); 291 &dummy_irq_chip, handle_percpu_irq);
290 setup_irq(EXT_INTERRUPT, &external_interrupt); 292 setup_irq(EXT_INTERRUPT, &external_interrupt);
291} 293}
292 294
293static DEFINE_SPINLOCK(sc_irq_lock); 295static DEFINE_SPINLOCK(irq_subclass_lock);
294static int sc_irq_refcount; 296static unsigned char irq_subclass_refcount[64];
295
296void service_subclass_irq_register(void)
297{
298 spin_lock(&sc_irq_lock);
299 if (!sc_irq_refcount)
300 ctl_set_bit(0, 9);
301 sc_irq_refcount++;
302 spin_unlock(&sc_irq_lock);
303}
304EXPORT_SYMBOL(service_subclass_irq_register);
305
306void service_subclass_irq_unregister(void)
307{
308 spin_lock(&sc_irq_lock);
309 sc_irq_refcount--;
310 if (!sc_irq_refcount)
311 ctl_clear_bit(0, 9);
312 spin_unlock(&sc_irq_lock);
313}
314EXPORT_SYMBOL(service_subclass_irq_unregister);
315
316static DEFINE_SPINLOCK(ma_subclass_lock);
317static int ma_subclass_refcount;
318 297
319void measurement_alert_subclass_register(void) 298void irq_subclass_register(enum irq_subclass subclass)
320{ 299{
321 spin_lock(&ma_subclass_lock); 300 spin_lock(&irq_subclass_lock);
322 if (!ma_subclass_refcount) 301 if (!irq_subclass_refcount[subclass])
323 ctl_set_bit(0, 5); 302 ctl_set_bit(0, subclass);
324 ma_subclass_refcount++; 303 irq_subclass_refcount[subclass]++;
325 spin_unlock(&ma_subclass_lock); 304 spin_unlock(&irq_subclass_lock);
326} 305}
327EXPORT_SYMBOL(measurement_alert_subclass_register); 306EXPORT_SYMBOL(irq_subclass_register);
328 307
329void measurement_alert_subclass_unregister(void) 308void irq_subclass_unregister(enum irq_subclass subclass)
330{ 309{
331 spin_lock(&ma_subclass_lock); 310 spin_lock(&irq_subclass_lock);
332 ma_subclass_refcount--; 311 irq_subclass_refcount[subclass]--;
333 if (!ma_subclass_refcount) 312 if (!irq_subclass_refcount[subclass])
334 ctl_clear_bit(0, 5); 313 ctl_clear_bit(0, subclass);
335 spin_unlock(&ma_subclass_lock); 314 spin_unlock(&irq_subclass_lock);
336} 315}
337EXPORT_SYMBOL(measurement_alert_subclass_unregister); 316EXPORT_SYMBOL(irq_subclass_unregister);
diff --git a/arch/s390/kernel/machine_kexec.c b/arch/s390/kernel/machine_kexec.c
index ac2178161ec3..719e27b2cf22 100644
--- a/arch/s390/kernel/machine_kexec.c
+++ b/arch/s390/kernel/machine_kexec.c
@@ -50,7 +50,7 @@ static void add_elf_notes(int cpu)
50/* 50/*
51 * Initialize CPU ELF notes 51 * Initialize CPU ELF notes
52 */ 52 */
53void setup_regs(void) 53static void setup_regs(void)
54{ 54{
55 unsigned long sa = S390_lowcore.prefixreg_save_area + SAVE_AREA_BASE; 55 unsigned long sa = S390_lowcore.prefixreg_save_area + SAVE_AREA_BASE;
56 int cpu, this_cpu; 56 int cpu, this_cpu;
diff --git a/arch/s390/kernel/perf_cpum_cf.c b/arch/s390/kernel/perf_cpum_cf.c
index fb99c2057b85..1105502bf6e9 100644
--- a/arch/s390/kernel/perf_cpum_cf.c
+++ b/arch/s390/kernel/perf_cpum_cf.c
@@ -274,7 +274,7 @@ static int reserve_pmc_hardware(void)
274 int flags = PMC_INIT; 274 int flags = PMC_INIT;
275 275
276 on_each_cpu(setup_pmc_cpu, &flags, 1); 276 on_each_cpu(setup_pmc_cpu, &flags, 1);
277 measurement_alert_subclass_register(); 277 irq_subclass_register(IRQ_SUBCLASS_MEASUREMENT_ALERT);
278 278
279 return 0; 279 return 0;
280} 280}
@@ -285,7 +285,7 @@ static void release_pmc_hardware(void)
285 int flags = PMC_RELEASE; 285 int flags = PMC_RELEASE;
286 286
287 on_each_cpu(setup_pmc_cpu, &flags, 1); 287 on_each_cpu(setup_pmc_cpu, &flags, 1);
288 measurement_alert_subclass_unregister(); 288 irq_subclass_unregister(IRQ_SUBCLASS_MEASUREMENT_ALERT);
289} 289}
290 290
291/* Release the PMU if event is the last perf event */ 291/* Release the PMU if event is the last perf event */
diff --git a/arch/s390/kernel/perf_event.c b/arch/s390/kernel/perf_event.c
index 500aa1029bcb..2343c218b8f9 100644
--- a/arch/s390/kernel/perf_event.c
+++ b/arch/s390/kernel/perf_event.c
@@ -105,13 +105,10 @@ void perf_event_print_debug(void)
105 105
106 cpu = smp_processor_id(); 106 cpu = smp_processor_id();
107 memset(&cf_info, 0, sizeof(cf_info)); 107 memset(&cf_info, 0, sizeof(cf_info));
108 if (!qctri(&cf_info)) { 108 if (!qctri(&cf_info))
109 pr_info("CPU[%i] CPUM_CF: ver=%u.%u A=%04x E=%04x C=%04x\n", 109 pr_info("CPU[%i] CPUM_CF: ver=%u.%u A=%04x E=%04x C=%04x\n",
110 cpu, cf_info.cfvn, cf_info.csvn, 110 cpu, cf_info.cfvn, cf_info.csvn,
111 cf_info.auth_ctl, cf_info.enable_ctl, cf_info.act_ctl); 111 cf_info.auth_ctl, cf_info.enable_ctl, cf_info.act_ctl);
112 print_hex_dump_bytes("CPUMF Query: ", DUMP_PREFIX_OFFSET,
113 &cf_info, sizeof(cf_info));
114 }
115 112
116 local_irq_restore(flags); 113 local_irq_restore(flags);
117} 114}
diff --git a/arch/s390/kernel/runtime_instr.c b/arch/s390/kernel/runtime_instr.c
index 077a99389b07..e1c9d1c292fa 100644
--- a/arch/s390/kernel/runtime_instr.c
+++ b/arch/s390/kernel/runtime_instr.c
@@ -139,10 +139,10 @@ static int __init runtime_instr_init(void)
139 if (!runtime_instr_avail()) 139 if (!runtime_instr_avail())
140 return 0; 140 return 0;
141 141
142 measurement_alert_subclass_register(); 142 irq_subclass_register(IRQ_SUBCLASS_MEASUREMENT_ALERT);
143 rc = register_external_interrupt(0x1407, runtime_instr_int_handler); 143 rc = register_external_interrupt(0x1407, runtime_instr_int_handler);
144 if (rc) 144 if (rc)
145 measurement_alert_subclass_unregister(); 145 irq_subclass_unregister(IRQ_SUBCLASS_MEASUREMENT_ALERT);
146 else 146 else
147 pr_info("Runtime instrumentation facility initialized\n"); 147 pr_info("Runtime instrumentation facility initialized\n");
148 return rc; 148 return rc;
diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c
index d386c4e9d2e5..1a4313a1b60f 100644
--- a/arch/s390/kernel/smp.c
+++ b/arch/s390/kernel/smp.c
@@ -362,7 +362,7 @@ void smp_yield_cpu(int cpu)
362 * Send cpus emergency shutdown signal. This gives the cpus the 362 * Send cpus emergency shutdown signal. This gives the cpus the
363 * opportunity to complete outstanding interrupts. 363 * opportunity to complete outstanding interrupts.
364 */ 364 */
365void smp_emergency_stop(cpumask_t *cpumask) 365static void smp_emergency_stop(cpumask_t *cpumask)
366{ 366{
367 u64 end; 367 u64 end;
368 int cpu; 368 int cpu;
diff --git a/arch/s390/kernel/suspend.c b/arch/s390/kernel/suspend.c
index 737bff38e3ee..a7a7537ce1e7 100644
--- a/arch/s390/kernel/suspend.c
+++ b/arch/s390/kernel/suspend.c
@@ -13,6 +13,7 @@
13#include <asm/ipl.h> 13#include <asm/ipl.h>
14#include <asm/cio.h> 14#include <asm/cio.h>
15#include <asm/pci.h> 15#include <asm/pci.h>
16#include "entry.h"
16 17
17/* 18/*
18 * References to section boundaries 19 * References to section boundaries
diff --git a/arch/s390/mm/fault.c b/arch/s390/mm/fault.c
index f00aefb66a4e..7de4469915f0 100644
--- a/arch/s390/mm/fault.c
+++ b/arch/s390/mm/fault.c
@@ -673,7 +673,7 @@ static int __init pfault_irq_init(void)
673 rc = pfault_init() == 0 ? 0 : -EOPNOTSUPP; 673 rc = pfault_init() == 0 ? 0 : -EOPNOTSUPP;
674 if (rc) 674 if (rc)
675 goto out_pfault; 675 goto out_pfault;
676 service_subclass_irq_register(); 676 irq_subclass_register(IRQ_SUBCLASS_SERVICE_SIGNAL);
677 hotcpu_notifier(pfault_cpu_notify, 0); 677 hotcpu_notifier(pfault_cpu_notify, 0);
678 return 0; 678 return 0;
679 679
diff --git a/arch/s390/mm/maccess.c b/arch/s390/mm/maccess.c
index 921fa541dc04..d1e0e0c7a7e2 100644
--- a/arch/s390/mm/maccess.c
+++ b/arch/s390/mm/maccess.c
@@ -14,6 +14,7 @@
14#include <linux/gfp.h> 14#include <linux/gfp.h>
15#include <linux/cpu.h> 15#include <linux/cpu.h>
16#include <asm/ctl_reg.h> 16#include <asm/ctl_reg.h>
17#include <asm/io.h>
17 18
18/* 19/*
19 * This function writes to kernel memory bypassing DAT and possible 20 * This function writes to kernel memory bypassing DAT and possible
diff --git a/arch/s390/mm/pgtable.c b/arch/s390/mm/pgtable.c
index bf7c0dc64a76..de8cbc30dcd1 100644
--- a/arch/s390/mm/pgtable.c
+++ b/arch/s390/mm/pgtable.c
@@ -245,7 +245,9 @@ EXPORT_SYMBOL_GPL(gmap_disable);
245 * gmap_alloc_table is assumed to be called with mmap_sem held 245 * gmap_alloc_table is assumed to be called with mmap_sem held
246 */ 246 */
247static int gmap_alloc_table(struct gmap *gmap, 247static int gmap_alloc_table(struct gmap *gmap,
248 unsigned long *table, unsigned long init) 248 unsigned long *table, unsigned long init)
249 __releases(&gmap->mm->page_table_lock)
250 __acquires(&gmap->mm->page_table_lock)
249{ 251{
250 struct page *page; 252 struct page *page;
251 unsigned long *new; 253 unsigned long *new;
@@ -966,7 +968,7 @@ void page_table_free_rcu(struct mmu_gather *tlb, unsigned long *table)
966 tlb_remove_table(tlb, table); 968 tlb_remove_table(tlb, table);
967} 969}
968 970
969void __tlb_remove_table(void *_table) 971static void __tlb_remove_table(void *_table)
970{ 972{
971 const unsigned long mask = (FRAG_MASK << 4) | FRAG_MASK; 973 const unsigned long mask = (FRAG_MASK << 4) | FRAG_MASK;
972 void *table = (void *)((unsigned long) _table & ~mask); 974 void *table = (void *)((unsigned long) _table & ~mask);
diff --git a/arch/s390/net/bpf_jit_comp.c b/arch/s390/net/bpf_jit_comp.c
index d5f10a43a58f..709239285869 100644
--- a/arch/s390/net/bpf_jit_comp.c
+++ b/arch/s390/net/bpf_jit_comp.c
@@ -805,7 +805,7 @@ static struct bpf_binary_header *bpf_alloc_binary(unsigned int bpfsize,
805 return NULL; 805 return NULL;
806 memset(header, 0, sz); 806 memset(header, 0, sz);
807 header->pages = sz / PAGE_SIZE; 807 header->pages = sz / PAGE_SIZE;
808 hole = sz - bpfsize + sizeof(*header); 808 hole = sz - (bpfsize + sizeof(*header));
809 /* Insert random number of illegal instructions before BPF code 809 /* Insert random number of illegal instructions before BPF code
810 * and make sure the first instruction starts at an even address. 810 * and make sure the first instruction starts at an even address.
811 */ 811 */
diff --git a/arch/s390/oprofile/hwsampler.c b/arch/s390/oprofile/hwsampler.c
index b5b2916895e0..231cecafc2f1 100644
--- a/arch/s390/oprofile/hwsampler.c
+++ b/arch/s390/oprofile/hwsampler.c
@@ -1001,7 +1001,7 @@ int hwsampler_deallocate(void)
1001 if (hws_state != HWS_STOPPED) 1001 if (hws_state != HWS_STOPPED)
1002 goto deallocate_exit; 1002 goto deallocate_exit;
1003 1003
1004 measurement_alert_subclass_unregister(); 1004 irq_subclass_unregister(IRQ_SUBCLASS_MEASUREMENT_ALERT);
1005 deallocate_sdbt(); 1005 deallocate_sdbt();
1006 1006
1007 hws_state = HWS_DEALLOCATED; 1007 hws_state = HWS_DEALLOCATED;
@@ -1115,7 +1115,7 @@ int hwsampler_shutdown(void)
1115 mutex_lock(&hws_sem); 1115 mutex_lock(&hws_sem);
1116 1116
1117 if (hws_state == HWS_STOPPED) { 1117 if (hws_state == HWS_STOPPED) {
1118 measurement_alert_subclass_unregister(); 1118 irq_subclass_unregister(IRQ_SUBCLASS_MEASUREMENT_ALERT);
1119 deallocate_sdbt(); 1119 deallocate_sdbt();
1120 } 1120 }
1121 if (hws_wq) { 1121 if (hws_wq) {
@@ -1190,7 +1190,7 @@ start_all_exit:
1190 hws_oom = 1; 1190 hws_oom = 1;
1191 hws_flush_all = 0; 1191 hws_flush_all = 0;
1192 /* now let them in, 1407 CPUMF external interrupts */ 1192 /* now let them in, 1407 CPUMF external interrupts */
1193 measurement_alert_subclass_register(); 1193 irq_subclass_register(IRQ_SUBCLASS_MEASUREMENT_ALERT);
1194 1194
1195 return 0; 1195 return 0;
1196} 1196}