Re: Generic IOMMU pooled allocator
From: Sowmini Varadhan <hidden>
Date: 2015-03-23 23:19:53
Also in:
sparclinux
On (03/24/15 09:36), Benjamin Herrenschmidt wrote:
- One pool only - Whenever the allocation is before the previous hint, do a flush, that should only happen if a wrap around occurred or in some cases if the device DMA mask forced it. I think we always update the hint whenever we successfully allocate from the small pools.
right, I believe this is close to what I discussed in the previous thread, and approx what I have in patchv5, except that the flush indirection can be passed as a function pointer, or via the table_ops.
- Deal with the largealloc case. That's the contentious issue, see below.
:
The largealloc issue is a different can of worms. We can try adding an option to disable the largealloc business completely (instead of hard wiring the "15", make that a variable and define that 0 means no largealloc pool).
What I've tried to do is to have a bool large_pool arg passed to iommu_tbl_pool_init. In my observation (instrumented for scsi, ixgbe), we never allocate more than 4 pages at a time, so I pass in large_pool == false for all the sparc platforms.
Or we can decide that large allocs are rare (typically pci_alloc_consistent, ie, driver init time), and thus always flush on them (or rather on free of a large chunk). David, what's your take there ? I have a feeling that should work fine without a noticeable performance issue... I would also keep a "dirty" flag set on any free and cleared on any flush to avoid more spurrious flushes, but here too the benefit might be in the noise.