具有顺序请求选项的NVME读/写命令

时间:2019-07-08 06:25:34

标签: linux-device-driver fpga xilinx nvme

当NVME控制器将数据发送到FPGA时。 lba顺序不正确。我们很难从nvme源磁盘中以正确的顺序获取lba。

我正在与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)”的问题,对于每个读/写命令,在字13中都带有“顺序请求”位[6]。 我确认我们的NVMe设备(三星970 Pro)支持DSM,但是看起来它对NVMe读取命令中的lba传输顺序没有任何影响。

请帮助我阐明每个NVMe读取命令中的“顺序请求”选项是什么,因为NVMe规范中描述了“命令是顺序读取的一部分” 其中包含多个读取命令”。 是否可以在NVMe读取命令中更改lba传输顺序? 如我们所料(1)从NVMe读取命令(lba很大)按顺序接收lba,这可能吗?我们能为我们的期望做什么?

1 个答案:

答案 0 :(得分:0)

NVMe设备是非常复杂的设备,不应视为原始FLASH存储。如果您请求读取存储在4096 LBA中的2MB数据,则最终可能会读取多个物理芯片。每个芯片可能在内部分为较小的逻辑元素。在这种大而长的READ请求期间,每个完整的设备和每个芯片都可能需要做一些内部维护工作,因此某些LBA的读取速度可能比其他LBA快。这完全取决于供应商。如果必须对整个请求进行序列化,这将导致巨大的延迟和NVMe设备必须“缓冲”所有请求的大量内存。因此,我非常怀疑NVMe规范中是否存在禁止乱序数据传输的问题。此外,在NVMe设备报告整个读取完成之前,您不应在给定的内存范围内假设任何有效数据。如果要序列化LBA读取,则应将长请求分为4096个单独的请求,并可能在每个请求中都设置“顺序请求”位。