[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 05/12] target-i386: Split APIC creation from initial
From: |
Andreas Färber |
Subject: |
[Qemu-devel] [PATCH 05/12] target-i386: Split APIC creation from initialization in x86_cpu_realizefn() |
Date: |
Tue, 16 Apr 2013 02:46:42 +0200 |
From: Igor Mammedov <address@hidden>
When APIC is hotplugged during CPU hotplug, device_set_realized()
calls device_reset() on it. And if QEMU runs in KVM mode, following
call chain will fail:
apic_reset_common()
-> kvm_apic_vapic_base_update()
-> kvm_vcpu_ioctl(cpu->kvm_fd,...)
due to cpu->kvm_fd not being initialized yet.
cpu->kvm_fd is initialized during qemu_init_vcpu() but x86_cpu_apic_init()
can't be moved after it because kvm_init_vcpu() -> kvm_arch_reset_vcpu()
relies on APIC to determine if CPU is BSP for setting initial env->mp_state.
So split APIC device creation from its initialization and realize APIC
after CPU is created, when it's safe to call APIC's reset method.
Signed-off-by: Igor Mammedov <address@hidden>
Reviewed-by: liguang <address@hidden>
Reviewed-by: Eduardo Habkost <address@hidden>
Signed-off-by: Andreas Färber <address@hidden>
---
target-i386/cpu.c | 24 +++++++++++++++++++++---
1 file changed, 21 insertions(+), 3 deletions(-)
diff --git a/target-i386/cpu.c b/target-i386/cpu.c
index 9d45f09..5d05803 100644
--- a/target-i386/cpu.c
+++ b/target-i386/cpu.c
@@ -2050,9 +2050,8 @@ static void mce_init(X86CPU *cpu)
}
#ifndef CONFIG_USER_ONLY
-static void x86_cpu_apic_init(X86CPU *cpu, Error **errp)
+static void x86_cpu_apic_create(X86CPU *cpu, Error **errp)
{
- static int apic_mapped;
CPUX86State *env = &cpu->env;
APICCommonState *apic;
const char *apic_type = "apic";
@@ -2075,6 +2074,16 @@ static void x86_cpu_apic_init(X86CPU *cpu, Error **errp)
/* TODO: convert to link<> */
apic = APIC_COMMON(env->apic_state);
apic->cpu = cpu;
+}
+
+static void x86_cpu_apic_realize(X86CPU *cpu, Error **errp)
+{
+ CPUX86State *env = &cpu->env;
+ static int apic_mapped;
+
+ if (env->apic_state == NULL) {
+ return;
+ }
if (qdev_init(env->apic_state)) {
error_setg(errp, "APIC device '%s' could not be initialized",
@@ -2092,6 +2101,10 @@ static void x86_cpu_apic_init(X86CPU *cpu, Error **errp)
apic_mapped = 1;
}
}
+#else
+static void x86_cpu_apic_realize(X86CPU *cpu, Error **errp)
+{
+}
#endif
static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
@@ -2142,7 +2155,7 @@ static void x86_cpu_realizefn(DeviceState *dev, Error
**errp)
qemu_register_reset(x86_cpu_machine_reset_cb, cpu);
if (cpu->env.cpuid_features & CPUID_APIC || smp_cpus > 1) {
- x86_cpu_apic_init(cpu, &local_err);
+ x86_cpu_apic_create(cpu, &local_err);
if (local_err != NULL) {
goto out;
}
@@ -2151,6 +2164,11 @@ static void x86_cpu_realizefn(DeviceState *dev, Error
**errp)
mce_init(cpu);
qemu_init_vcpu(&cpu->env);
+
+ x86_cpu_apic_realize(cpu, &local_err);
+ if (local_err != NULL) {
+ goto out;
+ }
cpu_reset(CPU(cpu));
xcc->parent_realize(dev, &local_err);
--
1.8.1.4
- [Qemu-devel] [PULL 00/12] QOM CPUState patch queue 2013-04-15, Andreas Färber, 2013/04/15
- [Qemu-devel] [PATCH 02/12] target-i386: Improve -cpu ? features output, Andreas Färber, 2013/04/15
- [Qemu-devel] [PATCH 01/12] target-i386: Fix including "host" in -cpu ? output, Andreas Färber, 2013/04/15
- [Qemu-devel] [PATCH 03/12] qdev: Add qdev property for bool type, Andreas Färber, 2013/04/15
- [Qemu-devel] [PATCH 06/12] kvmvapic: Replace FROM_SYSBUS() with QOM type cast, Andreas Färber, 2013/04/15
- [Qemu-devel] [PATCH 04/12] target-i386: Consolidate error propagation in x86_cpu_realizefn(), Andreas Färber, 2013/04/15
- [Qemu-devel] [PATCH 07/12] ioapic: Replace FROM_SYSBUS() with QOM type cast, Andreas Färber, 2013/04/15
- [Qemu-devel] [PATCH 05/12] target-i386: Split APIC creation from initialization in x86_cpu_realizefn(),
Andreas Färber <=
- [Qemu-devel] [PATCH 11/12] qdev: Set device's parent before calling realize() down inheritance chain, Andreas Färber, 2013/04/15
- [Qemu-devel] [PATCH 08/12] target-i386/cpu.c: Coding style fixes, Andreas Färber, 2013/04/15
- [Qemu-devel] [PATCH 10/12] cpu: Pass CPUState to *cpu_synchronize_post*(), Andreas Färber, 2013/04/15
- [Qemu-devel] [PATCH 09/12] target-i386: Split out CPU creation and features parsing, Andreas Färber, 2013/04/15
- [Qemu-devel] [PATCH 12/12] target-cris: Override do_interrupt for pre-v32 CPU cores, Andreas Färber, 2013/04/15