Commit 33a03827 by Torvald Riegel Committed by Torvald Riegel

libitm: Add missing undo-logging of RfW src regions in gl_wt memtransfer.

	libitm/
	* method-gl.cc (gl_wt_dispatch::memtransfer_static): Add missing undo
	for RfW src.  Optimize number of calls to gtm_thr.

From-SVN: r184399
parent 95d65553
2012-02-20 Torvald Riegel <triegel@redhat.com> 2012-02-20 Torvald Riegel <triegel@redhat.com>
* method-gl.cc (gl_wt_dispatch::memtransfer_static): Add missing undo
for RfW src. Optimize number of calls to gtm_thr.
2012-02-20 Torvald Riegel <triegel@redhat.com>
* beginend.cc (GTM::gtm_thread::begin_transaction): Move serial lock * beginend.cc (GTM::gtm_thread::begin_transaction): Move serial lock
acquisition to ... acquisition to ...
* retry.cc (GTM::gtm_thread::decide_begin_dispatch): ... here. * retry.cc (GTM::gtm_thread::decide_begin_dispatch): ... here.
......
...@@ -85,9 +85,9 @@ static gl_mg o_gl_mg; ...@@ -85,9 +85,9 @@ static gl_mg o_gl_mg;
class gl_wt_dispatch : public abi_dispatch class gl_wt_dispatch : public abi_dispatch
{ {
protected: protected:
static void pre_write(const void *addr, size_t len) static void pre_write(const void *addr, size_t len,
gtm_thread *tx = gtm_thr())
{ {
gtm_thread *tx = gtm_thr();
gtm_word v = tx->shared_state.load(memory_order_relaxed); gtm_word v = tx->shared_state.load(memory_order_relaxed);
if (unlikely(!gl_mg::is_locked(v))) if (unlikely(!gl_mg::is_locked(v)))
{ {
...@@ -123,7 +123,7 @@ protected: ...@@ -123,7 +123,7 @@ protected:
tx->undolog.log(addr, len); tx->undolog.log(addr, len);
} }
static void validate() static void validate(gtm_thread *tx = gtm_thr())
{ {
// Check that snapshot is consistent. We expect the previous data load to // Check that snapshot is consistent. We expect the previous data load to
// have acquire memory order, or be atomic and followed by an acquire // have acquire memory order, or be atomic and followed by an acquire
...@@ -137,7 +137,6 @@ protected: ...@@ -137,7 +137,6 @@ protected:
// or read an orec value that was written after the data had been written. // or read an orec value that was written after the data had been written.
// Either will allow us to detect inconsistent reads because it will have // Either will allow us to detect inconsistent reads because it will have
// a higher/different value. // a higher/different value.
gtm_thread *tx = gtm_thr();
gtm_word l = o_gl_mg.orec.load(memory_order_relaxed); gtm_word l = o_gl_mg.orec.load(memory_order_relaxed);
if (l != tx->shared_state.load(memory_order_relaxed)) if (l != tx->shared_state.load(memory_order_relaxed))
tx->restart(RESTART_VALIDATE_READ); tx->restart(RESTART_VALIDATE_READ);
...@@ -198,9 +197,13 @@ public: ...@@ -198,9 +197,13 @@ public:
static void memtransfer_static(void *dst, const void* src, size_t size, static void memtransfer_static(void *dst, const void* src, size_t size,
bool may_overlap, ls_modifier dst_mod, ls_modifier src_mod) bool may_overlap, ls_modifier dst_mod, ls_modifier src_mod)
{ {
if ((dst_mod != WaW && src_mod != RaW) gtm_thread *tx = gtm_thr();
&& (dst_mod != NONTXNAL || src_mod == RfW)) if (dst_mod != WaW && dst_mod != NONTXNAL)
pre_write(dst, size); pre_write(dst, size, tx);
// We need at least undo-logging for an RfW src region because we might
// subsequently write there with WaW.
if (src_mod == RfW)
pre_write(src, size, tx);
// FIXME We should use atomics here (see store()). Let's just hope that // FIXME We should use atomics here (see store()). Let's just hope that
// memcpy/memmove are good enough. // memcpy/memmove are good enough.
...@@ -211,7 +214,7 @@ public: ...@@ -211,7 +214,7 @@ public:
if (src_mod != RfW && src_mod != RaW && src_mod != NONTXNAL if (src_mod != RfW && src_mod != RaW && src_mod != NONTXNAL
&& dst_mod != WaW) && dst_mod != WaW)
validate(); validate(tx);
} }
static void memset_static(void *dst, int c, size_t size, ls_modifier mod) static void memset_static(void *dst, int c, size_t size, ls_modifier mod)
......
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