| 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 文档。
缺点、替代方案和未知因素
无。
在先技术和参考资料
无。