534 字
3 分钟
未命名
让我为您找到这几个迁移阶段对应的具体代码实现:
[10 tools called]
基于代码分析,我为您详细解释这三个迁移阶段对应的具体代码实现:
🎯 Setup 阶段 - 初始化和设置
主要函数: qemu_savevm_state_setup()
📍 文件: /migration/savevm.c:1322-1374
void qemu_savevm_state_setup(QEMUFile *f)
{
// 遍历所有注册的状态处理器
QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
// 🔸 方式1: VMStateDescription保存 - CPU寄存器、设备配置
if (se->vmsd && se->vmsd->early_setup) {
ret = vmstate_save(f, se, ms->vmdesc); // 保存CPU状态等
}
// 🔸 方式2: SaveVMHandlers设置 - RAM、块设备准备
if (se->ops && se->ops->save_setup) {
ret = se->ops->save_setup(f, se->opaque); // RAM初始化等
}
}
}
调用位置:
📍 文件: /migration/migration.c:3518
(在 migration_thread
中)
具体实现例子:
- RAM 设置:
ram_save_setup()
-/migration/ram.c:3070
- 块设备设置:
block_save_setup()
-/migration/block.c:714
- CPU 状态: 通过
vmstate_save()
保存各架构 CPU 寄存器
🔄 Iterate 阶段 - 迭代传输脏页
主要函数: qemu_savevm_state_iterate()
📍 文件: /migration/savevm.c:1410-1460
int qemu_savevm_state_iterate(QEMUFile *f, bool postcopy)
{
QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
if (se->ops && se->ops->save_live_iterate) {
ret = se->ops->save_live_iterate(f, se->opaque); // 迭代保存脏页
}
}
}
调用位置:
📍 文件: /migration/migration.c:3279
(在 migration_iteration_run
中)
迭代控制逻辑:
static MigIterateState migration_iteration_run(MigrationState *s)
{
// 检查待传输数据量
if (pending_size < s->threshold_size && can_switchover) {
migration_completion(s); // 触发完成阶段
return MIG_ITERATE_BREAK;
}
// 继续迭代传输
qemu_savevm_state_iterate(s->to_dst_file, in_postcopy);
return MIG_ITERATE_RESUME;
}
具体实现例子:
- RAM 迭代:
ram_save_iterate()
- 传输脏页数据 - 块设备迭代:
block_save_iterate()
- 传输块设备数据
✅ Complete 阶段 - 最终完成传输
主要函数: qemu_savevm_state_complete_precopy()
📍 文件: /migration/savevm.c:1510-1546
int qemu_savevm_state_complete_precopy_iterable(QEMUFile *f, bool in_postcopy)
{
QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
if (se->ops && se->ops->save_live_complete_precopy) {
ret = se->ops->save_live_complete_precopy(f, se->opaque); // 最终完成传输
}
}
}
调用位置:
📍 文件: /migration/migration.c:2776
(在 migration_completion
中)
触发条件:
- 脏页数量降至阈值以下 (
pending_size < s->threshold_size
) - 可以进行切换 (
can_switchover
)
具体实现例子:
- RAM 完成:
ram_save_complete()
- 传输剩余 RAM 数据 - 块设备完成:
block_save_complete()
- 完成块设备数据传输
📋 阶段调用链总结
migration_thread() // 主迁移线程
├─ qemu_savevm_state_setup() // Setup阶段
├─ while(migration_is_active()) {
│ └─ migration_iteration_run()
│ └─ qemu_savevm_state_iterate() // Iterate阶段
│ }
└─ migration_completion()
└─ qemu_savevm_state_complete_precopy() // Complete阶段
每个阶段都会遍历所有注册的状态处理器 (SaveStateEntry),分别调用对应的处理函数来完成 VM 状态的分阶段传输!