RFC-0014:放宽 zx_fifo_create 约束条件

RFC-0014:放宽了 zx_fifo_create 限制
状态已接受
区域
  • 内核
说明

允许使用元素数量不是 2 的幂的 `zx_fifo_create` 调用。

问题
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 的幂,因此目前可以进行小幅性能优化;具体而言,内核可以使用按位与运算来确定元素在内部缓冲区中的位置,而不是使用取模运算。

不过,考虑到在内核和用户空间之间来回跳转的开销,这种性能优化效果会被抵消。

具体而言,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 文档。

缺点、替代方案和未知因素

无。

在先技术和参考资料

无。