forum.wfido.ru  

Вернуться   forum.wfido.ru > Прочие эхи > RU.LINUX

Ответ
 
Опции темы Опции просмотра
  #1  
Старый Вчера, 03:11
Denis Sovkov
Guest
 
Сообщений: n/a
По умолчанию mmap и синхронизация

Denis Sovkov написал(а) к All в Oct 24 01:46:54 по местному времени:


Нello everybody!

Входные данные такие: имеем устройство с PCI Express на плисине XC6SLX35T, драйвер для этого устройства в видео модуля ядра и программу, которая читает и пишет память ПЛИС отмапленную mmap'ом. В ПЛИС крутится процессорное ядро, которое выполняет основные функции устройства. И, по замыслу, мапится часть адресного пространства ПЛИСины на память user-space приложения, которое с этим устройством работает. Проблема следующая: при записи с компа в устройство и из устройства в комп не всегда данные попадают из источника в приемник. А иногда вообще и устройство и комп "гоняют на своей волне", т.е. память не синхронизируется вообще. Подозреваю, что дело во флагах MAP_SНARED и ему подобных, но пока не удалось подобрать "правильную" комбинацию. Ман читал, но "по диагонали" - нет совершенно времени. ЧЯДНТ? Надеюсь на помощь зала =)

Denis


--- GoldED+/LNX 1.1.5-b20180707
Ответить с цитированием
  #2  
Старый Вчера, 23:52
Nil A
Guest
 
Сообщений: n/a
По умолчанию mmap и синхронизация

Nil A написал(а) к Denis Sovkov в Oct 24 22:40:46 по местному времени:

Нello, Denis!

16 Oct 24 01:46, from Denis Sovkov -> All:

DS> Входные данные такие: имеем устройство с PCI Express на плисине
DS> XC6SLX35T, драйвер для этого устройства в видео модуля ядра и
DS> программу, которая читает и пишет память ПЛИС отмапленную mmap'ом. В
DS> ПЛИС крутится процессорное ядро, которое выполняет основные функции
DS> устройства. И, по замыслу, мапится часть адресного пространства
DS> ПЛИСины на память user-space приложения, которое с этим устройством
DS> работает. Проблема следующая: при записи с компа в устройство и из
DS> устройства в комп не всегда данные попадают из источника в приемник. А
DS> иногда вообще и устройство и комп "гоняют на своей волне", т.е. память
DS> не синхронизируется вообще. Подозреваю, что дело во флагах MAP_SНARED
DS> и ему подобных, но пока не удалось подобрать "правильную" комбинацию.

Мало входных данных. Что-то работало и потом поломалось? Драйвер самописный или шёл с неким устройством? Одного просто mmap не достаточно. Нужен какой-то механизм синхронизации. А как вообще DMA запрограммирован?

Best Regards, Nil
--- GoldED+/LNX 1.1.5-b20240306
Ответить с цитированием
  #3  
Старый Сегодня, 00:41
Denis Sovkov
Guest
 
Сообщений: n/a
По умолчанию mmap и синхронизация

Denis Sovkov написал(а) к Nil A в Oct 24 23:24:04 по местному времени:


Нello Nil!

16 Oct 24 22:40, you wrote to me:

NA> Мало входных данных. Что-то работало и потом поломалось? Драйвер
NA> самописный или шёл с неким устройством? Одного просто mmap не
NA> достаточно. Нужен какой-то механизм синхронизации. А как вообще DMA
NA> запрограммирован?


Драйвер самописный, по образцу с Хабра - по сути просто сообщает системе, что есть такое-то устройство и разрешает (enable) его работу. Затем в /sys/bus/pci появляется сам девайс и с ним можно работать. DMA стандартный, Xilinx'овский. Просто прокидывание адресного пространства и все. Вот, собственно, вопрос с этой синхронизацией и связан. Что-то я не догуглил, что то я не дочитал видимо...

Denis


--- GoldED+/LNX 1.1.5-b20180707
Ответить с цитированием
  #4  
Старый Сегодня, 00:41
Denis Sovkov
Guest
 
Сообщений: n/a
По умолчанию mmap и синхронизация

Denis Sovkov написал(а) к Nil A в Oct 24 23:27:22 по местному времени:


Нello Nil!

16 Oct 24 22:40, you wrote to me:

NA> Мало входных данных. Что-то работало и потом поломалось? Драйвер

В том то и дело, оно то работает, то не работает, видимо где-то надо пнуть ядро, чтоб синхронизировать память...

Denis


--- GoldED+/LNX 1.1.5-b20180707
Ответить с цитированием
  #5  
Старый Сегодня, 03:01
Nil A
Guest
 
Сообщений: n/a
По умолчанию mmap и синхронизация

Nil A написал(а) к Denis Sovkov в Oct 24 01:41:26 по местному времени:

Нello, Denis!

16 Oct 24 23:27, from Denis Sovkov -> Nil A:

NA>> Мало входных данных. Что-то работало и потом поломалось? Драйвер
DS> В том то и дело, оно то работает, то не работает, видимо где-то надо
DS> пнуть ядро, чтоб синхронизировать память...

Попробуй в mmap задать MAPNORESERVE и MAPPOPULATE. Может сходу поможет.

Но ваще проблема в том, что оно же кешируется, mmap мапит на page cache.
Может быть натыкать pgprotnoncached() или pgprot_writecombine(). В mmap vm_pageprot надо подкрутить
vma->vmpage_prot = pgprot_noncached(vma->vm_pageprot);

Потом надо бы в драйвере барьеров натыкать wmb() на запись, или полный mb();

С DMA тоже может быть не всё хорошо. Память надо аллоцировать с помощью dmaalloc_coherent(), или юзать dma_map*() функции, чтобы кешь когерентным был.

Кстати, ещё из юзерспейса же можно msync() дёргать, чтобы кешь сбросить.

Best Regards, Nil
--- GoldED+/LNX 1.1.5-b20240306
Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 03:36. Часовой пояс GMT +4.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, vBulletin Solutions, Inc. Перевод: zCarot