summaryrefslogtreecommitdiffstats
path: root/libitm
diff options
context:
space:
mode:
authortorvald <torvald@138bc75d-0d04-0410-961f-82ee72b054a4>2013-06-20 16:40:38 +0000
committertorvald <torvald@138bc75d-0d04-0410-961f-82ee72b054a4>2013-06-20 16:40:38 +0000
commit00b76ca9c06e131110fb83e1de821d7d69f46bd2 (patch)
tree8928a26da25237053ba123d609fec2b28f64361d /libitm
parent566da47ba10a0acd6d9cefea53eed4ba1fef6db6 (diff)
downloadppe42-gcc-00b76ca9c06e131110fb83e1de821d7d69f46bd2.tar.gz
ppe42-gcc-00b76ca9c06e131110fb83e1de821d7d69f46bd2.zip
libitm: Fix handling of reentrancy in the HTM fastpath.
PR libitm/57643 * beginend.cc (gtm_thread::begin_transaction): Handle reentrancy in the HTM fastpath. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@200250 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libitm')
-rw-r--r--libitm/ChangeLog6
-rw-r--r--libitm/beginend.cc10
2 files changed, 16 insertions, 0 deletions
diff --git a/libitm/ChangeLog b/libitm/ChangeLog
index ed9114b9147..26001b670bd 100644
--- a/libitm/ChangeLog
+++ b/libitm/ChangeLog
@@ -1,3 +1,9 @@
+2013-06-20 Torvald Riegel <triegel@redhat.com>
+
+ PR libitm/57643
+ * beginend.cc (gtm_thread::begin_transaction): Handle reentrancy in
+ the HTM fastpath.
+
2013-03-31 Gerald Pfeifer <gerald@pfeifer.com>
PR bootstrap/56714
diff --git a/libitm/beginend.cc b/libitm/beginend.cc
index 93e702efc9e..a3bf5492153 100644
--- a/libitm/beginend.cc
+++ b/libitm/beginend.cc
@@ -197,6 +197,8 @@ GTM::gtm_thread::begin_transaction (uint32_t prop, const gtm_jmpbuf *jb)
// We are executing a transaction now.
// Monitor the writer flag in the serial-mode lock, and abort
// if there is an active or waiting serial-mode transaction.
+ // Note that this can also happen due to an enclosing
+ // serial-mode transaction; we handle this case below.
if (unlikely(serial_lock.is_write_locked()))
htm_abort();
else
@@ -219,6 +221,14 @@ GTM::gtm_thread::begin_transaction (uint32_t prop, const gtm_jmpbuf *jb)
tx = new gtm_thread();
set_gtm_thr(tx);
}
+ // Check whether there is an enclosing serial-mode transaction;
+ // if so, we just continue as a nested transaction and don't
+ // try to use the HTM fastpath. This case can happen when an
+ // outermost relaxed transaction calls unsafe code that starts
+ // a transaction.
+ if (tx->nesting > 0)
+ break;
+ // Another thread is running a serial-mode transaction. Wait.
serial_lock.read_lock(tx);
serial_lock.read_unlock(tx);
// TODO We should probably reset the retry count t here, unless
OpenPOWER on IntegriCloud