NVMe设备命令大小限制
来源:互联网 发布:js设置button颜色 编辑:程序博客网 时间:2024/05/16 02:50
NVMe设备命令大小限制
1 定义
单个NVMe命令是有一定大小限制的,host如果提交一个超过限制大小的命令,将会终止执行并得到一个值为0x02的状态码,代表Invalid Field in Command。
NVMe设备单个命令大小由Maximum Data Transfer Size (MDTS)限制,这个数字可以通过identify命令获取。
MDTS的单位是Minimum Memory Page Size(CAP.MPSMIN),它的定义是NVMe controller可以支持的host的最小内存页大小。每一个NVMe设备至少要支持4K的host页大小,因此从PCI Register中获得的MPSMIN的值定义为log后减12的结果。亦即:
MDTS的值也是log后的结果,因此实际的MDTS以字节为单位:
可以发现在NVMe设备初始化函数 nvme_dev_add 中有这样的表述:
int shift = NVME_CAP_MPSMIN(readq(&dev->bar->cap)) + 12;if (ctrl->mdts) dev->max_hw_sectors = 1 << (ctrl->mdts + shift - 9);
显然,这段语句具体阐释了这一运算过程。注意到,在算sector数的时候有一个减去9的操作,这是因为每个sector默认大小为512B。
2 应用
nvme-scsi.c 用于将一个标准scsi命令转化为NVMe命令。它的 nvme_trans_do_nvme_io 函数负责read/write命令的转换。考虑到一个scsi读写命令使用的缓冲区可能会发送超过上述大小,这个函数需要将之分割成小块并分别填充成单独的NVMe命令:
u32 max_blocks = queue_max_hw_sectors(ns->queue);u32 num_cmds = nvme_trans_io_get_num_cmds(hdr, cdb_info, max_blocks);for (i = 0; i < num_cmds; i++) { ...}
显然ns->queue
中存了一些有意思的值。这些值是哪里来的呢?可以看到,在添加NVMe设备过程中调用的用于对namespace进行初始化的函数 nvme_alloc_ns 中有如下语句:
blk_queue_max_hw_sectors(ns->queue, dev->max_hw_sectors);
显然就是来自上面那次对dev->max_hw_sectors
的赋值了。
- NVMe设备命令大小限制
- 给NVMe设备发送一个SCSI READ_10命令
- NVMe之命令
- udevadm 查询NVMe 设备信息
- NVMe驱动解析-注册设备
- NVMe admin队列命令处理
- NVMe
- 设备大小
- 限制附件大小(lotus)
- 限制窗口最小大小
- 限制窗口大小
- FileUpload上传大小限制
- 限制窗体大小
- IIS上传大小限制
- 限制图片显示大小
- 限制上传大小的
- ISS 上传大小限制
- 文件上载大小限制
- 黑马程序员——java基础知识之泛型、集合(Map、工具类等)
- Autoencoder
- UVA - 514 Rails 经典栈使用
- poj1861Network(最小生成树-克鲁斯卡尔算法)
- 用户态内核态通信 (一)
- NVMe设备命令大小限制
- 简单的传球游戏(矩阵)
- 对于校庆网站开发及上线的思考
- 动手实现 数据结构 之 “十字链表”
- MongoDB HTTP Interfaces
- ubuntu下搭建tftp服务器
- jkgjgkgj后方可看见个更健康急功近利
- 设计模式(1)——抽象工厂模式
- Github连击200天(1)——ShowCase