libvirt 向qemu传文件描述符

libvirt创建的qemu进程里面有一些fd的参数,这些文件是libvirt帮qemu打开的一些设备文件句柄等,比如:
qemu … -netdev tap,fd=24,id=hostnet1,vhost=on,vhostfd=25
因为需要libvirt帮忙先配置好后端以及处于安全考虑;但是qemu起来就是另外一个进程,给个fd号就能直接用了吗,显然不是,下面从代码角度分析下

[libvirt]
qemuOpenVhostNet
-qemuMonitorPassDevfd
–qemuMonitorSendFileHandle
—qemuMonitorJSONSendFileHandle
—-qemuMonitorJSONCommandWithFd
qemuConnectMonitor->qemuMonitorOpen
qemuMonitorOpenInternal调用virEventAddHandle把qemuMonitorIO注册给mon->watch作为callback,等monitor检测到qemu进程起来会调用这个函数把fd传过去,
而传fd用的是Linux系统调用sendmsg。对,就是那个socket通信中常用的sendmsg,他还有这个附加属性~

 

qemuMonitorIO:
qemuMonitorIOWrite:

 

virEventPollRunOnce->virEventPollDispatchHandles
最后在这里virEventPollDispatchHandles调用了注册的callback: (cb)(watch, fds[n].fd, hEvents, opaque);
[qemu]
register_types

 

fd_chr_read->qio_channel_read->qio_channel_readv_full->
return klass->io_readv(ioc, iov, niov, fds, nfds, errp);
ioc_klass->io_readv = qio_channel_socket_readv;
ret =recvmsg(sioc->fd, &msg, sflags);
qmp_getfd->qemu_chr_fe_get_msgfd->qemu_chr_fe_get_msgfds->
return s->get_msgfds ? s->get_msgfds(s, fds, len) : -1;

 参考文献:

Leave a Reply

Your email address will not be published. Required fields are marked *