1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/openeuler-community

 / Детали:

Запрос dma_alloc_coherent на выделение 0-размерной области памяти дляDMA вызывает ошибку Oops.

Предстоит сделать
Владелец
Создано  
14.03.2025

Пожалуйста, предоставьте максимально подробную информацию; в противном случае недостаток необходимых данных может привести к невозможности локализации дефекта

Информация об окружении

【ОС версия】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
【Хардварьная платформа】Не относится
【Сетевая конфигурация】Не относится

Информация о дефекте

【Шаги воспроизведения проблемы】

  1. В функцию 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 также становится равным нулю:

__iommu_dma_alloc_noncontiguous

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

Проверка страниц с использованием !pages проваливается, так как последующее использование этих страниц приводит к попытке разрешения адреса ZERO_SIZE_PTR, что вызывает ошибку Oops.

Комментарий (0)

GitLife Service Account Задача создана
GitLife Service Account добавлено
 
sig/TC
label.
Развернуть журнал операций

Вход Перед тем как оставить комментарий

Статус
Ответственный
Контрольная точка
Pull Requests
Связанные запросы на слияние могут быть закрыты после их объединения
Ветки
Дата начала   -   Крайний срок
-
Закрепить/Открепить
Приоритет
Участники(1)
1
https://api.gitlife.ru/oschina-mirror/openeuler-community.git
git@api.gitlife.ru:oschina-mirror/openeuler-community.git
oschina-mirror
openeuler-community
openeuler-community