[GHC] #12070: SMP primitives broken on power(pc)

GHC ghc-devs at haskell.org
Mon May 16 08:58:30 UTC 2016


#12070: SMP primitives broken on power(pc)
-------------------------------------+-------------------------------------
           Reporter:  hvr            |             Owner:  trommler
               Type:  bug            |            Status:  new
           Priority:  highest        |         Milestone:  8.0.1
          Component:  Runtime        |           Version:  8.0.1-rc4
  System                             |
           Keywords:                 |  Operating System:  Unknown/Multiple
       Architecture:                 |   Type of failure:  None/Unknown
  Unknown/Multiple                   |
          Test Case:                 |        Blocked By:
           Blocking:                 |   Related Tickets:
Differential Rev(s):                 |         Wiki Page:
-------------------------------------+-------------------------------------
 I originally noticed this when working on the AIX port (32-bit powerpc),
 and recently saw this also on Linux/powerpc64, which lead to talking to
 Peter Trommler who already had a suspicion:

 Here's for example the CAS definition (in `<stg/SMP.h>`):

 {{{#!c
 StgWord
 cas(StgVolatilePtr p, StgWord o, StgWord n)
 {
     StgWord result;
     __asm__ __volatile__ (
         "1:     ldarx     %0, 0, %3\n"
         "       cmpd      %0, %1\n"
         "       bne       2f\n"
         "       stdcx.    %2, 0, %3\n"
         "       bne-      1b\n"
         "2:"
         :"=&r" (result)
         :"r" (o), "r" (n), "r" (p)
         :"cc", "memory"
     );
     return result;
 }}}

 The important detail is the lack any barrier instructions, such as `isync`
 at the end. This results in infrequent heap-corruptions which in turn
 result in all sorts of infrequent and hard to track down runtime-crashes
 (including in `ghc -j`).

 Peter has already a patch in the works which simply replaces the atomic
 powerpc primitives with `__sync_*` intrinsics which turn out to be more
 portable than inline-asm. I've been testing the patch already and it seems
 to have made all issues I experienced so far disappear, as well as fixing
 the `concprog01` test which was also failing infrequently.

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/12070>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list