linux-mips
[Top] [All Lists]

Re: pci_alloc_consistent usage

To: Christoph Hellwig <hch@infradead.org>
Subject: Re: pci_alloc_consistent usage
From: Ralf Baechle <ralf@linux-mips.org>
Date: Tue, 27 May 2003 13:22:37 +0200
Cc: Atsushi Nemoto <anemo@mba.ocn.ne.jp>, wgowcher@yahoo.com, linux-mips@linux-mips.org
In-reply-to: <20030527115322.A7124@infradead.org>
Original-recipient: rfc822;linux-mips@linux-mips.org
References: <20030523215935.71373.qmail@web11901.mail.yahoo.com> <20030527091740.GA23296@linux-mips.org> <20030527.190749.39150100.nemoto@toshiba-tops.co.jp> <20030527115322.A7124@infradead.org>
Sender: linux-mips-bounce@linux-mips.org
User-agent: Mutt/1.4.1i
On Tue, May 27, 2003 at 11:53:22AM +0100, Christoph Hellwig wrote:

> > ralf> Use the value returned by pci_alloc_consistent in *dma_handle
> > ralf> instead of trying to do any conversions with of
> > ralf> pci_alloc_consistent's return value.
> > 
> > How about virt_to_page()?
> > 
> > Currently, many sound drivers (including ALSA) pass a
> > pci_alloc_consistent's return value to virt_to_page.
> 
> You are not allow to do so.  Any driver doing this is broken.

That however is exactly what's documented in DMA-mapping.txt:

[...]
portably refer to any piece of memory.  If you have a cpu pointer
(which may be validly DMA'd too) you may easily obtain the page
and offset using something like this:
                                                                                
        struct page *page = virt_to_page(ptr);
        unsigned long offset = ((unsigned long)ptr & ~PAGE_MASK);
[...]

While it's officially documented I still don't like it.  A double
conversion such as page_address(virt_to_page(ptr)) would accidently
turn a pointer of an uncached mapping into one to a cached area for the
same object - that will almost certainly not work as expected on a
non-coherent machine.

  Ralf

<Prev in Thread] Current Thread [Next in Thread>