Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 28 Aug 2012 00:12:32 +0200
From:      Bernd Walter <ticso@cicely7.cicely.de>
To:        Warner Losh <imp@bsdimp.com>
Cc:        Tim Kientzle <tim@kientzle.com>, freebsd-arm@freebsd.org, freebsd-arch@freebsd.org, freebsd-mips@freebsd.org, Hans Petter Selasky <hans.petter.selasky@bitfrost.no>
Subject:   Re: Partial cacheline flush problems on ARM and MIPS
Message-ID:  <20120827221231.GB73992@cicely7.cicely.de>
In-Reply-To: <45C204C3-D4CE-4B00-886A-A88A0FE7CAD7@bsdimp.com>
References:  <6D83AF9D-577B-4C83-84B7-C4E3B32695FC@bsdimp.com> <zarafa.503b0e81.5c36.1a2f71091ebf9bd2@eric2.bitfrost> <A749E691-BF25-4B72-B929-56ABEB10F3E9@bsdimp.com> <DA9750F9-7B8A-49AF-8ECA-AC7D565CF3F5@kientzle.com> <45C204C3-D4CE-4B00-886A-A88A0FE7CAD7@bsdimp.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Mon, Aug 27, 2012 at 09:34:30AM -0600, Warner Losh wrote:
> 
> On Aug 27, 2012, at 9:12 AM, Tim Kientzle wrote:
> 
> > 
> > On Aug 27, 2012, at 6:38 AM, Warner Losh wrote:
> > 
> >> 
> >> On Aug 27, 2012, at 12:06 AM, Hans Petter Selasky wrote:
> >> 
> >>> Hi,
> >>> Correct.
> >>> 
> >>>> We also need some rules about working with buffers obtained from
> >>>> bus_dmamem_alloc() and external buffers passed to bus_dmamap_load().  I
> >>>> think the rule should be that a buffer obtained from bus_dmamem_alloc(),
> >>>> or more formally any region of memory mapped by a bus_dmamap_load(), is
> >>>> a single logical object which can only be accessed by one entity at a
> >>>> time.  That means that there cannot be two concurrent DMA operations
> >>>> happening in different regions of the same buffer, nor can DMA and CPU
> >>>> access be happening concurrently even if in different parts of the
> >>>> buffer.  
> >>> 
> >>> Is this something which we can fix using a simple __align(USB_DMA_ALIGN) on elements in C-structures which are allowed to be DMA loaded.
> >> 
> >> No. I don't think so.  the reason is that you can't define USB_DMA_ALGIN to be a constant on MIPS, at least, or I think ARM because that's determined at run time.
> > 
> > But don't mbuf structures do pretty much what Hans is suggesting?
> 
> They kinda do, and kinda don't.
> 
> > Why is mbuf okay?
> 
> mbuf is OK because it is never changed while the DMA is pending to the buffers.  That is, m_hdr and m_ext are invariant while the device owns the memory. In addition, mbuf allocations are so large that no two mbufs share the same cache line (although it looks like 256 might be too small to avoid that on some MIPS processors). usb buffers do not obey these same rules, otherwise none of the stuff we're talking about would matter.

I've always hated the design of USB controllers with their zillions
of tiny DMA buffers.

-- 
B.Walter <bernd@bwct.de> http://www.bwct.de
Modbus/TCP Ethernet I/O Baugruppen, ARM basierte FreeBSD Rechner uvm.



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