In 6940310 we introduced versions of the push() and pop() methods on the CMRegionStack class that use locks to deal with failures that were caused by the MT-unsafe use of the lock-free push() and pop() versions (push() can be called concurrently, pop() can be called concurrently, but push() cannot be called concurrently with pop()). However, for performance and scalability reasons, it'd be good to go back to use the lock-free versions.
The reason the failure with the lock-free versions happened was the fact that we broke the assumption that the pop() method was not supposed to be called concurrent with the push() method. If a marking thread pops a region, scans it and while it's scanning it notices that it should yield, it pushes the remainder of the region back on the stack. A possible way to re-instate the lock-free versions of push() / pop() is to avoid this push by storing the remainder of the region locally on the CMTask data structure and processing it next time the task restarts.