Цитата(dmitry-tomsk @ Mar 8 2010, 20:02)

А почему Вы выбрали такие огромные буферы для completion (4 кБ)?
Это размер минимального фрагмента физической памяти на который делиться выделяемый блок в USER Memory.
Только в USER Memory мы можем выделить большой блок памяти - например 1536 МБайт; Но он будет разбит на страницы по 4 килобайта.
Я использую ядро PLDA. В нём уже достаточно высокий уровень общения с PCI Express. Есть каналы DMA и обращения к регистрам. Т.е. на уровне TLP я не работаю.
Я формирую запрос к контроллеру DMA ядра PLDA на чтение блока размером 4 килобайта.
Ядро PLDA формирует до 8 запросов на чтение. Вот эти запросы ограничены максимальным PAYLOAD 128 или 256 байт.
И ответы могут придти в любом порядке. А могут и вообще не придти - это и будет Completion Timeout.
Если формировать только один запрос и ждать ответа - это очень медленно. А 8 запросов позволяют получить практически непрерывный поток - но требуется сортировка по адресам.
Ядро PLDA сопровождает ответ адресом - скорее всего это как раз используется lower address в заголовке TLP completion.