On Mon, Apr 12, 2010 at 12:57:16PM -0400, Alan Stern wrote:
On Mon, 12 Apr 2010, Andi Kleen wrote:
Hmm, thanks. But things must still go wrong somewhere, otherwise the GFP_DMA32 wouldn't be needed?
Indeed, something must go wrong somewhere. Since Daniel's patch fixed the problem by changing the buffer from a streaming mapping to a coherent mapping, it's logical to assume that bad DMA addresses have something to do with it. But we don't really know for certain.
Given that - at least for non-64-aware host controllers - we want memory <4GB anyway for USB transfers to avoid DMA bouncing buffers, maybe we should just do that and fix the problem at this level? I already started to implement usb_[mz]alloc() and use it in some USB drivers.
But even after all collected wisdom about memory management in this thread, I'm still uncertain of how to get suitable memory. Using dma_alloc_coherent() seems overdone as that type of memory is not necessarily needed and might be a costly good on some platforms. And as fas as I understand, kmalloc(GFP_DMA) does not avoid memory >4GB.
Can anyone explain which is the right way to go?
Daniel