This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH][BZ 18743] PowerPC: Fix a race condition when eliding a lock


Adhemerval Zanella <adhemerval.zanella@linaro.org> writes:

> Mainly because I see this issue is not powerpc specific and I think we should
> also fix for x86 (that currently also uses the same mechanism) and for future
> arches that also might potentially implement lock elision using this.

AFAICS, this is powerpc specific.  x86 ensures the memory access happens
inside the transaction.

Here is the x86 implementation:

  50 /* is_lock_free must be executed inside the transaction */
  51 
  52 /* Returns true if lock defined by IS_LOCK_FREE was elided.
  53    ADAPT_COUNT is a pointer to per-lock state variable. */
  54 
  55 #define ELIDE_LOCK(adapt_count, is_lock_free)                   \
  56   ({                                                            \
  57     int ret = 0;                                                \
  58                                                                 \
  59     if ((adapt_count) <= 0)                                     \
  60       {                                                         \
  61         for (int i = __elision_aconf.retry_try_xbegin; i > 0; i--) \
  62           {                                                     \
  63             unsigned int status;                                \
  64             if ((status = _xbegin ()) == _XBEGIN_STARTED)       \
  65               {                                                 \
  66                 if (is_lock_free)                               \
  67                   {                                             \
  68                     ret = 1;                                    \
  69                     break;                                      \
  70                   }                                             \
  71                 _xabort (_ABORT_LOCK_BUSY);                     \
  72               }                                                 \
  73             if (!elision_adapt (&(adapt_count), status))        \
  74               break;                                            \
  75           }                                                     \
  76       }                                                         \
  77     else                                                        \
  78       (adapt_count)--; /* missing updates ok */                 \
  79     ret;                                                        \
  80   })

-- 
Tulio Magno


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]