Re: Re: test_stack on powerpc (power7)

Will Schmidt <will_schmidt-DhXWPJtHtuFWk0Htik3J/[email protected]>
Newsgroups gmane.comp.programming.garbage-collection.boehmgc
Organization Internation Business Machines
Message-ID <1390949404.7066.92.camel@brimstone>
On Tue, 2014-01-28 at 16:43 -0500, Lennart Sorensen wrote:
> On Tue, Jan 28, 2014 at 03:22:35PM -0600, Will Schmidt wrote:
> > Hi All, 
> >   I've been looking at the test_stack test case failure as seen on
> > ppc64 / power7 based systems.    I don't have a fix, but believe I
> > understand where the problem is occurring.  
> > 
> > The simplest case I've been able to duplicate is with three threads.
> > As I've added debug to the code, the problem gets harder to nail down
> > precisely, but this is what seems to be happening.
> > 
> > In the failure scenario:
> >   The list appears OK during run_one_test() before and after
> > AO_stack_pop() is called.  The thread is holding two entries in the t[i]
> > array, and the list still looks OK. The list is damaged after the
> > AO_stack_push() call is made.
> > 
> > Within AO_stack_push(),
> > [src/atomic_ops_stack.c:AO_stack_pop_explicit_aux_require()]
> > The malfunction seems to be triggered while one of the threads is
> > between the "first=AO_load(list);" and the
> > "AO_compare_and_swap_release(list,first,next);".  Either one or both of
> > the other threads will have removed and replaced multiple elements, such
> > that the compare and swap of list,first,next will pass the check, but
> > the list entries, particularly the next pointer at first, has changed. 
> > 
> > This is referenced in the comment at that location:
> >   /* Thus its next link cannot have changed out from under us, and we   */
> >   /* removed exactly one entry and preserved the rest of the list.      */
> >   /* Note that it is quite possible that an additional entry was        */
> >   /* inserted and removed while we were running; this is OK since the   */
> >   /* part of the list following first must have remained unchanged, and */
> >   /* first must again have been at the head of the list when the        */
> >   /* compare_and_swap succeeded.                                        */
> > 
> > which seem to be untrue in this case.
> > 
> > 
> > The powerpc AO_* functions seem to be OK.  We'd prefer the gcc atomic
> > builtins be used (http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Atomic-Builtins.html),
> > (thats what they are there for), but I don't think that change 
> > would help in this case.
> > 
> > My recommendation is that the test be rewritten to handle the case where
> > first->next has changed underneath the current thread.
> >  A shorter term fix would probably be to disable the test_stack test for
> > power7 and newer processors, until it can be fixed. 
> 
> So does this mean the stack test is wrong?  I was worried that the actual
> AO_ functions were wrong on powerpc.

Yes,  Thats my feeling right now, that the test is wrong.  To clarify,
it's obviously not all over wrong, but there is definitely a corner
condition that we're able to hit on power7 and newer that we don't
(yet?) see on other platforms.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.