diff options
-rw-r--r-- | Documentation/powerpc/transactional_memory.txt | 32 | ||||
-rw-r--r-- | arch/powerpc/include/uapi/asm/tm.h | 2 | ||||
-rw-r--r-- | arch/powerpc/kernel/entry_64.S | 19 |
3 files changed, 36 insertions, 17 deletions
diff --git a/Documentation/powerpc/transactional_memory.txt b/Documentation/powerpc/transactional_memory.txt index 9791e98ab49c..98b39af5254f 100644 --- a/Documentation/powerpc/transactional_memory.txt +++ b/Documentation/powerpc/transactional_memory.txt | |||
@@ -74,22 +74,23 @@ Causes of transaction aborts | |||
74 | Syscalls | 74 | Syscalls |
75 | ======== | 75 | ======== |
76 | 76 | ||
77 | Performing syscalls from within transaction is not recommended, and can lead | 77 | Syscalls made from within an active transaction will not be performed and the |
78 | to unpredictable results. | 78 | transaction will be doomed by the kernel with the failure code TM_CAUSE_SYSCALL |
79 | | TM_CAUSE_PERSISTENT. | ||
79 | 80 | ||
80 | Syscalls do not by design abort transactions, but beware: The kernel code will | 81 | Syscalls made from within a suspended transaction are performed as normal and |
81 | not be running in transactional state. The effect of syscalls will always | 82 | the transaction is not explicitly doomed by the kernel. However, what the |
82 | remain visible, but depending on the call they may abort your transaction as a | 83 | kernel does to perform the syscall may result in the transaction being doomed |
83 | side-effect, read soon-to-be-aborted transactional data that should not remain | 84 | by the hardware. The syscall is performed in suspended mode so any side |
84 | invisible, etc. If you constantly retry a transaction that constantly aborts | 85 | effects will be persistent, independent of transaction success or failure. No |
85 | itself by calling a syscall, you'll have a livelock & make no progress. | 86 | guarantees are provided by the kernel about which syscalls will affect |
87 | transaction success. | ||
86 | 88 | ||
87 | Simple syscalls (e.g. sigprocmask()) "could" be OK. Even things like write() | 89 | Care must be taken when relying on syscalls to abort during active transactions |
88 | from, say, printf() should be OK as long as the kernel does not access any | 90 | if the calls are made via a library. Libraries may cache values (which may |
89 | memory that was accessed transactionally. | 91 | give the appearance of success) or perform operations that cause transaction |
90 | 92 | failure before entering the kernel (which may produce different failure codes). | |
91 | Consider any syscalls that happen to work as debug-only -- not recommended for | 93 | Examples are glibc's getpid() and lazy symbol resolution. |
92 | production use. Best to queue them up till after the transaction is over. | ||
93 | 94 | ||
94 | 95 | ||
95 | Signals | 96 | Signals |
@@ -176,8 +177,7 @@ kernel aborted a transaction: | |||
176 | TM_CAUSE_RESCHED Thread was rescheduled. | 177 | TM_CAUSE_RESCHED Thread was rescheduled. |
177 | TM_CAUSE_TLBI Software TLB invalide. | 178 | TM_CAUSE_TLBI Software TLB invalide. |
178 | TM_CAUSE_FAC_UNAV FP/VEC/VSX unavailable trap. | 179 | TM_CAUSE_FAC_UNAV FP/VEC/VSX unavailable trap. |
179 | TM_CAUSE_SYSCALL Currently unused; future syscalls that must abort | 180 | TM_CAUSE_SYSCALL Syscall from active transaction. |
180 | transactions for consistency will use this. | ||
181 | TM_CAUSE_SIGNAL Signal delivered. | 181 | TM_CAUSE_SIGNAL Signal delivered. |
182 | TM_CAUSE_MISC Currently unused. | 182 | TM_CAUSE_MISC Currently unused. |
183 | TM_CAUSE_ALIGNMENT Alignment fault. | 183 | TM_CAUSE_ALIGNMENT Alignment fault. |
diff --git a/arch/powerpc/include/uapi/asm/tm.h b/arch/powerpc/include/uapi/asm/tm.h index 5d836b7c1176..5047659815a5 100644 --- a/arch/powerpc/include/uapi/asm/tm.h +++ b/arch/powerpc/include/uapi/asm/tm.h | |||
@@ -11,7 +11,7 @@ | |||
11 | #define TM_CAUSE_RESCHED 0xde | 11 | #define TM_CAUSE_RESCHED 0xde |
12 | #define TM_CAUSE_TLBI 0xdc | 12 | #define TM_CAUSE_TLBI 0xdc |
13 | #define TM_CAUSE_FAC_UNAV 0xda | 13 | #define TM_CAUSE_FAC_UNAV 0xda |
14 | #define TM_CAUSE_SYSCALL 0xd8 /* future use */ | 14 | #define TM_CAUSE_SYSCALL 0xd8 |
15 | #define TM_CAUSE_MISC 0xd6 /* future use */ | 15 | #define TM_CAUSE_MISC 0xd6 /* future use */ |
16 | #define TM_CAUSE_SIGNAL 0xd4 | 16 | #define TM_CAUSE_SIGNAL 0xd4 |
17 | #define TM_CAUSE_ALIGNMENT 0xd2 | 17 | #define TM_CAUSE_ALIGNMENT 0xd2 |
diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S index afbc20019c2e..8ca9434c40e6 100644 --- a/arch/powerpc/kernel/entry_64.S +++ b/arch/powerpc/kernel/entry_64.S | |||
@@ -34,6 +34,7 @@ | |||
34 | #include <asm/ftrace.h> | 34 | #include <asm/ftrace.h> |
35 | #include <asm/hw_irq.h> | 35 | #include <asm/hw_irq.h> |
36 | #include <asm/context_tracking.h> | 36 | #include <asm/context_tracking.h> |
37 | #include <asm/tm.h> | ||
37 | 38 | ||
38 | /* | 39 | /* |
39 | * System calls. | 40 | * System calls. |
@@ -145,6 +146,24 @@ END_FW_FTR_SECTION_IFSET(FW_FEATURE_SPLPAR) | |||
145 | andi. r11,r10,_TIF_SYSCALL_DOTRACE | 146 | andi. r11,r10,_TIF_SYSCALL_DOTRACE |
146 | bne syscall_dotrace | 147 | bne syscall_dotrace |
147 | .Lsyscall_dotrace_cont: | 148 | .Lsyscall_dotrace_cont: |
149 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
150 | BEGIN_FTR_SECTION | ||
151 | b 1f | ||
152 | END_FTR_SECTION_IFCLR(CPU_FTR_TM) | ||
153 | extrdi. r11, r12, 1, (63-MSR_TS_T_LG) /* transaction active? */ | ||
154 | beq+ 1f | ||
155 | |||
156 | /* Doom the transaction and don't perform the syscall: */ | ||
157 | mfmsr r11 | ||
158 | li r12, 1 | ||
159 | rldimi r11, r12, MSR_TM_LG, 63-MSR_TM_LG | ||
160 | mtmsrd r11, 0 | ||
161 | li r11, (TM_CAUSE_SYSCALL|TM_CAUSE_PERSISTENT) | ||
162 | TABORT(R11) | ||
163 | |||
164 | b .Lsyscall_exit | ||
165 | 1: | ||
166 | #endif | ||
148 | cmpldi 0,r0,NR_syscalls | 167 | cmpldi 0,r0,NR_syscalls |
149 | bge- syscall_enosys | 168 | bge- syscall_enosys |
150 | 169 | ||