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/

Reply via email to