ide with DMA and ram > 4GB

Marc Lörner marc.loerner at hob.de
Wed Nov 19 06:27:04 PST 2008


On Thursday 13 November 2008 21:02, John Baldwin wrote:
> On Wednesday 12 November 2008 12:23:14 pm Marc Lörner wrote:
> > Hello,
> > I just stepped over a problem with my IDE disk running in DMA-mode
> > and having more than 4GB of RAM.
> > It seems that the whole way down GEOM, ata-disk, ata-dma never is checked
> > whether physical address of buffer is less than 4GB an so fits in 32bits.
> > => when PRD is set the address is rigorously truncated to fit into 32bit,
> >        with buffer < 4GB all is quite fine.
>
> bus_dmamap_load() in ata-dma.c should result in bounce pages being
> allocated and having the data copied to pages below 4GB and having those
> addresses passed to the callback and stored in the PRD.

Thanks for pointing this out!

So it seems that bounce-pages are counted with helper-function run_filter.
But this function does never return 1 with dma-pages not lying in range (e.g. 
paddr > 4GB) but being aligned. 

Did nobody else have problems on 64bit ide-dma, or is it already working, but 
I didn't grasp functionality, yet?

For now, I came around this by adding a flag in "/sys/bus_dma.h" and setting 
this flag on tag-creation. So I now can check in run_filter whether I'm doing 
an ide-dma, relying on this and on check whether I got paddr > 4GB, I then 
can tell bus_dmamap_load to use bounce-pages.

Any thoughts or comments?

Regards,
Marc Loerner


More information about the freebsd-hackers mailing list