前序
qemu向外暴露的vm设备热拔插cmd是device_add,上层应用程序【libvirt】通过HMP(Human Monitor Protocol)和QMP(Qemu Monitor Protocol)协议与qemu进行交互。HMP是在QMP之上做了一层封装,供上层应用程序更友好直接通过cmd与qemu交互,而QMP是上层应用程序与qemu之间通过API交互的协议。
代码分析
以kvm3.0代码为例
device_add代码入口,hmp.c
void hmp_device_add(Monitor *mon, const QDict *qdict)
{
Error *err = NULL;
qmp_device_add((QDict *)qdict, NULL, &err);
hmp_handle_error(mon, &err);
}
hot-plug device的信息都保存在QDict结构体里,进入到qdev-monitor.c
void qmp_device_add(QDict *qdict, QObject **ret_data, Error **errp)
{
Error *local_err = NULL;
QemuOpts *opts;
DeviceState *dev;
opts = qemu_opts_from_qdict(qemu_find_opts("device"), qdict, &local_err);
if (local_err) {
error_propagate(errp, local_err);
return;
}
...
dev = qdev_device_add(opts, &local_err);