Thread (35 messages) 35 messages, 8 authors, 2018-12-05

[PATCH v2 0/3] iommu/io-pgtable-arm-v7s: Use DMA32 zone for page tables

From: Nicolas Boichat <hidden>
Date: 2018-11-23 05:38:49
Also in: linux-iommu, linux-mm, lkml

On Fri, Nov 23, 2018 at 11:04 AM Nicolas Boichat [off-list ref] wrote:
On Thu, Nov 22, 2018 at 4:23 PM Christoph Hellwig [off-list ref] wrote:
quoted
On Wed, Nov 21, 2018 at 10:26:26PM +0000, Robin Murphy wrote:
quoted
TBH, if this DMA32 stuff is going to be contentious we could possibly just
rip out the offending kmem_cache - it seemed like good practice for the
use-case, but provided kzalloc(SZ_1K, gfp | GFP_DMA32) can be relied upon to
give the same 1KB alignment and chance of succeeding as the equivalent
kmem_cache_alloc(), then we could quite easily make do with that instead.
Neither is the slab support for kmalloc, not do kmalloc allocations
have useful alignment apparently (at least if you use slub debug).

But I do agree with the sentiment of not wanting to spread GFP_DMA32
futher into the slab allocator.

I think you want a simple genalloc allocator for this rather special
use case.
So I had a look at genalloc, we'd need to add pre-allocated memory
using gen_pool_add [1]. There can be up to 4096 L2 page tables, so we
may need to pre-allocate 4MB of memory (1KB per L2 page table). We
could add chunks on demand, but then it'd be difficult to free them up
(genalloc does not have a "gen_pool_remove" call). So basically if the
full 4MB end up being requested, we'd be stuck with that until the
iommu domain is freed (on the arm64 Mediatek platforms I looked at,
there is only one iommu domain, and it never gets freed).
I tried out genalloc with pre-allocated 4MB, and that seems to work
fine. Allocating in chunks would require genalloc changes as
gen_pool_add calls kmalloc with just GFP_KERNEL [2], and we are in
atomic context in __arm_v7s_alloc_table...

[2] https://elixir.bootlin.com/linux/latest/source/lib/genalloc.c#L190
page_frag would at least have a chance to reclaim those pages (if I
understand Christoph's statement correctly)

Robin: Do you have some ideas of the lifetime/usage of L2 tables? If
they are usually few of them, or if they don't get reclaimed easily,
some on demand genalloc allocation would be ok (or even 4MB allocation
on init, if we're willing to take that hit). If they get allocated and
freed together, maybe page_frag is a better option?

Thanks,

[1] https://www.kernel.org/doc/html/v4.19/core-api/genalloc.html
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help