Skip to the content.

stop

  1. 将热迁移完成的虚拟机可以通过 cont 就可以继续恢复 当然 double running 是控制面需要考虑的

  2. 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()

代码流程

savevm 中 load_snapshotsave_snapshot 可以和 migration 共用

vCPU 的暂停和恢复

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);
}

TODO

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

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

我猜测是 qemu 的 handler 可以继续处理 host 的模拟行为,但是当 vCPU 暂停后,相当于自动的暂停了。

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