Отрицательный счетчик ссылок после запуска cudaHostRegister-cudaHostUnregister в зоне DMA с использованием mmap (результC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Отрицательный счетчик ссылок после запуска cudaHostRegister-cudaHostUnregister в зоне DMA с использованием mmap (результ

Сообщение Anonymous »

Введение [*]У меня есть собственный драйвер (/dev/DRIVER), использующий DMA. Разработчик драйвера предоставляет несколько тестов, и все выглядит круто. Вы можете создать файловый дескриптор (fd) и отобразить зону с помощью флагов MAP_SHARED и ONLY_READ. Проблема возникает, когда вы добавляете в уравнение CUDA. После выполнения этого примера кода я получаю множество сообщений об ошибках, связанных с плохими страницами и утечкой памяти (2348810240, то же самое, что было отображено).
int main() { std::string filename = "/dev/DRIVER"; size_t file_size = 2348810240; //много места int fd = open(filename.c_str(), O_RDONLY); char* mmap_pointer = (char*)(mmap(nullptr, file_size, PROT_READ, MAP_PRIVATE, fd, 0)); cudaError_t RegisterStatus = cudaHostRegister(mmap_pointer,file_size,cudaHostRegisterPortable | cudaHostRegisterReadOnly); cudaError_t unregisterStatus = cudaHostUnregister(mmap_pointer); munmap(pointer_to_mmap_zone, file_size); закрыть (ФД); вернуть 0; } 1 ноября 16:54:18 ядро ​​asm-m1: трассировка вызовов: 1 ноября 16:54:18 ядро ​​asm-m1: dump_stack+0x5c/0x80 1 ноября 16:54:18 ядро ​​asm-m1: bad_page.cold.111+0x9b/0xa0 1 ноября 16:54:18 ядро ​​asm-m1: __free_pages_ok+0x376/0x3e0 1 ноября 16:54:18 ядро ​​asm-m1: __free_pages+0x33/0x70 1 ноября 16:54:18 ядро ​​asm-m1: vDrxpReleaseGrpBuf+0xa2/0xd0 [drxpd] 1 ноября 16:54:18 ядро ​​asm-m1: iDrxpRls+0x113/0x230 [drxpd] 1 ноября 16:54:18 ядро ​​asm-m1: __fput+0xbe/0x250 1 ноября 16:54:18 ядро ​​asm-m1: Task_work_run+0x8a/0xb0 1 ноября 16:54:18 ядро ​​asm-m1: exit_to_usermode_loop+0xeb/0xf0 1 ноября 16:54:18 ядро ​​asm-m1: do_syscall_64+0x198/0x1a0 1 ноября 16:54:18 ядро ​​asm-m1: запись_SYSCALL_64_after_hwframe+0x65/0xca 1 ноября 16:54:18 ядро ​​asm-m1: RIP: 0033:0x7f879571ba77 1 ноября 16:54:18 ядро ​​asm-m1: Код: 12 b8 03 00 00 00 0f 05 48 3d 00 f0 ff ff 77 3b c3 66 90 53 89 fb 48 83 ec 10 e8 e4 fb ff ff 89 df 89 c2 b8 03 00 00 00 0f 05 3d 00 f0 ff ff 77 2b 89 d7 89 44 24 0c e8 26 fc ff ff 8b 44 24 1 ноября 16:54:18 ядро ​​asm-m1: RSP: 002b: 00007ffe002ec960 EFLAGS: 00000293 ORIG_RAX: 0000000000000003 1 ноября 16:54:18 ядро ​​asm-m1: RAX: 0000000000000000 RBX: 0000000000000003 RCX: 00007f879571ba77 1 ноября 16:54:18 ядро ​​asm-m1: RDX: 0000000000000000 RSI: 00007f8794bd3870 RDI: 0000000000000003 1 ноября 16:54:18 ядро ​​asm-m1: RBP: 00007ffe002eca00 R08: 00007f8794bd3870 R09: 00007f8795d47000 1 ноября 16:54:18 ядро ​​asm-m1: R10: 0000000000000009 R11: 0000000000000293 R12: 0000000000403c90 1 ноября 16:54:18 ядро ​​asm-m1: R13: 00007ffe002ecae0 R14: 0000000000000000 R15: 0000000000000000 1 ноября 16:54:18 ядро ​​asm-m1: ОШИБКА: Плохое состояние страницы в процессе step_by_step_le pfn:5f3e63 1 ноября 16:54:18 ядро ​​asm-m1: страница: ffffed46d7cf98c0 refcount: -1023 Mapcount: 0 отображение: 00000000c1ecc37c индекс: 0x0 1 ноября 16:54:18 ядро ​​asm-m1: флаги: 0x17ffffc0000010 (грязный) 1 ноября 16:54:18 ядро ​​asm-m1: raw: 0017ffffc0000010 0000000000000000 ffffed46d7cf98c8 0000000000000000 1 ноября 16:54:18 ядро ​​asm-m1: raw: 0000000000000000 0000000000000000 fffffc01ffffffff 0000000000000000 1 ноября 16:54:18 ядро ​​asm-m1: страница сброшена, потому что: ненулевой _refcount Интересно, что если я отключу cudaHostUnregister(), счетчик ссылок в трассировке будет равен 1, как и ожидалось, потому что cuda никогда не опубликует свою ссылку на страницы

1 ноября 16:59:11 ядро ​​asm-m1: трассировка вызовов: 1 ноября 16:59:11 ядро ​​asm-m1: dump_stack+0x5c/0x80 1 ноября 16:59:11 ядро ​​asm-m1: bad_page.cold.111+0x9b/0xa0 1 ноября 16:59:11 ядро ​​asm-m1: __free_pages_ok+0x376/0x3e0 1 ноября 16:59:11 ядро ​​asm-m1: __free_pages+0x33/0x70 1 ноября 16:59:11 ядро ​​asm-m1: vDrxpReleaseGrpBuf+0xa2/0xd0 [drxpd] 1 ноября 16:59:11 ядро ​​asm-m1: iDrxpRls+0x113/0x230 [drxpd] 1 ноября 16:59:11 ядро ​​asm-m1: __fput+0xbe/0x250 1 ноября 16:59:11 ядро ​​asm-m1: Task_work_run+0x8a/0xb0 1 ноября 16:59:11 ядро ​​asm-m1: do_exit+0x393/0xb00 1 ноября 16:59:11 ядро ​​asm-m1: do_group_exit+0x3a/0xa0 1 ноября 16:59:11 ядро ​​asm-m1: __x64_sys_exit_group+0x14/0x20 1 ноября 16:59:11 ядро ​​asm-m1: do_syscall_64+0x5b/0x1a0 1 ноября 16:59:11 ядро ​​asm-m1: запись_SYSCALL_64_after_hwframe+0x65/0xca 1 ноября 16:59:11 ядро ​​asm-m1: RIP: 0033:0x7f0dfcc33026 1 ноября 16:59:11 ядро ​​asm-m1: Код: невозможно получить доступ к байтам кода операции в RIP 0x7f0dfcc32ffc. 1 ноября 16:59:11 ядро ​​asm-m1: RSP: 002b: 00007ffcb2771718 EFLAGS: 00000246 ORIG_RAX: 00000000000000e7 1 ноября 16:59:11 ядро ​​asm-m1: RAX: ffffffffffffffda RBX: 00007f0dfcf25880 RCX: 00007f0dfcc33026 1 ноября 16:59:11 ядро ​​asm-m1: RDX: 0000000000000000 RSI: 000000000000003c RDI: 0000000000000000 1 ноября 16:59:11 ядро ​​asm-m1: RBP: 0000000000000000 R08: 00000000000000e7 R09: ffffffffffffef60 1 ноября 16:59:11 ядро ​​asm-m1: R10: 0000000000000000 R11: 0000000000000246 R12: 00007f0dfcf25880 1 ноября 16:59:11 ядро ​​asm-m1: R13: 0000000000000014 R14: 00007f0dfcf2e388 R15: 0000000000000000 1 ноября 16:59:11 ядро ​​asm-m1: ОШИБКА: плохое состояние страницы в процессе Memory_leak_sim pfn:bf7e3c 1 ноября 16:59:11 ядро ​​asm-m1: страница: ffffed46efdf8f00 refcount: 1 Mapcount: 0 отображение: 00000000c1ecc37c индекс: 0x0 1 ноября 16:59:11 ядро ​​asm-m1: флаги: 0x17ffffc0000000() 1 ноября 16:59:11 ядро ​​asm-m1: raw: 0017ffffc0000000 ffffed46efdf8f08 ffffed46efdf8f08 0000000000000000 1 ноября 16:59:11 ядро ​​asm-m1: raw: 0000000000000000 0000000000000000 00000001ffffffff 0000000000000000 1 ноября 16:59:11 ядро ​​asm-m1: страница сброшена, потому что: ненулевой _refcount Запросы [*]Это проблема непосредственно в драйвере? Почему все работает отлично, когда cudaHostUnregister() не вызывается?
[*]
Как это отследить? Также, если кто-то может помочь мне узнать, как отслеживать значение каждого счетчика ссылок и какая функция изменяет значение на отрицательное. Спасибо, с:
[*]
Способы отслеживания переменной refcount в пространстве ядра. Какие функции могут быть задействованы
[*]
Объяснение того, как recount_t может получить отрицательное число? что вообще значит?
[*]
Это проблема драйвера, cuda или реализации?
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»