Skip to the content.

CPUX86State reset

https://www.qemu.org/docs/master/devel/reset.html

使用 x86_cpu_reset 进行初始化

每一个 CPU 都会进行一次

在 v4.2 的时候,reset 更加的容易:

cpu_reset (cpu=0x5555565e1800) at /home/maritns3/core/kvmqemu/hw/core/cpu.c:243
0x00005555559f6685 in qemu_devices_reset () at /home/maritns3/core/kvmqemu/hw/core/reset.c:69
0x00005555558dc37f in pc_machine_reset (machine=<optimized out>) at /home/maritns3/core/kvmqemu/hw/i386/pc.c:2140
0x000055555598a1a1 in qemu_system_reset (reason=SHUTDOWN_CAUSE_NONE) at /home/maritns3/core/kvmqemu/vl.c:1551
0x00005555557f92b2 in main (argc=<optimized out>, argv=<optimized out>, envp=<optimized out>) at /home/maritns3/core/kvmqemu/vl.c:4436

在 v6.0 的时候, ps2_kbd_reset

#0  ps2_kbd_reset (opaque=0x555556a5e260) at ../hw/input/ps2.c:956
#1  0x0000555555e7ee3a in qemu_devices_reset () at ../hw/core/reset.c:69
#2  0x0000555555b9b6b9 in pc_machine_reset (machine=0x555556975de0) at ../hw/i386/pc.c:1644
#3  0x0000555555c71748 in qemu_system_reset (reason=SHUTDOWN_CAUSE_NONE) at ../softmmu/runstate.c:442
#4  0x0000555555ae669b in qdev_machine_creation_done () at ../hw/core/machine.c:1299
#5  0x0000555555c226b5 in qemu_machine_creation_done () at ../softmmu/vl.c:2579
#6  0x0000555555c22788 in qmp_x_exit_preconfig (errp=0x5555567aa610 <error_fatal>) at ../softmmu/vl.c:2602
#7  0x0000555555c24e56 in qemu_init (argc=28, argv=0x7fffffffd7d8, envp=0x7fffffffd8c0) at ../softmmu/vl.c:3635
#8  0x000055555582e575 in main (argc=28, argv=0x7fffffffd7d8, envp=0x7fffffffd8c0) at ../softmmu/main.c:49

reset

reset 的官方文档 1

hotplug

VMSD

https://lists.gnu.org/archive/html/qemu-devel/2014-06/msg05689.html

The JSON-format output can then be used to compare the vmstate info for different QEMU versions, specifically to test whether live migration would break due to changes in the vmstate data.

保证迁移的两个 QEMU 中的内容完全相同的要求实在是太高了, 所以设置为仅仅为 VMSD 相同即可,也就是 dump 出来的文件相同 -dump-vmstate state.json

可以阅读的资料

https://blog.kernel.love/qemu-device-hotplug.html

如何实现强制重启?

通过 virsh qemu-monitor-command –hmp 7 “system_reset”

但是其实现的原理非常的有趣

那么谁来 kick 一下这些 vCPU 呢?

看来的确是这个问题了

qemu 45ed68a1a3a19754ade954d75a3c9

但是问题是,为什么 qemu 需要

就是这个 patch 了,

至少说,公版 qemu 没有出现无法 reset 的问题

升级内核

qemu=/home/martins3/data/qemu-e93ded1bf6c9/build/qemu-system-$ARCH

这种 reset 初始化回去调用两次

那 KVM_SET_NESTED_STATE 为什么也会调用两次?

从这里会有一次:

这里也有一次:

都是通过 queue work 中执行上的,没办法的:

所以,问题是,开机之后,为什么这里的代码需要执行两次:

void cpu_synchronize_all_states(void)
{
    CPUState *cpu;

    CPU_FOREACH(cpu) {
        cpu_synchronize_state(cpu);
    }
}

void cpu_synchronize_all_post_init(void)
{
    CPUState *cpu;

    CPU_FOREACH(cpu) {
        cpu_synchronize_post_init(cpu);
    }
}

当执行 system_reset 的时候,其结果为:

他们都是会去调用 kvm_arch_reset_vcpu 的。

这个分析也是错误,实际上一共调用 6 次

看看这个 backtrace

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

  1. https://qemu.readthedocs.io/en/latest/devel/reset.html