3 Star 4 Fork 0

openEuler2020 / 14-NBJL挤牙膏大师

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MulanPSL-2.0

StratoVirt的virtio-block设备后端支持配置io_uring

答辩相关

答辩Slices位于根目录的

openEuler Competition Slice - zhaos -v2.pdf
openEuler Competition Slice - zhaos -v2.pptx

介绍

基于stratovirt的后端虚拟块设备,实现对异步读写组件iouring的支持。

  1. 基于crate libc,封装425-427号系统调用与相关iouring的数据结构、宏定义与枚举类型。

  2. 实现异步上下文结构体UringContext(util/src/aio/uring.rs), 其成员函数分别实现setup(), enter()和register()功能,具体来说:

    • 构造函数new():调用sys_io_uring_setup()初始化iouring,注册eventfd,并完成sq,cq,sqe三段内存的映射,构造异步上下文UringContext。
    • 请求提交submit(): 接收Iocb相关参数(file_fd, iovec, offset等),构造并向sqe尾部(tail)添加请求,调用sys_io_uring_enter()提交。
    • 获取结果get_buffs(): 由handle调用,从cq_head开始读取cqes的返回数据(user_data, res),打包成EventResult结构返回。
  3. 按需修改部分mod.rs和block.rs文件中代码逻辑。

  4. sample_program内为示例代码的实现,测试上下文结构为SampleContext(util/src/aio/uring.rs)。

项目目录树

util/src
├── aio
│   ├── mod.rs
│   └── uring.rs
device_model/src
├── virtio
│   └── block.rs
sample_program/src
├── main.rs
├── testFile.txt

执行原理

io-uring for stratovirt执行原理

说明

代码基于kernel 5.3,rust-libc 0.2.71版本撰写。虚拟机编译与运行方式同原生系统,详见stratovirt

./startup.sh为启动脚本(需要更改个别参数路径)。

# Make sure api-channel can be created.
rm -f /tmp/stratovirt.socket

# Start StratoVirt
./target/release/stratovirt \
-kernel /home/zs/kernel/vmlinux.bin \
-append console=ttyS0 pci=off reboot=k panic=1 root=/dev/vda \
-drive file=/home/zs/rootfs.ext4,id=rootfs,readonly=off,direct=on \
-api-channel unix:/tmp/stratovirt.socket -serial stdio \
-disable-seccomp

可用性测试

  1. 示例代码(stratovirt/sample_program):示例代码使用iouring读取一个小于512字节的文件(测试文件位于stratovirt/sample_program/src/testFile.txt)。您可以通过修改testFile.txt文件来输入测试数据。
[zs@localhost sample_program]$ cargo build & cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.00s
     Running `target/debug/sample_program_Q14`
[Sample Result]: 2020 openEuler Contest - Q14
  1. 与stratovirt整合测试:根据输出信息来看,uringcontext建立,数据submit,eventfd事件响应并读取数据的流程正确。
[UringContext submit] 
urcb.aio_fildes : 36
urcb.opcode : 1
urcb.aio_buf : 94519392787568
[UringContext submit over]

[Uring Handle]
e.res : 1024
e.data : 94519392789008
(*aiocb).file_fd : 36
complete_cb desc_index: 0
complete_cb rw_len: 1024
[Uring Handle over]

上述打印信息中submit的请求数据来源于Aiocb,在rw_aio及process_list流程中被构造为urcbs,其中data域被置为CbNode类型,这是为了迎合handle流程时数据的提取。

事件响应时输出的e.res和e.data实为此时cqes头部元素的res和user_data。接着调用在build_aio中注册的回掉函数complete_func,desc_index和rw_len为接下来add_used所需参数。

  1. 性能测试

当前项目还未整合iouring的部分性能优化feature,详细的性能测试有待进一步更新。

to be continue..

作者简历

TOPIC_ID:14, TEAM_ID:1996338335, TEAM_NAME:NBJL挤牙膏大师.

队长&成员:赵盛,南开大学-计算机学院。

nbjl lab

空文件

简介

TOPIC_ID:14, TEAM_ID:1996338335, TEAM_NAME:NBJL挤牙膏大师. 展开 收起
Rust 等 2 种语言
MulanPSL-2.0
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
1
https://gitee.com/openeuler2020/team-1996338335.git
git@gitee.com:openeuler2020/team-1996338335.git
openeuler2020
team-1996338335
14-NBJL挤牙膏大师
master

搜索帮助