[RFC PATCH v2 00/10] dma-mapping: Add preservation of direct allocations
Samiullah Khawaja
skhawaja at google.com
Wed Jul 8 16:48:44 PDT 2026
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/aepfYzkI7NsVGCF0@google.com/
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/20260703020832.1731864-1-praan@google.com/
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/20260521193202.746810-1-skhawaja@google.com/
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
More information about the kexec
mailing list