前序
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);