#1
|
|||
|
|||
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
|
|||
|
|||
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
|
|||
|
|||
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
|
|||
|
|||
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
|
|||
|
|||
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 |
#6
|
|||
|
|||
mmap и синхронизация
Denis Sovkov написал(а) к Nil A в Oct 24 11:42:04 по местному времени:
Привет, Nil! 17-10-2024 01:41 Nil A -> Denis Sovkov: NA> Попробуй в mmap задать MAPNORESERVE и MAPPOPULATE. Может сходу NA> поможет. Спасибо за исчерпывающий ответ! Дома буду - обязательно попробую, а то сейчас с работы, через ББУку пишу )) Пока. --- Tornado/DPMI 1.71.1/Release |
#7
|
|||
|
|||
mmap и синхронизация
Denis Sovkov написал(а) к Nil A в Oct 24 22:05:32 по местному времени:
Нello Nil! 17 Oct 24 01:41, you wrote to me: NA> Попробуй в mmap задать MAPNORESERVE и MAPPOPULATE. Может сходу NA> поможет. Попробовал, но получилось только в одну сторону - комп читает устройство, все обновляется, а в обратную сторону - ни-ни. Буду копаться дальше. Denis --- GoldED+/LNX 1.1.5-b20180707 |
#8
|
|||
|
|||
mmap и синхронизация
Nil A написал(а) к Denis Sovkov в Oct 24 22:26:46 по местному времени:
Нello, Denis! 17 Oct 24 22:05, from Denis Sovkov -> Nil A: NA>> Попробуй в mmap задать MAPNORESERVE и MAPPOPULATE. Может сходу NA>> поможет. DS> Попробовал, но получилось только в одну сторону - комп читает DS> устройство, все обновляется, а в обратную сторону - ни-ни. Тогда проще. Dirty pages кто-то должен когда-то сбрасывать "на диск", видимо когда dirty_ratio случится. Ты можешь тупо вызывать msync() каждый раз после записи. Но я тебе чуть больше шагов в предыдущем письме расписал. Там надо аккуратно с кешированием разобраться, с барьерами, DMA. Хотя, если всё вот так вот нахаляву заработает, и более-менее будет работать, то забей :-) Best Regards, Nil --- GoldED+/LNX 1.1.5-b20240306 |
#9
|
|||
|
|||
mmap и синхронизация
Denis Sovkov написал(а) к Nil A в Oct 24 14:13:48 по местному времени:
Привет, Nil! 17-10-2024 22:26 Nil A -> Denis Sovkov: NA> Тогда проще. Dirty pages кто-то должен когда-то сбрасывать "на диск", NA> видимо когда dirty_ratio случится. Ты можешь тупо вызывать msync() Попбовал и msync и fsync. Dirty-ratio ставил в ноль - все вно не помогает. Один раз переписалось из компа в девайс при перезагрузке компа(!). Видимо все-таки что-то не так, нахаляву не получилось (( Видимо, придется разбираться с этим более тонко. Пока. --- Tornado/DPMI 1.71.1/Release |
#10
|
|||
|
|||
mmap и синхронизация
Andrei Mihailov написал(а) к Denis Sovkov в Oct 24 15:10:29 по местному времени:
Нello, Denis Sovkov. On 19.10.2024 14:13 you wrote: NA>> Тогда проще. Dirty pages кто-то должен когда-то сбрасывать "на диск", видимо когда NA>> dirty_ratio случится. Ты можешь тупо вызывать msync() DS> Попбовал и msync и fsync. Dirty-ratio ставил в ноль - все вно не помогает. DS> Один раз переписалось из компа в девайс при перезагрузке компа(!). Видимо все-таки что-то не DS> так, нахаляву не получилось (( Раз нахаляву не получилось, значит оно устроено так, что за это надо кому-то заплатить деньги ;) Под бесплатным линуксом это, конечно, выглядет странно, но бывает... -- С наилучшими пожеланиями! Опубликовано ХотДогом с планеты Ведроид --- ХотДог/2.14.5/Android |