Re: [RFC] MMIO accessors & barriers documentation

Jeff Garzik
2006-09-11T21:54:33Z

Benjamin Herrenschmidt wrote:
> Ah ? What about the comment in e1000 saying that it needs a wmb()
> between descriptor updates in memory and the mmio to kick them ? That
> would typically be a memory_to_io_wb(). Or are your MMIOs ordered cs.
> your cacheable stores ?

That's likely just following existing practice found in many network
drivers. The following two design patterns have been copied across a
great many network drivers:

1) When in a loop, reading through a DMA ring, put an "rmb()" at the top
of the loop, to ensure that the compiler does not optimize out all
memory loads after the first.

2) Use "wmb()" to ensure that just-written-to memory is visible to a PCI
device that will be reading said memory region via DMA.

I don't claim that either of these is correct, just that's existing
practice, perhaps in some case perpetuated by my own arch ignorance.

So, in a perfect world where I was designing my own API, I would create
two new API functions:

prepare_to_read_dma_memory()
and
make_memory_writes_visible_to_dmaing_devices()

and leave the existing APIs untouched. Those are the two fundamental
operations that are needed.

Jeff