The ABA problem occurs if some thread compares the value to A, and
then a different thread changes the value to B and then changes it
back to A, such that the initial thread gets confused about the state.
That can't happen here because the value in runqhead always increases,
and to make that work the value is always used modulo the length of
the run queue. Since the value always increases no ABA problem is
possible, because the other thread will never set the field back to an
earlier value. (It's technically possible for runqhead to be
incremented so many times that it wraps around to the original value,
but as runqhead is a 32-bit value that would require some 0x2000000
increments before the thread runs again, which is implausible.)
Ian