Skip to the content.

stop / continue

关键的问题,

  1. stop 和 cont 哪些和热迁移的部分是重叠的?
  2. savevm 和 loadvm
  3. migration to file / socket
  4. cpr

代码流程

savevm 中 load_snapshotsave_snapshot 可以和 migration 共用

[ ] 为什么 savevm 和 postcopy 有关系哇

似乎主要是 postcopy 的一些通信的操作

细节分析

inflight block io 和网络 io 都是如何暂停的

如果 io engine 在 QEMU 内部,例如普通的 virtio-blk ,需要等 host 的 io 返回吗?

如果 io engine 在 QEMU 外部,例如 SPDK 的,如何处理的

下发暂停命令之后,vCPU thread 如何结束的

当重新启动虚拟机,那些 vCPU thread 是如何启动的?

hmp 命令都是 hmp_ 开头的,容易找到:

没想到啊,居然用的是这个方法:

    int err = pthread_kill(cpu->thread->thread, SIG_IPI);

当 vCPU 停住的时候,代码的结构在这里:

暂停和启动就是普通的 flag 就可以解决:

void cpu_pause(CPUState *cpu)
{
    if (qemu_cpu_is_self(cpu)) {
        qemu_cpu_stop(cpu, true);
    } else {
        cpu->stop = true;
        qemu_cpu_kick(cpu);
    }
}

void cpu_resume(CPUState *cpu)
{
    cpu->stop = false;
    cpu->stopped = false;
    qemu_cpu_kick(cpu);
}

通过 stop / cont 就可以观察到吧?

观察不到 : virtio_gpu_save

stop
hmp_stop()
vm_stop(RUN_STATE_PAUSED)
cpu_stop_current()
qemu_clock_pause()

cont

hmp_cont()
vm_start()
qemu_clock_resume()
cpu_resume()

才发现 stop/cont 不会去保存 cpu 的状态,只是用来 savevm 和 stopvm 而已。

stop/cont savevm migration

将热迁移完成的虚拟机可以通过 cont 就可以继续恢复

当然 double running 是需要考虑的事情

本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。