diff options
author | Andreas Färber <afaerber@suse.de> | 2013-07-27 02:53:25 +0200 |
---|---|---|
committer | Andreas Färber <afaerber@suse.de> | 2013-07-29 15:29:15 +0200 |
commit | 14a10fc39923b3af07c8c46d22cb20843bee3a72 (patch) | |
tree | 5dc9c362f2ef73a3f28e62483e14d0602e439b33 /target-s390x/cpu.c | |
parent | fdc43322c978d78e79e692872dcec7b4f6a447f1 (diff) | |
download | qemu-14a10fc39923b3af07c8c46d22cb20843bee3a72.zip qemu-14a10fc39923b3af07c8c46d22cb20843bee3a72.tar.gz qemu-14a10fc39923b3af07c8c46d22cb20843bee3a72.tar.bz2 |
cpu: Partially revert "cpu: Change qemu_init_vcpu() argument to CPUState"
Commit c643bed99 moved qemu_init_vcpu() calls to common CPUState code.
This causes x86 cpu-add to fail with "KVM: setting VAPIC address failed".
The reason for the failure is that CPUClass::kvm_fd is not yet
initialized in the following call graph:
->x86_cpu_realizefn
->x86_cpu_apic_realize
->qdev_init
->device_set_realized
->device_reset (hotplugged == 1)
->apic_reset_common
->vapic_base_update
->kvm_apic_vapic_base_update
This causes attempted KVM vCPU ioctls to fail.
By contrast, in the non-hotplug case the APIC is reset much later, when
the vCPU is already initialized.
As a quick and safe solution, move the qemu_init_vcpu() call back into
the targets' realize functions.
Reported-by: Chen Fan <chen.fan.fnst@cn.fujitsu.com>
Acked-by: Igor Mammedov <imammedo@redhat.com> (for i386)
Tested-by: Jia Liu <proljc@gmail.com> (for openrisc)
Signed-off-by: Andreas Färber <afaerber@suse.de>
Diffstat (limited to 'target-s390x/cpu.c')
-rw-r--r-- | target-s390x/cpu.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/target-s390x/cpu.c b/target-s390x/cpu.c index 1d16da3..9b82495 100644 --- a/target-s390x/cpu.c +++ b/target-s390x/cpu.c @@ -101,10 +101,11 @@ static void s390_cpu_machine_reset_cb(void *opaque) static void s390_cpu_realizefn(DeviceState *dev, Error **errp) { - S390CPU *cpu = S390_CPU(dev); + CPUState *cs = CPU(dev); S390CPUClass *scc = S390_CPU_GET_CLASS(dev); - cpu_reset(CPU(cpu)); + qemu_init_vcpu(cs); + cpu_reset(cs); scc->parent_realize(dev, errp); } |