Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 17 Mar 2010 11:52:23 -0400
From:      Andrew Gallatin <gallatin@cs.duke.edu>
To:        Bruce Evans <brde@optusnet.com.au>
Cc:        svn-src-head@FreeBSD.org, svn-src-all@FreeBSD.org, src-committers@FreeBSD.org, Pyun YongHyeon <yongari@FreeBSD.org>
Subject:   Re: svn commit: r205221 - head/sys/dev/bge
Message-ID:  <4BA0FAB7.7060101@cs.duke.edu>
In-Reply-To: <20100318015744.B26867@delplex.bde.org>
References:  <201003161745.o2GHjG3G051630@svn.freebsd.org> <4BA0CF37.2010903@cs.duke.edu> <20100318015744.B26867@delplex.bde.org>

next in thread | previous in thread | raw e-mail | index | archive | help
Bruce Evans wrote:
 > On Wed, 17 Mar 2010, Andrew Gallatin wrote:
 >
 >> Pyun YongHyeon wrote:
 >>
 >>>   Revert r205090.
 >>>   It's hard to know when the mail box register write will get 
flushed to
 >>>   the hardware and it may take longer.
 >>>     Pointed out by:    scottl
 >>
 >> I may be mis-reading the code, but it looks like the mailbox
 >> register is in memory space, which should be flushed immediately
 >> unless write-combining is enabled on the region.  The bge
 >> driver does not seem to be setting up write combining.
 >> Is the concern that something may enable write combining
 >> behind your back?  In that case, a wmb() could act as a
 >> serializing instruction and flush the WC buffers.
 >
 > We want writes to the PCI bus to be efficient.  Normally (?) writes
 > to bge registers appear to be several times faster than reads.  I don't
 > know if this depends on write combining but think it depends on write
 > buffering which can delay the write to the hardware by about the
 > difference between the read time and the time to write to the bufer.
 > Any forcing of serialization or timing would presumably lose the
 > benefits of the buffer.

What buffer? On the host side of the PCI{e} bus or the NIC side??

For i386/amd64, only write-combining (MTRR or PAT) pio mappings are
buffered on the host side.  Every other PIO behaves as if implicitly
surrounded by a serializing instruction before and after for legacy
reasons.  On non i386/amd64, there may be buffering; it depends on the
platform.  Or are you talking about buffering on the bge side of the
PCI{e} bus?

The point I was trying to make is that PIO reads are very
(hopelessly?) slow because the CPU stalls while waiting for the device
to return some data, and you're at the mercy of the device.  In
general, when you're given a choice as to what to use to force a write
across the PCI{e} bus (in the case of WC being enabled, or working on
a non-x86/amd64 arch), the best choice by far is a serializing
instruction (wmb()) and not a PIO read.  Unfortunately, it looks like
a PIO read is intimately entwined with correct operation of this
device, so doing it the old way is probably safest/best.

Sorry for the noise..

Drew





Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4BA0FAB7.7060101>