** Description changed:
- This test fails in the same way on a P8 host, so it is nothing to do
- with P9.
+
+ == SRU Justification ==
+ IBM is seeing tm_sigreturn test failures on P8 and P9 hosts. The bad thing
+ exception is being raised when executing the following line:
+
+ c00000000004fcfc: b0 04 03 e8 ld r0,1200(r3)
+ -> c00000000004fd00: a6 23 02 7c mtspr 130,r0
+
+ Which is basically restoring TEXASR in the thread.
+
+ ISA says "These registers can be written only when in Non-transactional
+ state" and the MSR is set to be transactional (suspended):
+
+ MSR: 8000000300201033 [ME][RI][IR][DR][LE][SF][HTM][TSU]
+
+ That explains why they are getting the "bad thing exception". A mtspr is
+ being called with a transaction suspended.
+
+ This test failure is fixed by upstream commit 78a3e8889b4b.
+ Upstream commit 78a3e8889b4b is in mainline as of 4.8-rc5.
+
+ == Fix ==
+ 78a3e8889b4b ("powerpc: signals: Discard transaction state from signal
frames")
+
+ == Regression Potential ==
+ Low. Specific to powerpc.
+
+ == Test Case ==
+ A test kernel was built with this patch and tested by the original bug
reporter.
+ The bug reporter states the test kernel resolved the bug.
+
+
+
+ This test fails in the same way on a P8 host, so it is nothing to do with P9.
There have been many TM bugs fixed upstream since 4.4. I would suggest
starting with commit 044215d145a7 ("powerpc/tm: Fix illegal TM state in
signal handler", 2017-08-22) and see if that helps.
The bad thing exception is being raised when executing the following
line:
- c00000000004fcfc: b0 04 03 e8 ld r0,1200(r3)
- -> c00000000004fd00: a6 23 02 7c mtspr 130,r0
+ c00000000004fcfc: b0 04 03 e8 ld r0,1200(r3)
+ -> c00000000004fd00: a6 23 02 7c mtspr 130,r0
Which is basically restoring TEXASR in the thread.
-
- ISA says "These registers can be written only when in Non-transactional
state" and the MSR is set to be transactional (suspended):
+ ISA says "These registers can be written only when in Non-transactional
+ state" and the MSR is set to be transactional (suspended):
MSR: 8000000300201033 [ME][RI][IR][DR][LE][SF][HTM][TSU]
That explains why we are getting the "bad thing exception". A mtspr is
being called with a transaction suspended.
I think we need the following commit to have this fixed:
commit 78a3e8889b4b6b99775ed954696ff3e017f5d19b
Author: Cyril Bur <[email protected]>
Date: Tue Aug 23 10:46:17 2016 +1000
- powerpc: signals: Discard transaction state from signal frames
-
- Userspace can begin and suspend a transaction within the signal
- handler which means they might enter sys_rt_sigreturn() with the
- processor in suspended state.
-
- sys_rt_sigreturn() wants to restore process context (which may have
- been in a transaction before signal delivery). To do this it must
- restore TM SPRS. To achieve this, any transaction initiated within the
- signal frame must be discarded in order to be able to restore TM SPRs
- as TM SPRs can only be manipulated non-transactionally..
- >From the PowerPC ISA:
- TM Bad Thing Exception [Category: Transactional Memory]
- An attempt is made to execute a mtspr targeting a TM register in
- other than Non-transactional state.
-
- Not doing so results in a TM Bad Thing:
- [12045.221359] Kernel BUG at c000000000050a40 [verbose debug info
unavailable]
- [12045.221470] Unexpected TM Bad Thing exception at c000000000050a40 (msr
0x201033)
- [12045.221540] Oops: Unrecoverable exception, sig: 6 [#1]
- [12045.221586] SMP NR_CPUS=2048 NUMA PowerNV
- [12045.221634] Modules linked in: xt_CHECKSUM iptable_mangle
ipt_MASQUERADE
- nf_nat_masquerade_ipv4 iptable_nat nf_nat_ipv4 nf_nat nf_conntrack_ipv4
nf_defrag_ipv4
- xt_conntrack nf_conntrack ipt_REJECT nf_reject_ipv4 xt_tcpudp bridge stp
llc ebtable_filter
- ebtables ip6table_filter ip6_tables iptable_filter ip_tables x_tables
kvm_hv kvm
- uio_pdrv_genirq ipmi_powernv uio powernv_rng ipmi_msghandler autofs4 ses
enclosure
- scsi_transport_sas bnx2x ipr mdio libcrc32c
- [12045.222167] CPU: 68 PID: 6178 Comm: sigreturnpanic Not tainted 4.7.0
#34
- [12045.222224] task: c0000000fce38600 ti: c0000000fceb4000 task.ti:
c0000000fceb4000
- [12045.222293] NIP: c000000000050a40 LR: c0000000000163bc CTR:
0000000000000000
- [12045.222361] REGS: c0000000fceb7ac0 TRAP: 0700 Not tainted (4.7.0)
- [12045.222418] MSR: 9000000300201033 <SF,HV,ME,IR,DR,RI,LE,TM[SE]> CR:
28444280 XER: 20000000
- [12045.222625] CFAR: c0000000000163b8 SOFTE: 0 PACATMSCRATCH:
900000014280f033
- GPR00: 01100000b8000001 c0000000fceb7d40 c00000000139c100 c0000000fce390d0
- GPR04: 900000034280f033 0000000000000000 0000000000000000 0000000000000000
- GPR08: 0000000000000000 b000000000001033 0000000000000001 0000000000000000
- GPR12: 0000000000000000 c000000002926400 0000000000000000 0000000000000000
- GPR16: 0000000000000000 0000000000000000 0000000000000000 0000000000000000
- GPR20: 0000000000000000 0000000000000000 0000000000000000 0000000000000000
- GPR24: 0000000000000000 00003ffff98cadd0 00003ffff98cb470 0000000000000000
- GPR28: 900000034280f033 c0000000fceb7ea0 0000000000000001 c0000000fce390d0
- [12045.223535] NIP [c000000000050a40] tm_restore_sprs+0xc/0x1c
- [12045.223584] LR [c0000000000163bc] tm_recheckpoint+0x5c/0xa0
- [12045.223630] Call Trace:
- [12045.223655] [c0000000fceb7d80] [c000000000026e74]
sys_rt_sigreturn+0x494/0x6c0
- [12045.223738] [c0000000fceb7e30] [c0000000000092e0]
system_call+0x38/0x108
- [12045.223806] Instruction dump:
- [12045.223841] 7c800164 4e800020 7c0022a6 f80304a8 7c0222a6 f80304b0
7c0122a6 f80304b8
- [12045.223955] 4e800020 e80304a8 7c0023a6 e80304b0 <7c0223a6> e80304b8
7c0123a6 4e800020
- [12045.224074] ---[ end trace cb8002ee240bae76 ]---
-
- It isn't clear exactly if there is really a use case for userspace
- returning with a suspended transaction, however, doing so doesn't (on
- its own) constitute a bad frame. As such, this patch simply discards
- the transactional state of the context calling the sigreturn and
- continues.
-
- Reported-by: Laurent Dufour <[email protected]>
- Signed-off-by: Cyril Bur <[email protected]>
- Tested-by: Laurent Dufour <[email protected]>
- Reviewed-by: Laurent Dufour <[email protected]>
- Acked-by: Simon Guo <[email protected]>
- Signed-off-by: Benjamin Herrenschmidt <[email protected]>
+ powerpc: signals: Discard transaction state from signal frames
+
+ Userspace can begin and suspend a transaction within the signal
+ handler which means they might enter sys_rt_sigreturn() with the
+ processor in suspended state.
+
+ sys_rt_sigreturn() wants to restore process context (which may have
+ been in a transaction before signal delivery). To do this it must
+ restore TM SPRS. To achieve this, any transaction initiated within the
+ signal frame must be discarded in order to be able to restore TM SPRs
+ as TM SPRs can only be manipulated non-transactionally..
+ >From the PowerPC ISA:
+ TM Bad Thing Exception [Category: Transactional Memory]
+ An attempt is made to execute a mtspr targeting a TM register in
+ other than Non-transactional state.
+
+ Not doing so results in a TM Bad Thing:
+ [12045.221359] Kernel BUG at c000000000050a40 [verbose debug info
unavailable]
+ [12045.221470] Unexpected TM Bad Thing exception at c000000000050a40 (msr
0x201033)
+ [12045.221540] Oops: Unrecoverable exception, sig: 6 [#1]
+ [12045.221586] SMP NR_CPUS=2048 NUMA PowerNV
+ [12045.221634] Modules linked in: xt_CHECKSUM iptable_mangle
ipt_MASQUERADE
+ nf_nat_masquerade_ipv4 iptable_nat nf_nat_ipv4 nf_nat nf_conntrack_ipv4
nf_defrag_ipv4
+ xt_conntrack nf_conntrack ipt_REJECT nf_reject_ipv4 xt_tcpudp bridge stp
llc ebtable_filter
+ ebtables ip6table_filter ip6_tables iptable_filter ip_tables x_tables
kvm_hv kvm
+ uio_pdrv_genirq ipmi_powernv uio powernv_rng ipmi_msghandler autofs4 ses
enclosure
+ scsi_transport_sas bnx2x ipr mdio libcrc32c
+ [12045.222167] CPU: 68 PID: 6178 Comm: sigreturnpanic Not tainted 4.7.0
#34
+ [12045.222224] task: c0000000fce38600 ti: c0000000fceb4000 task.ti:
c0000000fceb4000
+ [12045.222293] NIP: c000000000050a40 LR: c0000000000163bc CTR:
0000000000000000
+ [12045.222361] REGS: c0000000fceb7ac0 TRAP: 0700 Not tainted (4.7.0)
+ [12045.222418] MSR: 9000000300201033 <SF,HV,ME,IR,DR,RI,LE,TM[SE]> CR:
28444280 XER: 20000000
+ [12045.222625] CFAR: c0000000000163b8 SOFTE: 0 PACATMSCRATCH:
900000014280f033
+ GPR00: 01100000b8000001 c0000000fceb7d40 c00000000139c100 c0000000fce390d0
+ GPR04: 900000034280f033 0000000000000000 0000000000000000 0000000000000000
+ GPR08: 0000000000000000 b000000000001033 0000000000000001 0000000000000000
+ GPR12: 0000000000000000 c000000002926400 0000000000000000 0000000000000000
+ GPR16: 0000000000000000 0000000000000000 0000000000000000 0000000000000000
+ GPR20: 0000000000000000 0000000000000000 0000000000000000 0000000000000000
+ GPR24: 0000000000000000 00003ffff98cadd0 00003ffff98cb470 0000000000000000
+ GPR28: 900000034280f033 c0000000fceb7ea0 0000000000000001 c0000000fce390d0
+ [12045.223535] NIP [c000000000050a40] tm_restore_sprs+0xc/0x1c
+ [12045.223584] LR [c0000000000163bc] tm_recheckpoint+0x5c/0xa0
+ [12045.223630] Call Trace:
+ [12045.223655] [c0000000fceb7d80] [c000000000026e74]
sys_rt_sigreturn+0x494/0x6c0
+ [12045.223738] [c0000000fceb7e30] [c0000000000092e0]
system_call+0x38/0x108
+ [12045.223806] Instruction dump:
+ [12045.223841] 7c800164 4e800020 7c0022a6 f80304a8 7c0222a6 f80304b0
7c0122a6 f80304b8
+ [12045.223955] 4e800020 e80304a8 7c0023a6 e80304b0 <7c0223a6> e80304b8
7c0123a6 4e800020
+ [12045.224074] ---[ end trace cb8002ee240bae76 ]---
+
+ It isn't clear exactly if there is really a use case for userspace
+ returning with a suspended transaction, however, doing so doesn't (on
+ its own) constitute a bad frame. As such, this patch simply discards
+ the transactional state of the context calling the sigreturn and
+ continues.
+
+ Reported-by: Laurent Dufour <[email protected]>
+ Signed-off-by: Cyril Bur <[email protected]>
+ Tested-by: Laurent Dufour <[email protected]>
+ Reviewed-by: Laurent Dufour <[email protected]>
+ Acked-by: Simon Guo <[email protected]>
+ Signed-off-by: Benjamin Herrenschmidt <[email protected]>
diff --git a/Documentation/powerpc/transactional_memory.txt
b/Documentation/powerpc/transactional_memory.txt
index ba0a2a4..e32fdbb 100644
--- a/Documentation/powerpc/transactional_memory.txt
+++ b/Documentation/powerpc/transactional_memory.txt
@@ -167,6 +167,8 @@ signal will be rolled back anyway.
- For signals taken in non-TM or suspended mode, we use the
- normal/non-checkpointed stack pointer.
-
+ For signals taken in non-TM or suspended mode, we use the
+ normal/non-checkpointed stack pointer.
+
+Any transaction initiated inside a sighandler and suspended on return
+from the sighandler to the kernel will get reclaimed and discarded.
-
- Failure cause codes used by kernel
- ==================================
+
+ Failure cause codes used by kernel
+ ==================================
diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c
index b6aa378..a7daf74 100644
--- a/arch/powerpc/kernel/signal_32.c
+++ b/arch/powerpc/kernel/signal_32.c
@@ -1226,7 +1226,21 @@ long sys_rt_sigreturn(int r3, int r4, int r5, int r6,
int r7, int r8,
- (regs->gpr[1] + __SIGNAL_FRAMESIZE + 16);
- if (!access_ok(VERIFY_READ, rt_sf, sizeof(*rt_sf)))
- goto bad;
- +
- #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
+ (regs->gpr[1] + __SIGNAL_FRAMESIZE + 16);
+ if (!access_ok(VERIFY_READ, rt_sf, sizeof(*rt_sf)))
+ goto bad;
+ +
+ #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
+ /*
+ * If there is a transactional state then throw it away.
+ * The purpose of a sigreturn is to destroy all traces of the
+ * signal frame, this includes any transactional state created
+ * within in. We only check for suspended as we can never be
+ * active in the kernel, we are active, there is nothing better to
+ * do than go ahead and Bad Thing later.
+ * The cause is not important as there will never be a
+ * recheckpoint so it's not user visible.
+ */
+ if (MSR_TM_SUSPENDED(mfmsr()))
+ tm_reclaim_current(0);
+
- if (__get_user(tmp, &rt_sf->uc.uc_link))
- goto bad;
- uc_transact = (struct ucontext __user *)(uintptr_t)tmp;
+ if (__get_user(tmp, &rt_sf->uc.uc_link))
+ goto bad;
+ uc_transact = (struct ucontext __user *)(uintptr_t)tmp;
diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c
index 7e49984..70409bb 100644
--- a/arch/powerpc/kernel/signal_64.c
+++ b/arch/powerpc/kernel/signal_64.c
@@ -676,7 +676,21 @@ int sys_rt_sigreturn(unsigned long r3, unsigned long r4,
unsigned long r5,
- if (__copy_from_user(&set, &uc->uc_sigmask, sizeof(set)))
- goto badframe;
- set_current_blocked(&set);
- +
- #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
+ if (__copy_from_user(&set, &uc->uc_sigmask, sizeof(set)))
+ goto badframe;
+ set_current_blocked(&set);
+ +
+ #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
+ /*
+ * If there is a transactional state then throw it away.
+ * The purpose of a sigreturn is to destroy all traces of the
+ * signal frame, this includes any transactional state created
+ * within in. We only check for suspended as we can never be
+ * active in the kernel, we are active, there is nothing better to
+ * do than go ahead and Bad Thing later.
+ * The cause is not important as there will never be a
+ * recheckpoint so it's not user visible.
+ */
+ if (MSR_TM_SUSPENDED(mfmsr()))
+ tm_reclaim_current(0);
+
- if (__get_user(msr, &uc->uc_mcontext.gp_regs[PT_MSR]))
- goto badframe;
- if (MSR_TM_ACTIVE(msr)) {
+ if (__get_user(msr, &uc->uc_mcontext.gp_regs[PT_MSR]))
+ goto badframe;
+ if (MSR_TM_ACTIVE(msr)) {
== Breno Leitao <[email protected]> ==
That is exactly the commit id that solves the problem.
I was able to cherry pick 78a3e8889b4b6b99775ed954696ff3e017f5d19b on
top of Ubuntu-4.4.0-124.148 and now the code works fine.
-
1604 ? sudo dmesg -c > /dev/null
1604 ? ./tm-sigreturn
test: tm_sigreturn
tags: git_version:v4.17-rc5-0-g67b8d5c
success: tm_sigreturn
1604 ? dmesg
1604 ?
--
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/1771439
Title:
[LTC Test] Ubuntu 18.04: tm_sigreturn failed on P8 compat mode
16.04.04 guest
To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu-power-systems/+bug/1771439/+subscriptions
--
ubuntu-bugs mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs