最近debug KVM IO,记录总结如下。
关于virtio:
+---------+------+--------+----------+--+ | +------+ +----------+ | | user | | | | | | space | | | guest | | | | | | | | | +----+ qemu | | +-+------+ | | | | | | | virtio | | | | | | | | driver | | | | +------+ +-+---++---+ | | | | | | | ^ | | | v | v | | | | +-+-----+-----------------+--+-------+--+ | |tap | +------------+ kvm.ko | | | +-----+ +--+-------+ | | kernel | +---------------------------------------+具体动作过程:
1) guest设置好tx;
2)发送中断信号,退出KVM
3) KVM从内核态切换到QEMU的用户态进程
4) QEMU把tx数据发送到tap
这里发生了两次内核态和用户态的切换。
Vhost:
vhost在内核中加入了vhost_net.ko模块,使得数据可以在内核态中得到处理。
+---------+------+--------+----------+--+ | +------+ +----------+ | | user | | | | | | space | | | guest | | | | | | | | | | qemu | | +-+------+ | | | | | | virtio | | | | | | | driver | | | +------+ +-+---++---+ | | | | | | | | v | | | +-+-----+---+-+----+------+----+--+-----+ | |tap | | vhost-net.ko| | kvm.ko | | +---^-+ +------+----^-+ +----+---+ | |-------| kernel |-----------| | +---------------------------------------+具体动作过程:
1) guest设置好tx;
2)发送中断信号,退出KVM
3) KVM直接和vhost_net通信
4) vhost_net把tx数据发送到tap
Vhost_user:
增加一种新的vhost_backend, 使得数据可以在用户态得以灵活的处理。
+---------------+------+--+----------+--+ | +------+ +----------+ | | user | | | | | | space | | | guest | | | | | | | | | +-+-------+ | qemu | | +-+------+ | | | vhost | | | | | virtio | | | | backend | | | | | driver | | | +---------+ +------+ +-+---++---+ | | | | | ^ | | | | v | | | | +------------------------------+--+-----+ | +-----------------------+ kvm.ko | | +--+-----+ | kernel | +---------------------------------------+