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

OSCHINA-MIRROR/openeuler-community

 / Детали:

Linux ядро паникует при запросеDMA с нулевой длиной

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

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

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

OS версия 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] Невозможно обработать ошибку ядра с нулевым указателем виртуального адреса 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] таблица pgtable пользователя: страницы размером 4КБ, 48-битные ВА, pgdp=000008009c237000
[2860.573523][T400] [0000000000000010] pgd=080008009c250403, p4d=080008009c250403, pud=080008009c22c403, pmd=0000000000000000
[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.573764][T400] x20: 0000000000000000 x19: 0000000000000010 x18: 0000000000000000
[2860.573784][T400] x17: 0000000000000000 x16: ffffd7c64b5a7e38 x15: 0000fffff7ccae20
[2860.573805][T400] x14: 0000000000000000 x13: 0000000000000000 x12: 0000000000000000
[2860.573824][T400] x11: 0000000000000000 x10: 0000000000000000 x9 : ffffd7c64b83a574
[2860.573845][T400] x8 : ffff080097664b40 x7 : 0000000000000000 x6 : 000000000000cbe5
[2860.573866][T400] x5 : 0000000000000000 x4 : 0000000000000000 x3 : 0000000000000000
[2860.573886][T400] x2 : 0000000000000000 x1 : 0000000000000000 x0 : 0000000000000000573865][ T400] x5 : ffffd7c64d18a8f0 x4 : 0000000000000000 x3 : 0000000000000001
[ 2860. 573885][ T400] x2 : 0000000000000000 x1 : 0000000000000002 x0 : 0000000000000001
[ 2860. 573905][ T400] Отладочный трассировщик вызовов:
[ 2860. 573912][ T400] sg_alloc_append_table_from_pages+0x208/0x430
[ 2860. 573927][ T400] sg_alloc_table_from_pages_segment+0x3c/0xa0
[ 2860. 573943][ T400] __iommu_dma_alloc_noncontiguous.constprop.0+0x130/0x278
[ 2860. 573960][ T400] iommu_dma_alloc+0x174/0x228
[ 2860. 573973][ T400] dma_alloc_attrs+0xf4/0x108
[ Анализ завершен ] Если анализ и локализация уже выполнены, пожалуйста, приложите подробные результаты анализа.По трассе вызовов удалось локализовать функцию __iommu_dma_alloc_noncontiguous, внутри которой происходит вызов функции __iommu_dma_alloc_pages. Длина передается от пользователя и может быть равной нулю; когда размер равен нулю, параметр count в функции __iommu_dma_alloc_pages также становится равным нулю:

__iommu_dma_alloc_noncontiguous

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

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

![__iommu_dma_alloc_noncontiguous](https://foruda.gitee.com/images/1736846478991099761/f17536dd_9467083.png "Screen capture")

Комментарий (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