找回密码
 立即注册
首页 业界区 安全 qemu的io流程

qemu的io流程

膏包 昨天 17:52
qemu version: 4.1.0
一 qemu主线程

以存储类型virtio-blk为例,guest内部发起io请求,当qemu主线程轮询到了ioeventfd,调用aio_dispatch_handlers处理io。
  1. aio_dispatch_handlers
  2.         ...
  3.                 virtio_queue_notify_aio_vq
  4.                         vq->handle_aio_output
  5.                                 virtio_blk_data_plane_handle_output
  6.                                         ...
  7.                                                 submit_requests //处理io请求
  8.                                                         if (is_write)
  9.                                                                 blk_aio_pwritev
  10.                                                         else
  11.                                                                 blk_aio_preadv
复制代码
二 协程

blk_aio_prwv负责将块设备的异步io请求封装和调度,并在完成后回调通知,以wirte为例,创建一个协程后返回,将io请求交给协程来处理,入口函数是blk_aio_write_entry,等协程完成io后通知主线程,回调函数是virtio_blk_rw_complete。
  1. blk_aio_pwritev
  2.         blk_aio_prwv(...blk_aio_write_entry...virtio_blk_rw_complete...)
  3.                 qemu_coroutine_create(...blk_aio_write_entry...) //创建协程处理io请求
  4.                 bdrv_coroutine_enter
  5. blk_aio_write_entry
  6.         blk_co_pwritev
  7.                 bdrv_co_pwritev
  8.                         bdrv_driver_pwritev
  9.                                 raw_co_pwritev
  10.                                         raw_co_prw
  11.         blk_aio_complete //当io返回,收到通知,切回协程,通知主线程。
  12.                 acb->common.cb
  13.                         virtio_blk_rw_complete
复制代码
三 linux aio和aio线程池

raw_co_prw有两种处理io的方式,当配置了linux_aio,调用laio_co_submit,否则调用raw_thread_pool_submit。
linux aio

linux aio是内核级别的异步io实现,协程调用laio_do_submit,将io请求交给内核处理,无需等待,返回到主线程。
当内核处理完io请求,回调qemu_laio_completion_cb,切回协程。
  1. raw_co_prw
  2.         laio_co_submit
  3.                 laio_do_submit //由内核处理,无需等待。
  4.                 qemu_coroutine_yield //切出协程,返回主线程。
  5. qemu_laio_completion_cb //io完成的回调函数
  6.         qemu_laio_process_completions_and_submit
  7.                 ...
  8.                         qemu_coroutine_entered //当io返回,收到通知,切回协程,完成剩下的工作。
复制代码
aio线程池

qemu有一个专门负责aio的线程池thread_pool,协程将io请求交给线程池处理,无需等待,返回到主线程。
当线程池处理完io请求,回调thread_pool_co_cb,切回协程。
  1. raw_co_prw
  2.         raw_thread_pool_submit
  3.                 thread_pool_submit_co
  4.                         thread_pool_submit_aio(...handle_aiocb_rw...thread_pool_co_cb) //由线程池负责处理,无需等待。
  5.                         qemu_coroutine_yield //切出协程,返回主线程。
  6. handle_aiocb_rw //处理io的入口函数
  7.         handle_aiocb_rw_linear
  8.                 pwrite
  9. thread_pool_co_cb //io完成的回调函数
  10.         aio_co_wake
  11.                 qemu_coroutine_entered //当io返回,收到通知,切回协程,完成剩下的工作。
复制代码
四 iotherad

当配置了iothread,将设备的io操作从qemu主线程中分离出来,交给iothread线程。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册