[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <87sk719hbm.fsf@basil.nowhere.org>
Date: Mon, 12 Apr 2010 10:59:57 +0200
From: Andi Kleen <andi@...stfloor.org>
To: Alan Stern <stern@...land.harvard.edu>
Cc: Daniel Mack <daniel@...aq.de>, linux-kernel@...r.kernel.org,
Pedro Ribeiro <pedrib@...il.com>, <akpm@...ux-foundation.org>,
Greg KH <gregkh@...e.de>, <alsa-devel@...a-project.org>,
<linux-usb@...r.kernel.org>
Subject: Re: USB transfer_buffer allocations on 64bit systems
Alan Stern <stern@...land.harvard.edu> writes:
>>
>> The fix is to use usb_buffer_alloc() for that purpose which ensures
>> memory that is suitable for DMA. And on x86_64, this also means that the
>> upper 32 bits of the address returned are all 0's.
>
> That is not a good fix. usb_buffer_alloc() provides coherent memory,
> which is not what we want. I believe the correct fix is to specify the
> GFP_DMA32 flag in the kzalloc() call.
The traditional way to handle this is to leave it to swiotlb in
pci_map_*. pci_map_* is needed anyways if you run with a IOMMU.
Also note at least on x86 systems coherent memory is the same as non coherent
memory. And GFP_DMA32 is a x86 specific flag, doesn't necessarily
do any good anywhere else.
So if you add x86isms anyways you could as well use dma_alloc_coherent()
directly which is actually better at this than a simple GFP_DMA32
and as a bonus handles the IOMMUs correctly too.
Or just use GFP_KERNEL and pci_map_* later.
-Andi
--
ak@...ux.intel.com -- Speaking for myself only.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists