On Fri, 28 Apr 2023 09:53:38 +0100 Mike Lothian <mike@xxxxxxxxxxxxxx> wrote: > On Wed, 19 Apr 2023 at 11:05, Petr Tesarik <petrtesarik@xxxxxxxxxxxxxxx> wrote: > > > > From: Petr Tesarik <petr.tesarik.ext@xxxxxxxxxx> > > > > The goal of my work is to provide more flexibility in the sizing of > > SWIOTLB. > > > > The software IO TLB was designed with these assumptions: > > > > 1. It would not be used much, especially on 64-bit systems. > > 2. A small fixed memory area (64 MiB by default) is sufficient to > > handle the few cases which require a bounce buffer. > > 3. 64 MiB is little enough that it has no impact on the rest of the > > system. > > > > First, if SEV is active, all DMA must be done through shared > > unencrypted pages, and SWIOTLB is used to make this happen without > > changing device drivers. The software IO TLB size is increased to > > 6% of total memory in sev_setup_arch(), but that is more of an > > approximation. The actual requirements may vary depending on the > > amount of I/O and which drivers are used. These factors may not be > > know at boot time, i.e. when SWIOTLB is allocated. > > > > Second, other colleagues have noticed that they can reliably get > > rid of occasional OOM kills on an Arm embedded device by reducing > > the SWIOTLB size. This can be achieved with a kernel parameter, but > > determining the right value puts additional burden on pre-release > > testing, which could be avoided if SWIOTLB is allocated small and > > grows only when necessary. > > > > Changes from v1-devel-v7: > > - Add comments to acquire/release barriers > > - Fix whitespace issues reported by checkpatch.pl > > > > Changes from v1-devel-v6: > > - Provide long description of functions > > - Fix kernel-doc (Returns: to Return:) > > - Rename __lookup_dyn_slot() to lookup_dyn_slot_locked() > > > > Changes from RFC: > > - Track dynamic buffers per device instead of per swiotlb > > - Use a linked list instead of a maple tree > > - Move initialization of swiotlb fields of struct device to a > > helper function > > - Rename __lookup_dyn_slot() to lookup_dyn_slot_locked() > > - Introduce per-device flag if dynamic buffers are in use > > - Add one more user of DMA_ATTR_MAY_SLEEP > > - Add kernel-doc comments for new (and some old) code > > - Properly escape '*' in dma-attributes.rst > > > > Petr Tesarik (7): > > swiotlb: Use a helper to initialize swiotlb fields in struct device > > swiotlb: Move code around in preparation for dynamic bounce buffers > > dma-mapping: introduce the DMA_ATTR_MAY_SLEEP attribute > > swiotlb: Dynamically allocated bounce buffers > > swiotlb: Add a boot option to enable dynamic bounce buffers > > drm: Use DMA_ATTR_MAY_SLEEP from process context > > swiotlb: per-device flag if there are dynamically allocated buffers > > > > .../admin-guide/kernel-parameters.txt | 6 +- > > Documentation/core-api/dma-attributes.rst | 10 + > > drivers/base/core.c | 4 +- > > drivers/gpu/drm/drm_gem_shmem_helper.c | 2 +- > > drivers/gpu/drm/drm_prime.c | 2 +- > > include/linux/device.h | 12 + > > include/linux/dma-mapping.h | 6 + > > include/linux/swiotlb.h | 54 ++- > > kernel/dma/swiotlb.c | 382 ++++++++++++++++-- > > 9 files changed, 443 insertions(+), 35 deletions(-) > > > > -- > > 2.25.1 > > > > Hi > > Is this a potential fix for > https://bugzilla.kernel.org/show_bug.cgi?id=217310 where I'm manually > setting bigger buffers to keep my wifi working? Yes. With these patches applied, your system should run just fine with swiotlb=dynamic. However, keep in mind that this implementation adds a bit of overhead. In short, it trades a bit of performance for not having to figure out the optimal swiotlb size at boot time. Petr T