Subject: Re: CVS commit: syssrc
To: Jason R Thorpe <thorpej@zembu.com>
From: Matthew Jacob <mjacob@feral.com>
List: tech-kern
Date: 02/24/2001 17:52:45
On Sat, 24 Feb 2001, Jason R Thorpe wrote:

> On Sat, Feb 24, 2001 at 04:14:36PM -0800, Matthew Jacob wrote:
> 
> > I think the problem here is that there's no ordering requirement stated
> > that says that bus_dmamap_load[_raw] has to occur after bus_dmamem_map. I
> > can see that this would work okay if this was required.
> 
> Nono... if you're using dmamap_load_raw, by definition you are not loading
> memory that is mapped into the kernel address space.  In that case, there
> is, by definition, no cache coherency issue.  (You still have to use
> dmamap_sync, tho, since there might be bounce buffers involved.)

Given what you say below, then it's a non-issue. Otherwise I think I was
misunderstood here- if the only hint as to where to allocate and map memory so
that it can be coherent via bus_dmamem_map, then the bus_dmamap_load (which
may set bits in an iommu pte- something which really can't necessarily happen
at bus_dmamap_sync time) has to happen after the hint.

> 
>  > There's also nothing that can be use to give a hint to bus_dmamem_alloc that
>  > it should make an allocation such that a subsequent bus_dmamem_map with
>  > BUS_DMA_COHERENT would succeed sensibly
>  > 
>  > That is, unless you count the page-size allocation rule for bus_dmamem_alloc
>  > to be a sufficient guard. I don't- you assume that all you need to do is to
>  > rip a cpu mapping away from a page to guarantee you can make a piece of memory
>  > sync-able. This may not be a reasonable efficient mechanism. It'd be better to
>  > be able to tell bus_dmamem_alloc what you want the memory for to begin with.
> 
> This all falls into the "DMA safe memory" category, which is that
> bus_dmamem_alloc() allocates.  If a piece of memory cannot be made
> coherent (either by a COHERENT mapping or by synchrnoization), then
> it should not be returned by bus_dmamem_alloc().

Yes- well- I'd mentioned this to Eduardo in that the implication might indeed
have to be that bus_dmamem_alloc has to be made coherent'able. I still think a
hint flag would be more gracious.

This all of a sudden has a sickening familiarity. The same issue was discussed
at Sun- and I think I took your part in *that* discussion. I think I made the
argument that if you wanted to have streaming I/O to memory, just allocate via
kmem_alloc and map it as you would any other I/O request.

-matt