aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/kernel')
-rw-r--r--arch/arm/kernel/debug.S2
-rw-r--r--arch/arm/kernel/entry-armv.S12
-rw-r--r--arch/arm/kernel/entry-common.S2
-rw-r--r--arch/arm/kernel/entry-header.S11
-rw-r--r--arch/arm/kernel/entry-v7m.S4
-rw-r--r--arch/arm/kernel/head-nommu.S4
-rw-r--r--arch/arm/kernel/hyp-stub.S4
-rw-r--r--arch/arm/kernel/machine_kexec.c5
-rw-r--r--arch/arm/kernel/patch.c6
-rw-r--r--arch/arm/kernel/sleep.S12
-rw-r--r--arch/arm/kernel/smp.c10
-rw-r--r--arch/arm/kernel/smp_twd.c66
-rw-r--r--arch/arm/kernel/unwind.c14
13 files changed, 51 insertions, 101 deletions
diff --git a/arch/arm/kernel/debug.S b/arch/arm/kernel/debug.S
index b795dc2408c0..b9f94e03d916 100644
--- a/arch/arm/kernel/debug.S
+++ b/arch/arm/kernel/debug.S
@@ -86,7 +86,7 @@ hexbuf_rel: .long hexbuf_addr - .
86ENTRY(printascii) 86ENTRY(printascii)
87 addruart_current r3, r1, r2 87 addruart_current r3, r1, r2
881: teq r0, #0 881: teq r0, #0
89 ldrneb r1, [r0], #1 89 ldrbne r1, [r0], #1
90 teqne r1, #0 90 teqne r1, #0
91 reteq lr 91 reteq lr
922: teq r1, #'\n' 922: teq r1, #'\n'
diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S
index e85a3af9ddeb..ce4aea57130a 100644
--- a/arch/arm/kernel/entry-armv.S
+++ b/arch/arm/kernel/entry-armv.S
@@ -636,7 +636,7 @@ call_fpe:
636 @ Test if we need to give access to iWMMXt coprocessors 636 @ Test if we need to give access to iWMMXt coprocessors
637 ldr r5, [r10, #TI_FLAGS] 637 ldr r5, [r10, #TI_FLAGS]
638 rsbs r7, r8, #(1 << 8) @ CP 0 or 1 only 638 rsbs r7, r8, #(1 << 8) @ CP 0 or 1 only
639 movcss r7, r5, lsr #(TIF_USING_IWMMXT + 1) 639 movscs r7, r5, lsr #(TIF_USING_IWMMXT + 1)
640 bcs iwmmxt_task_enable 640 bcs iwmmxt_task_enable
641#endif 641#endif
642 ARM( add pc, pc, r8, lsr #6 ) 642 ARM( add pc, pc, r8, lsr #6 )
@@ -872,7 +872,7 @@ __kuser_cmpxchg64: @ 0xffff0f60
872 smp_dmb arm 872 smp_dmb arm
8731: ldrexd r0, r1, [r2] @ load current val 8731: ldrexd r0, r1, [r2] @ load current val
874 eors r3, r0, r4 @ compare with oldval (1) 874 eors r3, r0, r4 @ compare with oldval (1)
875 eoreqs r3, r1, r5 @ compare with oldval (2) 875 eorseq r3, r1, r5 @ compare with oldval (2)
876 strexdeq r3, r6, r7, [r2] @ store newval if eq 876 strexdeq r3, r6, r7, [r2] @ store newval if eq
877 teqeq r3, #1 @ success? 877 teqeq r3, #1 @ success?
878 beq 1b @ if no then retry 878 beq 1b @ if no then retry
@@ -896,8 +896,8 @@ __kuser_cmpxchg64: @ 0xffff0f60
896 ldmia r1, {r6, lr} @ load new val 896 ldmia r1, {r6, lr} @ load new val
8971: ldmia r2, {r0, r1} @ load current val 8971: ldmia r2, {r0, r1} @ load current val
898 eors r3, r0, r4 @ compare with oldval (1) 898 eors r3, r0, r4 @ compare with oldval (1)
899 eoreqs r3, r1, r5 @ compare with oldval (2) 899 eorseq r3, r1, r5 @ compare with oldval (2)
9002: stmeqia r2, {r6, lr} @ store newval if eq 9002: stmiaeq r2, {r6, lr} @ store newval if eq
901 rsbs r0, r3, #0 @ set return val and C flag 901 rsbs r0, r3, #0 @ set return val and C flag
902 ldmfd sp!, {r4, r5, r6, pc} 902 ldmfd sp!, {r4, r5, r6, pc}
903 903
@@ -911,7 +911,7 @@ kuser_cmpxchg64_fixup:
911 mov r7, #0xffff0fff 911 mov r7, #0xffff0fff
912 sub r7, r7, #(0xffff0fff - (0xffff0f60 + (1b - __kuser_cmpxchg64))) 912 sub r7, r7, #(0xffff0fff - (0xffff0f60 + (1b - __kuser_cmpxchg64)))
913 subs r8, r4, r7 913 subs r8, r4, r7
914 rsbcss r8, r8, #(2b - 1b) 914 rsbscs r8, r8, #(2b - 1b)
915 strcs r7, [sp, #S_PC] 915 strcs r7, [sp, #S_PC]
916#if __LINUX_ARM_ARCH__ < 6 916#if __LINUX_ARM_ARCH__ < 6
917 bcc kuser_cmpxchg32_fixup 917 bcc kuser_cmpxchg32_fixup
@@ -969,7 +969,7 @@ kuser_cmpxchg32_fixup:
969 mov r7, #0xffff0fff 969 mov r7, #0xffff0fff
970 sub r7, r7, #(0xffff0fff - (0xffff0fc0 + (1b - __kuser_cmpxchg))) 970 sub r7, r7, #(0xffff0fff - (0xffff0fc0 + (1b - __kuser_cmpxchg)))
971 subs r8, r4, r7 971 subs r8, r4, r7
972 rsbcss r8, r8, #(2b - 1b) 972 rsbscs r8, r8, #(2b - 1b)
973 strcs r7, [sp, #S_PC] 973 strcs r7, [sp, #S_PC]
974 ret lr 974 ret lr
975 .previous 975 .previous
diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S
index 0465d65d23de..f7649adef505 100644
--- a/arch/arm/kernel/entry-common.S
+++ b/arch/arm/kernel/entry-common.S
@@ -373,7 +373,7 @@ sys_syscall:
373 movhs scno, #0 373 movhs scno, #0
374 csdb 374 csdb
375#endif 375#endif
376 stmloia sp, {r5, r6} @ shuffle args 376 stmialo sp, {r5, r6} @ shuffle args
377 movlo r0, r1 377 movlo r0, r1
378 movlo r1, r2 378 movlo r1, r2
379 movlo r2, r3 379 movlo r2, r3
diff --git a/arch/arm/kernel/entry-header.S b/arch/arm/kernel/entry-header.S
index 773424843d6e..32051ec5b33f 100644
--- a/arch/arm/kernel/entry-header.S
+++ b/arch/arm/kernel/entry-header.S
@@ -127,7 +127,8 @@
127 */ 127 */
128 .macro v7m_exception_slow_exit ret_r0 128 .macro v7m_exception_slow_exit ret_r0
129 cpsid i 129 cpsid i
130 ldr lr, =EXC_RET_THREADMODE_PROCESSSTACK 130 ldr lr, =exc_ret
131 ldr lr, [lr]
131 132
132 @ read original r12, sp, lr, pc and xPSR 133 @ read original r12, sp, lr, pc and xPSR
133 add r12, sp, #S_IP 134 add r12, sp, #S_IP
@@ -387,8 +388,8 @@
387 badr lr, \ret @ return address 388 badr lr, \ret @ return address
388 .if \reload 389 .if \reload
389 add r1, sp, #S_R0 + S_OFF @ pointer to regs 390 add r1, sp, #S_R0 + S_OFF @ pointer to regs
390 ldmccia r1, {r0 - r6} @ reload r0-r6 391 ldmiacc r1, {r0 - r6} @ reload r0-r6
391 stmccia sp, {r4, r5} @ update stack arguments 392 stmiacc sp, {r4, r5} @ update stack arguments
392 .endif 393 .endif
393 ldrcc pc, [\table, \tmp, lsl #2] @ call sys_* routine 394 ldrcc pc, [\table, \tmp, lsl #2] @ call sys_* routine
394#else 395#else
@@ -396,8 +397,8 @@
396 badr lr, \ret @ return address 397 badr lr, \ret @ return address
397 .if \reload 398 .if \reload
398 add r1, sp, #S_R0 + S_OFF @ pointer to regs 399 add r1, sp, #S_R0 + S_OFF @ pointer to regs
399 ldmccia r1, {r0 - r6} @ reload r0-r6 400 ldmiacc r1, {r0 - r6} @ reload r0-r6
400 stmccia sp, {r4, r5} @ update stack arguments 401 stmiacc sp, {r4, r5} @ update stack arguments
401 .endif 402 .endif
402 ldrcc pc, [\table, \nr, lsl #2] @ call sys_* routine 403 ldrcc pc, [\table, \nr, lsl #2] @ call sys_* routine
403#endif 404#endif
diff --git a/arch/arm/kernel/entry-v7m.S b/arch/arm/kernel/entry-v7m.S
index abcf47848525..19d2dcd6530d 100644
--- a/arch/arm/kernel/entry-v7m.S
+++ b/arch/arm/kernel/entry-v7m.S
@@ -146,3 +146,7 @@ ENTRY(vector_table)
146 .rept CONFIG_CPU_V7M_NUM_IRQ 146 .rept CONFIG_CPU_V7M_NUM_IRQ
147 .long __irq_entry @ External Interrupts 147 .long __irq_entry @ External Interrupts
148 .endr 148 .endr
149 .align 2
150 .globl exc_ret
151exc_ret:
152 .space 4
diff --git a/arch/arm/kernel/head-nommu.S b/arch/arm/kernel/head-nommu.S
index ec29de250076..c08d2d890f7b 100644
--- a/arch/arm/kernel/head-nommu.S
+++ b/arch/arm/kernel/head-nommu.S
@@ -439,8 +439,8 @@ M_CLASS(str r6, [r12, #PMSAv8_RLAR_A(3)])
439 str r5, [r12, #PMSAv8_RBAR_A(0)] 439 str r5, [r12, #PMSAv8_RBAR_A(0)]
440 str r6, [r12, #PMSAv8_RLAR_A(0)] 440 str r6, [r12, #PMSAv8_RLAR_A(0)]
441#else 441#else
442 mcr p15, 0, r5, c6, c10, 1 @ PRBAR4 442 mcr p15, 0, r5, c6, c10, 0 @ PRBAR4
443 mcr p15, 0, r6, c6, c10, 2 @ PRLAR4 443 mcr p15, 0, r6, c6, c10, 1 @ PRLAR4
444#endif 444#endif
445#endif 445#endif
446 ret lr 446 ret lr
diff --git a/arch/arm/kernel/hyp-stub.S b/arch/arm/kernel/hyp-stub.S
index 60146e32619a..82a942894fc0 100644
--- a/arch/arm/kernel/hyp-stub.S
+++ b/arch/arm/kernel/hyp-stub.S
@@ -180,8 +180,8 @@ ARM_BE8(orr r7, r7, #(1 << 25)) @ HSCTLR.EE
180 @ Check whether GICv3 system registers are available 180 @ Check whether GICv3 system registers are available
181 mrc p15, 0, r7, c0, c1, 1 @ ID_PFR1 181 mrc p15, 0, r7, c0, c1, 1 @ ID_PFR1
182 ubfx r7, r7, #28, #4 182 ubfx r7, r7, #28, #4
183 cmp r7, #1 183 teq r7, #0
184 bne 2f 184 beq 2f
185 185
186 @ Enable system register accesses 186 @ Enable system register accesses
187 mrc p15, 4, r7, c12, c9, 5 @ ICC_HSRE 187 mrc p15, 4, r7, c12, c9, 5 @ ICC_HSRE
diff --git a/arch/arm/kernel/machine_kexec.c b/arch/arm/kernel/machine_kexec.c
index dd2eb5f76b9f..76300f3813e8 100644
--- a/arch/arm/kernel/machine_kexec.c
+++ b/arch/arm/kernel/machine_kexec.c
@@ -91,8 +91,11 @@ void machine_crash_nonpanic_core(void *unused)
91 91
92 set_cpu_online(smp_processor_id(), false); 92 set_cpu_online(smp_processor_id(), false);
93 atomic_dec(&waiting_for_crash_ipi); 93 atomic_dec(&waiting_for_crash_ipi);
94 while (1) 94
95 while (1) {
95 cpu_relax(); 96 cpu_relax();
97 wfe();
98 }
96} 99}
97 100
98void crash_smp_send_stop(void) 101void crash_smp_send_stop(void)
diff --git a/arch/arm/kernel/patch.c b/arch/arm/kernel/patch.c
index a50dc00d79a2..d0a05a3bdb96 100644
--- a/arch/arm/kernel/patch.c
+++ b/arch/arm/kernel/patch.c
@@ -16,7 +16,7 @@ struct patch {
16 unsigned int insn; 16 unsigned int insn;
17}; 17};
18 18
19static DEFINE_SPINLOCK(patch_lock); 19static DEFINE_RAW_SPINLOCK(patch_lock);
20 20
21static void __kprobes *patch_map(void *addr, int fixmap, unsigned long *flags) 21static void __kprobes *patch_map(void *addr, int fixmap, unsigned long *flags)
22 __acquires(&patch_lock) 22 __acquires(&patch_lock)
@@ -33,7 +33,7 @@ static void __kprobes *patch_map(void *addr, int fixmap, unsigned long *flags)
33 return addr; 33 return addr;
34 34
35 if (flags) 35 if (flags)
36 spin_lock_irqsave(&patch_lock, *flags); 36 raw_spin_lock_irqsave(&patch_lock, *flags);
37 else 37 else
38 __acquire(&patch_lock); 38 __acquire(&patch_lock);
39 39
@@ -48,7 +48,7 @@ static void __kprobes patch_unmap(int fixmap, unsigned long *flags)
48 clear_fixmap(fixmap); 48 clear_fixmap(fixmap);
49 49
50 if (flags) 50 if (flags)
51 spin_unlock_irqrestore(&patch_lock, *flags); 51 raw_spin_unlock_irqrestore(&patch_lock, *flags);
52 else 52 else
53 __release(&patch_lock); 53 __release(&patch_lock);
54} 54}
diff --git a/arch/arm/kernel/sleep.S b/arch/arm/kernel/sleep.S
index a8257fc9cf2a..5dc8b80bb693 100644
--- a/arch/arm/kernel/sleep.S
+++ b/arch/arm/kernel/sleep.S
@@ -120,6 +120,14 @@ ENDPROC(cpu_resume_after_mmu)
120 .text 120 .text
121 .align 121 .align
122 122
123#ifdef CONFIG_MCPM
124 .arm
125THUMB( .thumb )
126ENTRY(cpu_resume_no_hyp)
127ARM_BE8(setend be) @ ensure we are in BE mode
128 b no_hyp
129#endif
130
123#ifdef CONFIG_MMU 131#ifdef CONFIG_MMU
124 .arm 132 .arm
125ENTRY(cpu_resume_arm) 133ENTRY(cpu_resume_arm)
@@ -135,6 +143,7 @@ ARM_BE8(setend be) @ ensure we are in BE mode
135 bl __hyp_stub_install_secondary 143 bl __hyp_stub_install_secondary
136#endif 144#endif
137 safe_svcmode_maskall r1 145 safe_svcmode_maskall r1
146no_hyp:
138 mov r1, #0 147 mov r1, #0
139 ALT_SMP(mrc p15, 0, r0, c0, c0, 5) 148 ALT_SMP(mrc p15, 0, r0, c0, c0, 5)
140 ALT_UP_B(1f) 149 ALT_UP_B(1f)
@@ -164,6 +173,9 @@ ENDPROC(cpu_resume)
164#ifdef CONFIG_MMU 173#ifdef CONFIG_MMU
165ENDPROC(cpu_resume_arm) 174ENDPROC(cpu_resume_arm)
166#endif 175#endif
176#ifdef CONFIG_MCPM
177ENDPROC(cpu_resume_no_hyp)
178#endif
167 179
168 .align 2 180 .align 2
169_sleep_save_sp: 181_sleep_save_sp:
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c
index 1d6f5ea522f4..facd4240ca02 100644
--- a/arch/arm/kernel/smp.c
+++ b/arch/arm/kernel/smp.c
@@ -62,12 +62,6 @@
62 */ 62 */
63struct secondary_data secondary_data; 63struct secondary_data secondary_data;
64 64
65/*
66 * control for which core is the next to come out of the secondary
67 * boot "holding pen"
68 */
69volatile int pen_release = -1;
70
71enum ipi_msg_type { 65enum ipi_msg_type {
72 IPI_WAKEUP, 66 IPI_WAKEUP,
73 IPI_TIMER, 67 IPI_TIMER,
@@ -604,8 +598,10 @@ static void ipi_cpu_stop(unsigned int cpu)
604 local_fiq_disable(); 598 local_fiq_disable();
605 local_irq_disable(); 599 local_irq_disable();
606 600
607 while (1) 601 while (1) {
608 cpu_relax(); 602 cpu_relax();
603 wfe();
604 }
609} 605}
610 606
611static DEFINE_PER_CPU(struct completion *, cpu_completion); 607static DEFINE_PER_CPU(struct completion *, cpu_completion);
diff --git a/arch/arm/kernel/smp_twd.c b/arch/arm/kernel/smp_twd.c
index b30eafeef096..3cdc399b9fc3 100644
--- a/arch/arm/kernel/smp_twd.c
+++ b/arch/arm/kernel/smp_twd.c
@@ -100,8 +100,6 @@ static void twd_timer_stop(void)
100 disable_percpu_irq(clk->irq); 100 disable_percpu_irq(clk->irq);
101} 101}
102 102
103#ifdef CONFIG_COMMON_CLK
104
105/* 103/*
106 * Updates clockevent frequency when the cpu frequency changes. 104 * Updates clockevent frequency when the cpu frequency changes.
107 * Called on the cpu that is changing frequency with interrupts disabled. 105 * Called on the cpu that is changing frequency with interrupts disabled.
@@ -143,54 +141,6 @@ static int twd_clk_init(void)
143} 141}
144core_initcall(twd_clk_init); 142core_initcall(twd_clk_init);
145 143
146#elif defined (CONFIG_CPU_FREQ)
147
148#include <linux/cpufreq.h>
149
150/*
151 * Updates clockevent frequency when the cpu frequency changes.
152 * Called on the cpu that is changing frequency with interrupts disabled.
153 */
154static void twd_update_frequency(void *data)
155{
156 twd_timer_rate = clk_get_rate(twd_clk);
157
158 clockevents_update_freq(raw_cpu_ptr(twd_evt), twd_timer_rate);
159}
160
161static int twd_cpufreq_transition(struct notifier_block *nb,
162 unsigned long state, void *data)
163{
164 struct cpufreq_freqs *freqs = data;
165
166 /*
167 * The twd clock events must be reprogrammed to account for the new
168 * frequency. The timer is local to a cpu, so cross-call to the
169 * changing cpu.
170 */
171 if (state == CPUFREQ_POSTCHANGE)
172 smp_call_function_single(freqs->cpu, twd_update_frequency,
173 NULL, 1);
174
175 return NOTIFY_OK;
176}
177
178static struct notifier_block twd_cpufreq_nb = {
179 .notifier_call = twd_cpufreq_transition,
180};
181
182static int twd_cpufreq_init(void)
183{
184 if (twd_evt && raw_cpu_ptr(twd_evt) && !IS_ERR(twd_clk))
185 return cpufreq_register_notifier(&twd_cpufreq_nb,
186 CPUFREQ_TRANSITION_NOTIFIER);
187
188 return 0;
189}
190core_initcall(twd_cpufreq_init);
191
192#endif
193
194static void twd_calibrate_rate(void) 144static void twd_calibrate_rate(void)
195{ 145{
196 unsigned long count; 146 unsigned long count;
@@ -366,21 +316,6 @@ out_free:
366 return err; 316 return err;
367} 317}
368 318
369int __init twd_local_timer_register(struct twd_local_timer *tlt)
370{
371 if (twd_base || twd_evt)
372 return -EBUSY;
373
374 twd_ppi = tlt->res[1].start;
375
376 twd_base = ioremap(tlt->res[0].start, resource_size(&tlt->res[0]));
377 if (!twd_base)
378 return -ENOMEM;
379
380 return twd_local_timer_common_register(NULL);
381}
382
383#ifdef CONFIG_OF
384static int __init twd_local_timer_of_register(struct device_node *np) 319static int __init twd_local_timer_of_register(struct device_node *np)
385{ 320{
386 int err; 321 int err;
@@ -406,4 +341,3 @@ out:
406TIMER_OF_DECLARE(arm_twd_a9, "arm,cortex-a9-twd-timer", twd_local_timer_of_register); 341TIMER_OF_DECLARE(arm_twd_a9, "arm,cortex-a9-twd-timer", twd_local_timer_of_register);
407TIMER_OF_DECLARE(arm_twd_a5, "arm,cortex-a5-twd-timer", twd_local_timer_of_register); 342TIMER_OF_DECLARE(arm_twd_a5, "arm,cortex-a5-twd-timer", twd_local_timer_of_register);
408TIMER_OF_DECLARE(arm_twd_11mp, "arm,arm11mp-twd-timer", twd_local_timer_of_register); 343TIMER_OF_DECLARE(arm_twd_11mp, "arm,arm11mp-twd-timer", twd_local_timer_of_register);
409#endif
diff --git a/arch/arm/kernel/unwind.c b/arch/arm/kernel/unwind.c
index 0bee233fef9a..314cfb232a63 100644
--- a/arch/arm/kernel/unwind.c
+++ b/arch/arm/kernel/unwind.c
@@ -93,7 +93,7 @@ extern const struct unwind_idx __start_unwind_idx[];
93static const struct unwind_idx *__origin_unwind_idx; 93static const struct unwind_idx *__origin_unwind_idx;
94extern const struct unwind_idx __stop_unwind_idx[]; 94extern const struct unwind_idx __stop_unwind_idx[];
95 95
96static DEFINE_SPINLOCK(unwind_lock); 96static DEFINE_RAW_SPINLOCK(unwind_lock);
97static LIST_HEAD(unwind_tables); 97static LIST_HEAD(unwind_tables);
98 98
99/* Convert a prel31 symbol to an absolute address */ 99/* Convert a prel31 symbol to an absolute address */
@@ -201,7 +201,7 @@ static const struct unwind_idx *unwind_find_idx(unsigned long addr)
201 /* module unwind tables */ 201 /* module unwind tables */
202 struct unwind_table *table; 202 struct unwind_table *table;
203 203
204 spin_lock_irqsave(&unwind_lock, flags); 204 raw_spin_lock_irqsave(&unwind_lock, flags);
205 list_for_each_entry(table, &unwind_tables, list) { 205 list_for_each_entry(table, &unwind_tables, list) {
206 if (addr >= table->begin_addr && 206 if (addr >= table->begin_addr &&
207 addr < table->end_addr) { 207 addr < table->end_addr) {
@@ -213,7 +213,7 @@ static const struct unwind_idx *unwind_find_idx(unsigned long addr)
213 break; 213 break;
214 } 214 }
215 } 215 }
216 spin_unlock_irqrestore(&unwind_lock, flags); 216 raw_spin_unlock_irqrestore(&unwind_lock, flags);
217 } 217 }
218 218
219 pr_debug("%s: idx = %p\n", __func__, idx); 219 pr_debug("%s: idx = %p\n", __func__, idx);
@@ -529,9 +529,9 @@ struct unwind_table *unwind_table_add(unsigned long start, unsigned long size,
529 tab->begin_addr = text_addr; 529 tab->begin_addr = text_addr;
530 tab->end_addr = text_addr + text_size; 530 tab->end_addr = text_addr + text_size;
531 531
532 spin_lock_irqsave(&unwind_lock, flags); 532 raw_spin_lock_irqsave(&unwind_lock, flags);
533 list_add_tail(&tab->list, &unwind_tables); 533 list_add_tail(&tab->list, &unwind_tables);
534 spin_unlock_irqrestore(&unwind_lock, flags); 534 raw_spin_unlock_irqrestore(&unwind_lock, flags);
535 535
536 return tab; 536 return tab;
537} 537}
@@ -543,9 +543,9 @@ void unwind_table_del(struct unwind_table *tab)
543 if (!tab) 543 if (!tab)
544 return; 544 return;
545 545
546 spin_lock_irqsave(&unwind_lock, flags); 546 raw_spin_lock_irqsave(&unwind_lock, flags);
547 list_del(&tab->list); 547 list_del(&tab->list);
548 spin_unlock_irqrestore(&unwind_lock, flags); 548 raw_spin_unlock_irqrestore(&unwind_lock, flags);
549 549
550 kfree(tab); 550 kfree(tab);
551} 551}