RFC-0014:放宽 zx_fifo_create 约束 | |
---|---|
状态 | 已接受 |
领域 |
|
说明 | 允许“zx_fifo_create”调用的元素数量不是 2 的幂。 |
问题 | |
Gerrit 更改 | |
作者 | |
审核人 | |
提交日期(年-月-日) | 2020-12-02 |
审核日期(年-月-日) | 2020-12-09 |
总结
zx_fifo_create
目前要求调用方传递一个为 2 的次方的元素数。这样,内核就可以使用位掩码(而不是模数运算符)来确定缓冲区中封装记录的偏移量,从而对读取和写入路径进行小幅优化。
这一限制意味着,如果用户的元素大小恰好不是 4096/(2**n)
字节,则用户将无法有效利用 FIFO 其最大容量;在这种情况下,FIFO 容量 (element_size * element_count
) 将小于 FIFO(在内部使用 4096
字节缓冲区)的最大容量。
此方案允许创建具有任意元素计数(最高 FIFO 大小限制)的 FIFO,以便满 FIFO 容量可用于任意大小的 FIFO 记录。
设计初衷
该方案的动机是希望在块堆栈中使用的现有 FIFO 记录中添加字段;相关字段是轨迹标识符,将用于支持块 IO 的跨进程跟踪。添加此字段会将 FIFO 记录的大小从 32
字节更改为 40
字节。
如果 FIFO 记录的长度为 40
字节,则 element_count
当前可设置的最大值为 64
,这会导致 4096
字节缓冲区使用 40 * 64 = 2560
字节。
此 RFC 允许 element_count
值为 102
,这会导致使用 40 * 102 = 4080
个字节(几乎是 FIFO 的可用容量的两倍)。
设计
这是一项细微的更改,在 https://fuchsia-review.googlesource.com/c/fuchsia/+/409498 中实现。
实现
这是一项细微的更改,在 https://fuchsia-review.googlesource.com/c/fuchsia/+/409498 中实现。
性能
内核现在可以进行小幅的性能优化,因为它知道元素计数是 2 的幂;特别是,内核可以使用按位 AND (而不是模数)来确定元素在内部缓冲区中的位置。
也就是说,考虑到在内核和用户空间之间来回切换的开销,这种性能优化会造成性能优化。
具体而言:https://fuchsia-review.googlesource.com/c/fuchsia/+/409498 中的性能测试表明,取消这项优化不会产生任何可衡量的性能成本。
安全注意事项
无。
隐私注意事项
无。
测试
这是一项细微的更改,在 https://fuchsia-review.googlesource.com/c/fuchsia/+/409498 中添加测试。
文档
系统会根据新放宽的约束条件在 https://fuchsia-review.googlesource.com/c/fuchsia/+/409498 中调整了 zx_fifo_create
文档。
缺点、替代方案和未知情况
无。
早期技术和参考资料
无。