LINUX.ORG.RU

Что делать, если кажется, что нашёл баг в ядре..

 


4

3

.. ну первая версия понятна, проверить свой код.

Теперь о подозрениях:

http://lxr.free-electrons.com/source/drivers/base/dma-mapping.c#L189

Мне кажется, что должно быть наоборот, т.е. проверка на НЕ 0:

if (rc != 0) ...
Потому как dma_declare_coherent_memory возвращает 0 только в случае ошибки. Пруф:
 87 int dma_declare_coherent_memory(struct device *dev, phys_addr_t phys_addr,
 88                                 dma_addr_t device_addr, size_t size, int flags)
 89 {
 90         struct dma_coherent_mem *mem;
 91         int ret;
 92 
 93         ret = dma_init_coherent_memory(phys_addr, device_addr, size, flags,
 94                                        &mem);
 95         if (ret == 0)
 96                 return 0;
 97 
 98         if (dma_assign_coherent_memory(dev, mem) == 0)
 99                 return ret;
100 
101         dma_release_coherent_memory(mem);
102         return 0;
103 }

...

 20 static int dma_init_coherent_memory(phys_addr_t phys_addr, dma_addr_t device_addr,
 21                              size_t size, int flags,
 22                              struct dma_coherent_mem **mem)
 23 {
...
 34         mem_base = ioremap(phys_addr, size);
 35         if (!mem_base)
 36                 goto out;
 37 
 38         dma_mem = kzalloc(sizeof(struct dma_coherent_mem), GFP_KERNEL);
 39         if (!dma_mem)
 40                 goto out;
 41         dma_mem->bitmap = kzalloc(bitmap_size, GFP_KERNEL);
 42         if (!dma_mem->bitmap)
 43                 goto out;
 44 
...
 54         if (flags & DMA_MEMORY_MAP)
 55                 return DMA_MEMORY_MAP;
 56 
 57         return DMA_MEMORY_IO;
 58 
 59 out:
 60         kfree(dma_mem);
 61         if (mem_base)
 62                 iounmap(mem_base);
 63         return 0;
 64 }

Если это действительно баг, то куда постить? cast tailgunner, post-factum

★★★★★
Ответ на: комментарий от Andrey_Utkin

О точно, тебя ещё забыл кастануть. Спасибо, напишу на maillist.

UVV ★★★★★
() автор топика

Бест прексис написать юнит-тест, который воспроизводит проблему. Уж не знаю есть ли юнит-тесты у ядра.

Hater ★★
()

Да, точно.

	return 0;
}

/*
 * ????????
 */
int dma_declare_coherent_memory(struct device *dev, phys_addr_t phys_addr,
				dma_addr_t device_addr, size_t size, int flags)
{

Интересно, кто принял код тов. Marek Szyprowski из Самсунга без комментариев?.. Похоже что

Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Вот это отсутствие комментария и есть самый главный баг - остальные это производные.

Функция dma_declare_coherent_memory возвращает что-то более информативное, чем просто код errno, который от неё ожидает dmam_declare_coherent_memory. Вообще классно сделать функции с длинным именем, которые тем не менее отличаются одной буквой и то не в начале слога, а в конце, так что легко не заметить.

gag ★★★★★
()
Ответ на: комментарий от gag

Т.е. следующий баг:

        return rc;
Т.к. в нём не errno, а наоборот.

gag ★★★★★
()
Ответ на: комментарий от gag

Спасибо за подтверждение. Короче я причешу и патч зашлю по адресу, указанному выше. Патчи же тоже туда надо слать?

UVV ★★★★★
() автор топика
Ответ на: комментарий от gag

Вообще классно сделать функции с длинным именем, которые тем не менее отличаются одной буквой и то не в начале слога, а в конце, так что легко не заметить.

Не, идея у функции хорошая. Но получает что dma_ и dmam_ возвращают разные значения. У одной 0 - это ошибка, а у другой ошибка это -errno.

UVV ★★★★★
() автор топика
Ответ на: комментарий от gag

Вот это отсутствие комментария и есть самый главный баг - остальные это производные.

https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Document...

Функция dma_declare_coherent_memory возвращает что-то более информативное, чем просто код errno

The return value will be either DMA_MEMORY_MAP or DMA_MEMORY_IO and
must correspond to a passed in flag (i.e. no returning DMA_MEMORY_IO
if only DMA_MEMORY_MAP were passed in) for success or zero for
failure.
anTaRes ★★★★
()
Ответ на: комментарий от UVV

Сначала git blame, чтобы найти коммит, где появился баг.

Потом есть скрипт scripts/get_maintainer.pl, который скажет, куда слать репорт. Например:

$ scripts/get_maintainer.pl -f drivers/base/dma-mapping.c
Greg Kroah-Hartman <gregkh@linuxfoundation.org> (supporter:DRIVER CORE, KOBJECTS, DEBUGFS, KERNFS AND SYSFS)
linux-kernel@vger.kernel.org (open list)

Складываешь вместе все имейлы, которые увидишь в коммите, и те, которые выдаёт скрипт — и у тебя готов To: и CC:.

post-factum ★★★★★
()
Последнее исправление: post-factum (всего исправлений: 1)
Ответ на: комментарий от anTaRes

Это я уже тоже нашёл. Но эта дока должна быть копи-паста из исходников, а не как получилось в данном случае.

gag ★★★★★
()
Ответ на: комментарий от anTaRes

Ну тут вроде бы всё очевидно. Оно добавляет ресурс к устройству, чтобы освободить при выгрузке. Я добавлял dev_dbg в dmam_coherent_decl_release и видел, что оно не вызывалось.

UVV ★★★★★
() автор топика
Ответ на: комментарий от UVV

А почему в ядре баг не заметили, так это потому, что ядро эту функцию и не использует. А как же ты на неё наткнулся? Какая-то периферия?

gag ★★★★★
()
Ответ на: комментарий от gag

Ну я как и все начал использовать dma_alloc_coherent / dma_declare_coherent_memory , а потом заметил, что есть managed версии и решил попробовать их. dmam_alloc_coherent срабатывала номально, а вот эта возвращала странные значение (если быть точным то попеременно, то 0, то 1). Так и наткнулся на баг.

UVV ★★★★★
() автор топика
Ответ на: комментарий от gag

Какая-то периферия?

Да, драйвер пишу =)

UVV ★★★★★
() автор топика
Ответ на: комментарий от UVV

хз, dma_declare_coherent_memory озвращает «что произошло»
0 - нифига, 1 или 2 (DMA_MEMORY_MAP or DMA_MEMORY_IO)

т.е. dmam_declare_coherent_memory соглашается с dma_declare_coherent_memory если что-то произошло и чистит хвосты
или если произошло нифига - пытается рулить самоcтоятельно

вроде все логично

anTaRes ★★★★
()
Ответ на: комментарий от anTaRes

Чтобы было всё логично, надо поменять

if (rc == 0) ...
на
if (rc != 0) ...
Как минимум. Я бы ещё добавил отрицательный код возвращения в случае нуля.

UVV ★★★★★
() автор топика
Ответ на: комментарий от post-factum

Я попробовал из Kate, через Ctrl+c / Ctrl+v - tab'ы сохранились. Это же главное?

Послал Email себе же, табы на месте.

UVV ★★★★★
() автор топика
Последнее исправление: UVV (всего исправлений: 1)
Ответ на: комментарий от Deleted

Ядро пишут корпорации. А вы все лишь мелкий шум на фоне.

Bad_ptr ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.