From: David Brownell <david-b@pacbell.net>
To: James Bottomley <James.Bottomley@steeleye.com>
Cc: linux-kernel@vger.kernel.org
Subject: Re: [PATCH] generic device DMA (dma_pool update)
Date: Tue, 31 Dec 2002 09:04:44 -0800 [thread overview]
Message-ID: <3E11CE2C.3000308@pacbell.net> (raw)
In-Reply-To: 200212311500.gBVF0qZ01875@localhost.localdomain
James Bottomley wrote:
> I think a much easier way of doing this would be a slight modification to the
> current pci_pool code: we know it works already. All that really has to
The same is true of the slab code, which is a better allocator. Why should
kernels require an extra allocator, when pci_pool can safely be eliminated on
quite a few systems?
> change is that it should take a struct device instead of a pci_dev and it
> should call dma_alloc_coherent to get the source memory. The rest of the pci
> pool code is mainly about memory management and is well tested and so should
> remain (much as I'd like to see a mempool implementation).
In that patch, the pci_pool code _does_ remain ... only for use on platforms
where __get_free_pages() memory, used by the slab allocator, can't be used
(at least without a lot of setup work).
You finally got me to look at a the mempool code. I didn't notice any
code to actually allocate 1/Nth page units; that's delegated to some
other code. (Except for that "Raced" buglet, where it doesn't delegate,
and uses kfree instead of calling pool->free().) So that's another reason
it'd not be appropriate to try to use it in this area: it doesn't solve
the core problem, which is non-wasteful allocation of 1/Nth page units.
> + BUG_ON(dev->bus != &pci_bus_type);
> +
> + if (size >= PAGE_SIZE)
> + return pci_alloc_consistent (pdev, size, handle);
>
> This would work if just passed to dma_alloc_coherent and drop the check for
> the pci_bus_type
True ... though that wouldn't be true on the other branch, where it'd
be choosing some pci_pool based on size (when it gets a way to find a
per-device array of pools). Do you know for a fact that GCC isn't
smart enough to get rid of that duplicate check? (I'm curious.)
> +dma_alloc (struct device *dev, size_t size, dma_addr_t *handle, int mem_flags)
> +{
> + void *ret;
> +
> + /* We rely on kmalloc memory being aligned to L1_CACHE_BYTES, to
> + * prevent cacheline sharing during DMA. With dma-incoherent caches,
> + * such sharing causes bugs, not just cache-related slowdown.
> + */
> + ret = kmalloc (size, mem_flags | __dma_slab_flags (dev));
> + if (likely (ret != 0))
> + *handle = virt_to_phys (ret);
> + return ret;
>
> Just can't be done: you can't get consistent memory from kmalloc and you
> certainly can't use virt_to_phys and expect it to work on IOMMU hardware.
Actually it _can_ be done on x86 and several other common platforms. (But
"coherent" memory was the agreed terminology change, yes?) Which is where
that particular code kicks in ... x86, some ppc, sa1111, and uml for now.
No IOMMUs there.
Any system where pci_alloc_consistent() is calling __get_free_pages(), and
doing no further setup beyond a virt_to_phys() call, is a candidate for having
much simpler allocation of I/O memory. I could even imagine that being true on
some systems where an "IOMMU" just accelerates I/O (prefetch, cache bypass, etc)
for streaming mappings, and isn't strictly needed otherwise.
- Dave
> James
>
>
>
>
>
>
>
next prev parent reply other threads:[~2002-12-31 16:50 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-12-27 20:21 [RFT][PATCH] generic device DMA implementation David Brownell
2002-12-27 21:40 ` James Bottomley
2002-12-28 1:29 ` David Brownell
2002-12-28 16:18 ` James Bottomley
2002-12-28 18:16 ` David Brownell
2002-12-28 1:56 ` David Brownell
2002-12-28 16:13 ` James Bottomley
2002-12-28 17:41 ` David Brownell
2002-12-30 23:11 ` [PATCH] generic device DMA (dma_pool update) David Brownell
2002-12-31 15:00 ` James Bottomley
2002-12-31 17:04 ` David Brownell [this message]
2002-12-31 17:23 ` James Bottomley
2002-12-31 18:11 ` David Brownell
2002-12-31 18:44 ` James Bottomley
2002-12-31 19:29 ` David Brownell
2002-12-31 19:50 ` James Bottomley
2002-12-31 21:17 ` David Brownell
2002-12-31 16:36 ` James Bottomley
2002-12-31 17:32 ` David Brownell
2002-12-27 21:47 ` [RFT][PATCH] generic device DMA implementation James Bottomley
2002-12-28 2:28 ` David Brownell
-- strict thread matches above, loose matches on Subject: below --
2002-12-31 22:02 [PATCH] generic device DMA (dma_pool update) Adam J. Richter
2002-12-31 22:41 ` Andrew Morton
2002-12-31 23:23 ` David Brownell
2002-12-31 23:27 ` Andrew Morton
2002-12-31 23:44 ` David Brownell
2002-12-31 23:47 ` James Bottomley
2003-01-01 17:10 ` James Bottomley
2002-12-31 23:35 ` David Brownell
2002-12-31 23:38 Adam J. Richter
2003-01-01 0:02 Adam J. Richter
2003-01-01 19:21 Adam J. Richter
2003-01-01 19:48 ` James Bottomley
2003-01-02 2:11 ` David Brownell
2003-01-02 4:13 Adam J. Richter
2003-01-02 16:41 ` James Bottomley
2003-01-02 18:26 ` David Brownell
2003-01-02 17:04 Adam J. Richter
2003-01-02 22:07 Adam J. Richter
2003-01-03 0:20 ` Russell King
2003-01-03 4:50 ` David Brownell
2003-01-03 6:11 ` David Brownell
2003-01-03 6:46 ` David Brownell
2003-01-03 6:52 ` William Lee Irwin III
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3E11CE2C.3000308@pacbell.net \
--to=david-b@pacbell.net \
--cc=James.Bottomley@steeleye.com \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.