我正在开发一个nvme-cli的测试工具(用c编写,可以在linux上运行)。
为了SSD验证目的,我实际上正在寻找一个自定义命令(例如I/O命令,写入然后读取相同的数据,最后比较两个数据是否相同)
在用户空间中,我需要调用至少 2 个
ioclt()
,一个使用写入命令(nvme_cmd_write),另一个使用读取命令(nvme_cmd_read)并比较两个缓冲区内容。
问题实际上是当我想并行发送这个命令时。在块级别(使用
ioclt()
)我们无法将此命令放入不同的 I/O 提交队列中。
我们可以有一个从
ioclt()
发送的自定义命令(nvme_cmd_write_compare),并在驱动程序级别有一个新模块来处理这个新命令。
由于我是这个nvme/ioctl()的新手,如果有任何错误请纠正我。
我想知道我们是否可以实施这个。
NVMe SSD测试工具Penetrate(https://www.cellcomputers.com.tw/penetrate.html)可以轻松做你想做的事。该工具支持用户编写脚本来访问NVMe SSD,包括启动读取和写入命令的功能。以下是执行您想要的操作的过程。
var EC, cntl_handle, sq1_handle, sq2_handle;
var buf_r_d, buf_r_m, buf_w_d, buf_w_m;
cntl_handle = ...
sq1_handle = ...
sq2_handle = ...
/* sq1 and sq2 are set to access the same namespace */
buf_w = ...; nvme::ddbFillPatRand(EC, buf_w);
buf_r = ...; nvme::ddbFillPat8(EC, buf_r, 0);
cmd_w = nvme::ioc::write(EC, sq1_handle, buf_w, lba, len);
do
sts = nvme::pspp(cmd_w);
while (!sts);
cmd_r = nvme::ioc::read(EC, sq2_handle, buf_r, lba, len);
do
sts = nvme::pspp(cmd_r);
while (!sts);
if (nvme::ddbCompareN(EC, buf_r, buf_w, len * lba_size) == 0)
print("Pass");
else
print("Fail");