Commit 7a894c87 authored by Helge Deller's avatar Helge Deller

parisc: Fix CONFIG_TLB_PTLOCK to work with lightweight spinlock checks

For the TLB_PTLOCK checks we used an optimization to store the spc
register into the spinlock to unlock it. This optimization works as
long as the lightweight spinlock checks (CONFIG_LIGHTWEIGHT_SPINLOCK_CHECK)
aren't enabled, because they really check if the lock word is zero or
__ARCH_SPIN_LOCK_UNLOCKED_VAL and abort with a kernel crash
("Spinlock was trashed") otherwise.

Drop that optimization to make it possible to activate both checks
at the same time.
Noticed-by: default avatarSam James <sam@gentoo.org>
Signed-off-by: default avatarHelge Deller <deller@gmx.de>
Tested-by: default avatarSam James <sam@gentoo.org>
Cc: stable@vger.kernel.org # v6.4+
Fixes: 15e64ef6 ("parisc: Add lightweight spinlock checks")
parent 2ccdd1b1
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include <asm/traps.h> #include <asm/traps.h>
#include <asm/thread_info.h> #include <asm/thread_info.h>
#include <asm/alternative.h> #include <asm/alternative.h>
#include <asm/spinlock_types.h>
#include <linux/linkage.h> #include <linux/linkage.h>
#include <linux/pgtable.h> #include <linux/pgtable.h>
...@@ -406,7 +407,7 @@ ...@@ -406,7 +407,7 @@
LDREG 0(\ptp),\pte LDREG 0(\ptp),\pte
bb,<,n \pte,_PAGE_PRESENT_BIT,3f bb,<,n \pte,_PAGE_PRESENT_BIT,3f
b \fault b \fault
stw \spc,0(\tmp) stw \tmp1,0(\tmp)
99: ALTERNATIVE(98b, 99b, ALT_COND_NO_SMP, INSN_NOP) 99: ALTERNATIVE(98b, 99b, ALT_COND_NO_SMP, INSN_NOP)
#endif #endif
2: LDREG 0(\ptp),\pte 2: LDREG 0(\ptp),\pte
...@@ -415,24 +416,22 @@ ...@@ -415,24 +416,22 @@
.endm .endm
/* Release page_table_lock without reloading lock address. /* Release page_table_lock without reloading lock address.
Note that the values in the register spc are limited to
NR_SPACE_IDS (262144). Thus, the stw instruction always
stores a nonzero value even when register spc is 64 bits.
We use an ordered store to ensure all prior accesses are We use an ordered store to ensure all prior accesses are
performed prior to releasing the lock. */ performed prior to releasing the lock. */
.macro ptl_unlock0 spc,tmp .macro ptl_unlock0 spc,tmp,tmp2
#ifdef CONFIG_TLB_PTLOCK #ifdef CONFIG_TLB_PTLOCK
98: or,COND(=) %r0,\spc,%r0 98: ldi __ARCH_SPIN_LOCK_UNLOCKED_VAL, \tmp2
stw,ma \spc,0(\tmp) or,COND(=) %r0,\spc,%r0
stw,ma \tmp2,0(\tmp)
99: ALTERNATIVE(98b, 99b, ALT_COND_NO_SMP, INSN_NOP) 99: ALTERNATIVE(98b, 99b, ALT_COND_NO_SMP, INSN_NOP)
#endif #endif
.endm .endm
/* Release page_table_lock. */ /* Release page_table_lock. */
.macro ptl_unlock1 spc,tmp .macro ptl_unlock1 spc,tmp,tmp2
#ifdef CONFIG_TLB_PTLOCK #ifdef CONFIG_TLB_PTLOCK
98: get_ptl \tmp 98: get_ptl \tmp
ptl_unlock0 \spc,\tmp ptl_unlock0 \spc,\tmp,\tmp2
99: ALTERNATIVE(98b, 99b, ALT_COND_NO_SMP, INSN_NOP) 99: ALTERNATIVE(98b, 99b, ALT_COND_NO_SMP, INSN_NOP)
#endif #endif
.endm .endm
...@@ -1125,7 +1124,7 @@ dtlb_miss_20w: ...@@ -1125,7 +1124,7 @@ dtlb_miss_20w:
idtlbt pte,prot idtlbt pte,prot
ptl_unlock1 spc,t0 ptl_unlock1 spc,t0,t1
rfir rfir
nop nop
...@@ -1151,7 +1150,7 @@ nadtlb_miss_20w: ...@@ -1151,7 +1150,7 @@ nadtlb_miss_20w:
idtlbt pte,prot idtlbt pte,prot
ptl_unlock1 spc,t0 ptl_unlock1 spc,t0,t1
rfir rfir
nop nop
...@@ -1185,7 +1184,7 @@ dtlb_miss_11: ...@@ -1185,7 +1184,7 @@ dtlb_miss_11:
mtsp t1, %sr1 /* Restore sr1 */ mtsp t1, %sr1 /* Restore sr1 */
ptl_unlock1 spc,t0 ptl_unlock1 spc,t0,t1
rfir rfir
nop nop
...@@ -1218,7 +1217,7 @@ nadtlb_miss_11: ...@@ -1218,7 +1217,7 @@ nadtlb_miss_11:
mtsp t1, %sr1 /* Restore sr1 */ mtsp t1, %sr1 /* Restore sr1 */
ptl_unlock1 spc,t0 ptl_unlock1 spc,t0,t1
rfir rfir
nop nop
...@@ -1247,7 +1246,7 @@ dtlb_miss_20: ...@@ -1247,7 +1246,7 @@ dtlb_miss_20:
idtlbt pte,prot idtlbt pte,prot
ptl_unlock1 spc,t0 ptl_unlock1 spc,t0,t1
rfir rfir
nop nop
...@@ -1275,7 +1274,7 @@ nadtlb_miss_20: ...@@ -1275,7 +1274,7 @@ nadtlb_miss_20:
idtlbt pte,prot idtlbt pte,prot
ptl_unlock1 spc,t0 ptl_unlock1 spc,t0,t1
rfir rfir
nop nop
...@@ -1320,7 +1319,7 @@ itlb_miss_20w: ...@@ -1320,7 +1319,7 @@ itlb_miss_20w:
iitlbt pte,prot iitlbt pte,prot
ptl_unlock1 spc,t0 ptl_unlock1 spc,t0,t1
rfir rfir
nop nop
...@@ -1344,7 +1343,7 @@ naitlb_miss_20w: ...@@ -1344,7 +1343,7 @@ naitlb_miss_20w:
iitlbt pte,prot iitlbt pte,prot
ptl_unlock1 spc,t0 ptl_unlock1 spc,t0,t1
rfir rfir
nop nop
...@@ -1378,7 +1377,7 @@ itlb_miss_11: ...@@ -1378,7 +1377,7 @@ itlb_miss_11:
mtsp t1, %sr1 /* Restore sr1 */ mtsp t1, %sr1 /* Restore sr1 */
ptl_unlock1 spc,t0 ptl_unlock1 spc,t0,t1
rfir rfir
nop nop
...@@ -1402,7 +1401,7 @@ naitlb_miss_11: ...@@ -1402,7 +1401,7 @@ naitlb_miss_11:
mtsp t1, %sr1 /* Restore sr1 */ mtsp t1, %sr1 /* Restore sr1 */
ptl_unlock1 spc,t0 ptl_unlock1 spc,t0,t1
rfir rfir
nop nop
...@@ -1432,7 +1431,7 @@ itlb_miss_20: ...@@ -1432,7 +1431,7 @@ itlb_miss_20:
iitlbt pte,prot iitlbt pte,prot
ptl_unlock1 spc,t0 ptl_unlock1 spc,t0,t1
rfir rfir
nop nop
...@@ -1452,7 +1451,7 @@ naitlb_miss_20: ...@@ -1452,7 +1451,7 @@ naitlb_miss_20:
iitlbt pte,prot iitlbt pte,prot
ptl_unlock1 spc,t0 ptl_unlock1 spc,t0,t1
rfir rfir
nop nop
...@@ -1482,7 +1481,7 @@ dbit_trap_20w: ...@@ -1482,7 +1481,7 @@ dbit_trap_20w:
idtlbt pte,prot idtlbt pte,prot
ptl_unlock0 spc,t0 ptl_unlock0 spc,t0,t1
rfir rfir
nop nop
#else #else
...@@ -1508,7 +1507,7 @@ dbit_trap_11: ...@@ -1508,7 +1507,7 @@ dbit_trap_11:
mtsp t1, %sr1 /* Restore sr1 */ mtsp t1, %sr1 /* Restore sr1 */
ptl_unlock0 spc,t0 ptl_unlock0 spc,t0,t1
rfir rfir
nop nop
...@@ -1528,7 +1527,7 @@ dbit_trap_20: ...@@ -1528,7 +1527,7 @@ dbit_trap_20:
idtlbt pte,prot idtlbt pte,prot
ptl_unlock0 spc,t0 ptl_unlock0 spc,t0,t1
rfir rfir
nop nop
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment