RFC-0014:放宽 zx_fifo_create 约束条件

RFC-0014:放宽 zx_fifo_create 约束
状态已接受
领域
  • 内核
说明

允许“zx_fifo_create”调用的元素数量不是 2 的幂。

问题
  • 65697
Gerrit 更改
  • 457334
作者
审核人
提交日期(年-月-日)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 文档。

缺点、替代方案和未知情况

无。

早期技术和参考资料

无。