On Wed, 2012-10-31 at 20:04 +0900, anish kumar wrote: > > This now does: > > > > CPU 1 CPU 2 > > ----- ----- > > (flags = 0) > > cmpxchg(flags, 0, IRQ_WORK_FLAGS) > > (flags = 3) > > [...]
We can still add here: (fetch flags) > > xchg(&flags, IRQ_WORK_BUSY) > > (flags = 2) > > func() > > oflags = cmpxchg(&flags, flags, > > nflags); Then the cmpxchg() would fail, and oflags would be 2 > > (sees flags = 2) > > if (flags & IRQ_WORK_PENDING) This should be: if (oflags & IRQ_WORK_PENDING) > > (not true) > > (loop) > > > > cmpxchg(flags, 2, 0); > > (flags = 2) This should be: (flags = 0) as we described the previous cmpxchg() as failing, flags would still be 2 before this cmpxchg(), and this one would succeed. -- Steve > > flags = 3 > > > > > > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/