Команда чтения / записи NVME с опцией последовательного запроса - PullRequest
1 голос
/ 08 июля 2019

Когда контроллер NVME отправляет данные в FPGA.Иба не в порядке.у нас возникли проблемы с получением lba в правильном порядке с исходного диска nvme.

Я работаю с NVMe над проектом с использованием Samsung SSD 970 PRO 512GB.В нашем проекте мы используем FPGA для связи с устройствами NVMe, но у нас возникли проблемы с нашим процессом, как показано ниже:

1. FPGA having FIFO buffer mapped with DMAP2P works as destination/from address for NVMe controller to read/write.
2. NVMe driver sends command to NVMe controller, requests a read command with transfer size 4096 lba (2MB).
3. When controller sends data into FPGA. lba is not in order. we got trouble about getting lba with correct order from nvme source disk. (1)

Я исследовал «Управление наборами данных (DSM)» с битом «Последовательный запрос» [6] внутри dword 13 для каждой команды чтения / записи.Я подтвердил, что DSM поддерживается в нашем устройстве NVMe (Samsung 970 Pro), но похоже, что он не влияет на порядок передачи lba в команде чтения NVMe.

Пожалуйста, помогите мне уточнить, что такое «Последовательный»Параметр «Запросить» внутри каждой команды чтения NVMe, как описано в спецификации NVMe, «команда является частью последовательного чтения, включающего несколько команд чтения».Может ли он изменить порядок передачи lba в команде чтения NVMe?Как мы ожидаем (1) получить lba по порядку от команды чтения NVMe (с большим lba), возможно ли это?Что мы можем сделать для нашего ожидания?

1 Ответ

0 голосов
/ 09 июля 2019

Устройства NVMe являются довольно сложными устройствами и не должны рассматриваться как необработанные флэш-накопители.Если вы запросите чтение 2 МБ данных, которые хранятся в 4096 LBA, вы можете прочитать несколько физических чипов.Каждый чип может быть разделен внутри на более мелкие логические элементы.Каждое целое устройство и каждый отдельный чип могут выполнять некоторые домашние операции во время этого большого и длинного READ-запроса, поэтому некоторые LBA могут читаться быстрее, чем другие.Это полностью зависит от поставщика.Если весь запрос должен быть сериализован, это приведет к огромным задержкам и огромному объему памяти, которое устройство NVMe должно будет «буферизовать» для всех запросов.Поэтому я глубоко сомневаюсь, что в спецификации NVMe есть что-то, что запрещает передачу данных не по порядку.Более того, пока устройство NVMe не сообщит, что все чтение завершено, вы не должны принимать какие-либо действительные данные в заданном диапазоне памяти.Если вы хотите сериализовать чтения LBA, вы должны разделить свой длинный запрос на 4096 отдельных запросов и, возможно, также установить бит «Последовательный запрос» в каждом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...