Пожалуйста, предоставьте максимально подробную информацию; в противном случае недостаток необходимых данных может привести к невозможности локализации дефекта
Информация об окружении
【ОС версия】Linux (none) 6.6.0 #16:[DB SIG] Introduce Bigdata DB solution liked softwares into openEuler SMP Tue Jan 14 10:40:22 CST 2025 aarch64 GNU/Linux
【Конфигурация ядра】Несколько версий, включая linux-master
【Хардварьная платформа】Не относится
【Сетевая конфигурация】Не относится
Информация о дефекте
【Шаги воспроизведения проблемы】
- В функцию
dma_alloc_coherent
передается значение 0 как длина
【Фактический результат】Опишите фактические результаты и последствия
Прогнозируемый результат — возврат NULL
【Желаемый результат】Опишите желаемые результаты и последствия
Происходит Oops, что приводит к аварийному завершению работы ядра
【Другие связанные приложения и данные】# Здесь можно прикрепить дополнительные текстовые данные
[ 2860. 573350][ T400] Невозможно обработать ошибку ядра NULL указателя с отсутствием адресации виртуального адреса 0000000000000010
[ 2860. 573367][ T400] Информация об ошибке памяти:
[ 2860. 573379][ T400] ESR = 0x0000000096000006
[ 2860. 573392][ T400] EC = 0x25: DABT (текущий EL), IL = 32 бита
[ 2860. 573407][ T400] SET = 0, FnV = 0
[ 2860. 573420][ T400] EA = 0, S1PTW = 0
[ 2860. 573434][ T400] FSC = 0x06: уровень 2 ошибки трансляции
[ 2860. 573448][ T400] Информация об ошибке доступа к данным:
[ 2860. 573460][ T400] ISV = 0, ISS = 0x00000006, ISS2 = 0x00000000
[ 2860. 573475][ T400] CM = 0, WnR = 0, TnD = 0, TagAccess = 0
[ 2860. 573491][ T400] GCS = 0, Overlay = 0, DirtyBit = 0, Xs = 0
[ 2860. 573506][ T400] таблица страниц пользователя: 4k страницы, 48-битные VA, pgdp=000008009c237000
[ 2860. 573523][ T400] [0000000000000010] pgd=080008009c250403, p4d=080008009c250403, pud=080008009c22c403, pmd=0000000000000000
[ 2860. 573567][ T400] Внутренняя ошибка: Oops: 0000000096000006 [#1:1] SMP
[ 2860. 573578][ T400] Подключенные модули: ummu_test_dev(OE) hisi_ummu_pmu(OE) ubus(OE) hisi_ummu(OE) hisi_ummu_core(OE) acpi_ub(OE) pv680_mii(OE) [последний отключен: ummu_test_dev(OE)]
[ 2860. 573620][ T400] CPU: 1 PID: 400 Comm: ummu-test Tainted: G OE 6.6.0 #188
[ 2860. 573635][ T400] Наименование оборудования: To be filled by O. E. M. Hi1650FPGA 1P TA/To be filled by O. E. M., BIOS Hi1650FPGA 1P TA 04/25/2024
[ 2860. 573649][ T400] pstate: 81400009 (Nzcv daif +PAN -UAO -TCO +DIT -SSBS BTYPE=--)
[ 2860. 573664][ T400] pc : sg_alloc_append_table_from_pages+0x208/0x430
[ 2860. 573680][ T400] lr : sg_alloc_append_table_from_pages+0x2c8/0x430
[ 2860. 573695][ T400] sp : ffff800081a0b770
[ 2860. 573704][ T400] x29: ffff800081a0b770 x28: 0000000000000001 x27: 0000000000000000
[ 2860. 573724][ T400] x26: 0000000000000000 x25: 0000000000000001 x24: 0000000000000000
[ 2860. 573744][ T400] x23: 0000000000000000 x22: ffff080097664b20 x21: 00000000fffff000
[ 2860.573784][T400] x20: 0000000000000000 x19: 0000000000000010 x18: 0000000000000000
[2860. 573805][T400] x17: 0000000000000000 x16: ffffd7c64b5a7e38 x15: 0000fffff7ccae20
[2860. 573824][T400] x14: 0000000000000000 x13: 0000000000000000 x12: 0000000000000000
[2860. 573845][T400] x11: 0000000000000000 x10: 0000000000000000 x9 : ffffd7c64b83a574
[2860. 573865][T400] x8 : ffff080097664b40 x7 : 0000000000000000 x6 : 000000000000cbe5
[2860. 573885][T400] x5 : ffffd7c64d18a8f0 x4 : 0000000000000000 x3 : 0000000000000001
[2860. 573905][T400] x2 : 0000000000000000 x1 : 0000000000000002 x0 : 0000000000000001
[2860. 573912][T400] Обратный трассировочный вывод:
[2860. 573927][T400] sg_alloc_append_table_from_pages+0x208/0x430
[2860. 573943][T400] sg_alloc_table_from_pages_segment+0x3c/0xa0
[2860. 573960][T400] __iommu_dma_alloc_noncontiguous+0x130/0x278
[2860. 573973][T400] iommu_dma_alloc+0x174/0x228
[2860. 573986][T400] dma_alloc_attrs+0xf4/0x108【Анализированные данные】Если анализ и локализация уже выполнены, пожалуйста, приложите подробные результаты анализа.
По трассе вызова была определена функция __iommu_dma_alloc_noncontiguous
, внутри которой вызывается функция __iommu_dma_alloc_pages
. Размер передается пользователем и может быть равен нулю. При size = 0
параметр count
в __iommu_dma_alloc_pages
также становится равным нулю:

Эта функция использует kvcalloc
для выделения памяти, что является обёрткой для kmalloc
. Когда count
равно нулю, фактический вызов происходит как kmalloc(0, gfp)
, который возвращает ZERO_SIZE_PTR
(это (void*)16
вместо 0
).
Проверка страниц с использованием !pages
проваливается, так как последующее использование этих страниц приводит к попытке разрешения адреса ZERO_SIZE_PTR
, что вызывает ошибку Oops
.