[RFC PATCH v2 00/10] dma-mapping: Add preservation of direct allocations
Samiullah Khawaja <[email protected]>
| Newsgroups | org.infradead.lists.kexec,dev.linux.lists.iommu,org.kernel.vger.linux-kernel,org.kvack.linux-mm |
|---|---|
| Message-ID | <[email protected]> |
This is an RFC v2 to discuss the preservation of DMA allocations for devices that are using direct allocation mode. Note preservation here means preservation of physical memory using KHO only. IOVAs and IOMMU mappings are out of scope. The complexity and need of this was discussed in the thread mentioned below. It was proposed to allow preservation of only a subset of allocations with minimum support. Offline discussion with Will Deacon concluded that this series is still needed, because we still want to use coherent allocations for Arm sMMUv3 ste/cds, so sending this v2. https://lore.kernel.org/all/[email protected]/ https://lore.kernel.org/all/aepRy7Gp7Ng85Zr7@willie-the-truck/ Note DMA allocation allows memory allocation from various allocators in various configurations. This RFC supports preservation with, - Direct Allocation Only. - Pages allocated through alloc_page (Buddy allocator). - No CMA support. - No DMA pools. - No device coherent memory regions. Note that this series does not include/use the page-split and page refcount fixes during KHO restore, that are in review here: https://lore.kernel.org/all/[email protected]/ The changes are also pushed here: https://github.com/samikhawaja/linux/tree/dma-alloc-preserve-direct-v2 Testing: This patch series includes a Kunit test, for testing dma allocation preservation, by using the KHO stubs added in a separate patch series: https://lore.kernel.org/all/[email protected]/ The following test runs are executed in qemu. Run on x86: KTAP version 1 1..1 KTAP version 1 # Subtest: dma_direct_liveupdate # module: direct_test 1..5 KTAP version 1 # Subtest: test_dma_direct_coherent ok 1 size=128 ok 2 size=4096 ok 3 size=8192 ok 4 size=12288 ok 5 size=32768 # test_dma_direct_coherent: pass:5 fail:0 skip:0 total:5 ok 1 test_dma_direct_coherent KTAP version 1 # Subtest: test_dma_direct_non_coherent ok 1 size=128 ok 2 size=4096 ok 3 size=8192 ok 4 size=12288 ok 5 size=32768 # test_dma_direct_non_coherent: pass:5 fail:0 skip:0 total:5 ok 2 test_dma_direct_non_coherent KTAP version 1 # Subtest: test_dma_direct_coherent_atomic ok 1 size=128 ok 2 size=4096 ok 3 size=8192 ok 4 size=12288 ok 5 size=32768 # test_dma_direct_coherent_atomic: pass:5 fail:0 skip:0 total:5 ok 3 test_dma_direct_coherent_atomic KTAP version 1 # Subtest: test_dma_direct_non_coherent_atomic ok 1 size=128 ok 2 size=4096 ok 3 size=8192 ok 4 size=12288 ok 5 size=32768 # test_dma_direct_non_coherent_atomic: pass:5 fail:0 skip:0 total:5 ok 4 test_dma_direct_non_coherent_atomic ok 5 test_dmam_preservation # dma_direct_liveupdate: pass:5 fail:0 skip:0 total:5 # Totals: pass:21 fail:0 skip:0 total:21 ok 1 dma_direct_liveupdate Run on arm64: KTAP version 1 1..1 KTAP version 1 # Subtest: dma_direct_liveupdate # module: direct_test 1..5 KTAP version 1 # Subtest: test_dma_direct_coherent ok 1 size=128 ok 2 size=4096 ok 3 size=8192 ok 4 size=12288 ok 5 size=32768 # test_dma_direct_coherent: pass:5 fail:0 skip:0 total:5 ok 1 test_dma_direct_coherent KTAP version 1 # Subtest: test_dma_direct_non_coherent ok 1 size=128 ok 2 size=4096 ok 3 size=8192 ok 4 size=12288 ok 5 size=32768 # test_dma_direct_non_coherent: pass:5 fail:0 skip:0 total:5 ok 2 test_dma_direct_non_coherent KTAP version 1 # Subtest: test_dma_direct_coherent_atomic ok 1 size=128 ok 2 size=4096 ok 3 size=8192 ok 4 size=12288 ok 5 size=32768 # test_dma_direct_coherent_atomic: pass:5 fail:0 skip:0 total:5 ok 3 test_dma_direct_coherent_atomic KTAP version 1 # Subtest: test_dma_direct_non_coherent_atomic # test_dma_direct_non_coherent_atomic: DMA allocation using pool, expecting -EOPNOTSUPP ok 1 size=128 # test_dma_direct_non_coherent_atomic: DMA allocation using pool, expecting -EOPNOTSUPP ok 2 size=4096 # test_dma_direct_non_coherent_atomic: DMA allocation using pool, expecting -EOPNOTSUPP ok 3 size=8192 # test_dma_direct_non_coherent_atomic: DMA allocation using pool, expecting -EOPNOTSUPP ok 4 size=12288 # test_dma_direct_non_coherent_atomic: DMA allocation using pool, expecting -EOPNOTSUPP ok 5 size=32768 # test_dma_direct_non_coherent_atomic: pass:5 fail:0 skip:0 total:5 ok 4 test_dma_direct_non_coherent_atomic ok 5 test_dmam_preservation # dma_direct_liveupdate: pass:5 fail:0 skip:0 total:5 # Totals: pass:21 fail:0 skip:0 total:21 ok 1 dma_direct_liveupdate Looking forward to your feedback on this. Changelog: rfc v2: - Add dma_is_from_cma() to check if an allocation is from CMA. - Add dma_is_from_dev_coherent() to check if an allocation is from a device coherent region. - Add support for preserving device-managed DMA allocations (dmam_alloc_*). - Add KUnit test suite for dma-direct liveupdate preservation. Samiullah Khawaja (10): dma: Add DMA allocation preservation KHO ABI dma/pool: Add an API to check if DMA allocation is from pool dma: contiguous: Add API to check if an allocation is from CMA dma-coherent: Allow checking if allocation is from dev coherent region dma-direct: Add API to preserve/restore allocations dma-mapping: Add API to preserve/restore DMA allocation dma-mapping: Add support of preserving dmam allocations dma: contiguous: Export is_from_cma helper for kunit dma: pool: Export the is_from_pool helper for kunit dma-direct: Add KUnit test for liveupdate preservation include/linux/dma-direct.h | 29 +++++ include/linux/dma-map-ops.h | 10 ++ include/linux/dma-mapping.h | 100 ++++++++++++++ include/linux/kho/abi/dma_alloc.h | 32 +++++ kernel/dma/Kconfig | 12 ++ kernel/dma/Makefile | 1 + kernel/dma/coherent.c | 11 ++ kernel/dma/contiguous.c | 27 ++++ kernel/dma/direct.c | 189 +++++++++++++++++++++++++++ kernel/dma/direct_test.c | 208 ++++++++++++++++++++++++++++++ kernel/dma/mapping.c | 132 +++++++++++++++++++ kernel/dma/pool.c | 17 +++ 12 files changed, 768 insertions(+) create mode 100644 include/linux/kho/abi/dma_alloc.h create mode 100644 kernel/dma/direct_test.c base-commit: ec4084bc445027a52f600e30a976928be1ba1950 -- 2.55.0.795.g602f6c329a-goog