virtio-blk后端处理-请求接收、解析、提交

在“virtio-blk后端处理”这一系列中将分析Qemu对guest中发送过来的请求是如何进行处理的。大致想了下。这个系列分成如下几个部分:
- Qemu接收、解析、提交请求
- 执行请求
- 请求完成
- dataplane情况下的处理

这个文件是这系列的第一部分,主要分析Qemu收到请求到将其派发到线程的过程。这是不考虑dataplane的情况
现在Qemu对virtio请求的接收都是通过ioeventfd来触发的(详见《kvm ioevent创建触发调用关系》),下图是Qemu上接收到virtio-blk的eventfd后的calltrace:
这里写图片描述
可以看到Qemu后端对virtio-blk的请求处理入口是virito_blk_handle_output函数,下面的分析也是从这个函数开始的。

virtio_blk_handle_output函数

这个函数中进行对请求的处理
主要流程
1.如果使用了dataplane,那么就调用virtio_blk_data_start函数来处理,并返回(采用dataplane的情况放在后面分析
2.在while循环中首先通过virtio_blk_get_request函数来取得请求,然后调用virtio_blk_handle_request函数来处理请求,这个函数中根据不同的情况会对作出不同的处理,具体后面分析
3.某些情况下(可能是多数?)上面virtio_blk_handle_request函数不会将请求提交出去,因此如果有序要提交的请求的话那么就调用virtio_blk_submit_multireq函数提交它(们)。

virtio_blk_get_request函数

主要流程
1.首先调用了virtio_blk_alloc_request函数分配了一个VirtIOBlockReq对象req
2.调用virtqueue_pop函数从vring中取出一个请求,这个请求中的信息将传递到req的elem域中

virtqueue_pop函数

主要流程
1.调用virtqueue_num_heads函数得到当前有多少个head(每个head对应了一个sg列表,这里需要和guest对vring的结构、使用方式联系起来就好理解了,也可以说是一个head就对应了一个请求),该函数中会做正确性检查(如果head的数目超过了vring的容量,那么肯定出错误了、终止运行)。如果该函数返回0,说明没有要处理的请求,所以直接返回0。
head的数量是

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值