We don't support smp without irqchip in kernel, so only abort in that situation
Signed-off-by: Glauber Costa <glom...@redhat.com> --- kvm-all.c | 10 +++++----- kvm.h | 2 ++ target-i386/kvm.c | 7 +++++++ target-ppc/kvm.c | 5 +++++ 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/kvm-all.c b/kvm-all.c index 22d84a3..b17bd74 100644 --- a/kvm-all.c +++ b/kvm-all.c @@ -427,7 +427,12 @@ static int kvm_create_irqchip(KVMState *s) return ret; s->irqchip_in_kernel = 1; + #endif + if (!kvm_arch_can_smp() && (smp_cpus > 1)) { + fprintf(stderr, "No SMP KVM support, use '-smp 1'\n"); + ret = -EINVAL; + } return ret; } @@ -440,11 +445,6 @@ int kvm_init(int smp_cpus) int ret; int i; - if (smp_cpus > 1) { - fprintf(stderr, "No SMP KVM support, use '-smp 1'\n"); - return -EINVAL; - } - s = qemu_mallocz(sizeof(KVMState)); #ifdef KVM_CAP_SET_GUEST_DEBUG diff --git a/kvm.h b/kvm.h index 7b9d8b3..91a4bf4 100644 --- a/kvm.h +++ b/kvm.h @@ -101,6 +101,8 @@ int kvm_arch_init_vcpu(CPUState *env); void kvm_arch_reset_vcpu(CPUState *env); +int kvm_arch_can_smp(void); + #ifdef TARGET_I386 int kvm_set_lapic(CPUState *env, struct kvm_lapic_state *s); int kvm_get_lapic(CPUState *env, struct kvm_lapic_state *s); diff --git a/target-i386/kvm.c b/target-i386/kvm.c index 65ad2a1..cea0cf1 100644 --- a/target-i386/kvm.c +++ b/target-i386/kvm.c @@ -1171,3 +1171,10 @@ int kvm_get_lapic(CPUState *env, struct kvm_lapic_state *s) return kvm_vcpu_ioctl(env, KVM_GET_LAPIC, s); } + +int kvm_arch_can_smp(void) +{ + if (kvm_irqchip_in_kernel()) + return 1; + return 0; +} diff --git a/target-ppc/kvm.c b/target-ppc/kvm.c index d08639b..cfe467f 100644 --- a/target-ppc/kvm.c +++ b/target-ppc/kvm.c @@ -62,6 +62,11 @@ int kvm_arch_set_irq(KVMState *s, int irq, int level, int *status) return -ENOSYS; } +int kvm_arch_can_smp(void) +{ + return 0; +} + int kvm_arch_put_registers(CPUState *env) { struct kvm_regs regs; -- 1.6.5.2