Re: readl/writel and memory barriers

From: Alan Cox (alan@lxorguk.ukuu.org.uk)
Date: Tue Feb 19 2002 - 04:31:32 EST


> In a quick survey of architectures that need explicit memory barriers to
> enforce ordering of PCI accesses, it seems that alpha and PPC include memory
> barriers inside readl() and writel(), whereas MIPS, sparc64, ia64, and s390

Alpha and PPC include them, x86 its handled by the hardware. __raw_read/write*
are bit more exciting.

> do not include them. (I'm not intimately familiar with these architectures
> so forgive me if I got some wrong...). What is the official story here?

To quote from the Documentation dir..

      <para>
        The read and write functions are defined to be ordered. That is the
        compiler is not permitted to reorder the I/O sequence. When the
        ordering can be compiler optimised, you can use <function>
        __readb</function> and friends to indicate the relaxed ordering. Use
        this with care. The <function>rmb</function> provides a read memory
        barrier. The <function>wmb</function> provides a write memory barrier.
      </para>

      <para>
        While the basic functions are defined to be synchronous with respect
        to each other and ordered with respect to each other the busses the
        devices sit on may themselves have asynchronocity. In paticular many
        authors are burned by the fact that PCI bus writes are posted
        asynchronously. A driver author must issue a read from the same
        device to ensure that writes have occurred in the specific cases the
        author cares. This kind of property cannot be hidden from driver
        writers in the API.
      </para>

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Sat Feb 23 2002 - 21:00:18 EST