On Wed, Nov 21, 2007 at 01:50:16PM +0000, Ralf Baechle wrote:
> On Tue, Nov 20, 2007 at 05:02:20PM +0100, Nick Piggin wrote:
> 
> > + TYPE          FULL                    CACHEABLE (SMP CONDITIONAL) IO
> > + =========  ======================= =========================== 
> > ============
> > + GENERAL    mb()               smp_mb()                    io_mb()
> > + WRITE         wmb()                   smp_wmb()                   io_wmb()
> > + READ          rmb()                   smp_rmb()                   io_rmb()
> > + DATA DEP.  read_barrier_depends()  smp_read_barrier_depends()
> 
> A while ago I went through the kernel looking at the uses mb(), wmb() and
> rmb() and found that every use was either fishy or should have been a
> smp_mb(), smp_wmb() or wmp_rmb().  Which leads me to the question if there
> is any need for the non-smp_ variants left or can we just bury them?

I don't know driver code very well, however it seems like there is a
legitimate need for barriers there, _however_ I think a lot of those went
in when writel could be unordered on some architectures.

The sane way to do it is to make all drivers default to strongly ordered
IO (eg. make readl writel strongly ordered). And then yes indeed I believe
most of the mb/wmb/rmb can go away.

We still need full memory barrires in order to order cacheable access with
IO access (eg. in order to support SMP locking of IO routines). However in
that case I believe an easily understood lock-based primitive should be
provided, along with a fully ordering implementations of the regular memory
barriers, rather than mmiowb (which clearly very few driver writers or anyone
else understands). 

After that, if some architectures want to implement more relaxed variants
of the IO accessors, then OK. And we can use io_ memory barriers for that.

-
To unsubscribe from this list: send the line "unsubscribe linux-arch" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to