mirror of https://github.com/proxmox/mirror_qemu
kvm: enable smp > 1
Process INIT/SIPI requests and enable -smp > 1. Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com> Signed-off-by: Avi Kivity <avi@redhat.com>master
parent
dbaa07c404
commit
0af691d779
10
kvm-all.c
10
kvm-all.c
|
@ -593,11 +593,6 @@ int kvm_init(int smp_cpus)
|
||||||
int ret;
|
int ret;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (smp_cpus > 1) {
|
|
||||||
fprintf(stderr, "No SMP KVM support, use '-smp 1'\n");
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
s = qemu_mallocz(sizeof(KVMState));
|
s = qemu_mallocz(sizeof(KVMState));
|
||||||
|
|
||||||
#ifdef KVM_CAP_SET_GUEST_DEBUG
|
#ifdef KVM_CAP_SET_GUEST_DEBUG
|
||||||
|
@ -840,6 +835,11 @@ int kvm_cpu_exec(CPUState *env)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (kvm_arch_process_irqchip_events(env)) {
|
||||||
|
ret = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (env->kvm_vcpu_dirty) {
|
if (env->kvm_vcpu_dirty) {
|
||||||
kvm_arch_put_registers(env, KVM_PUT_RUNTIME_STATE);
|
kvm_arch_put_registers(env, KVM_PUT_RUNTIME_STATE);
|
||||||
env->kvm_vcpu_dirty = 0;
|
env->kvm_vcpu_dirty = 0;
|
||||||
|
|
2
kvm.h
2
kvm.h
|
@ -90,6 +90,8 @@ int kvm_arch_handle_exit(CPUState *env, struct kvm_run *run);
|
||||||
|
|
||||||
int kvm_arch_pre_run(CPUState *env, struct kvm_run *run);
|
int kvm_arch_pre_run(CPUState *env, struct kvm_run *run);
|
||||||
|
|
||||||
|
int kvm_arch_process_irqchip_events(CPUState *env);
|
||||||
|
|
||||||
int kvm_arch_get_registers(CPUState *env);
|
int kvm_arch_get_registers(CPUState *env);
|
||||||
|
|
||||||
/* state subset only touched by the VCPU itself during runtime */
|
/* state subset only touched by the VCPU itself during runtime */
|
||||||
|
|
|
@ -1073,6 +1073,22 @@ int kvm_arch_post_run(CPUState *env, struct kvm_run *run)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int kvm_arch_process_irqchip_events(CPUState *env)
|
||||||
|
{
|
||||||
|
if (env->interrupt_request & CPU_INTERRUPT_INIT) {
|
||||||
|
kvm_cpu_synchronize_state(env);
|
||||||
|
do_cpu_init(env);
|
||||||
|
env->exception_index = EXCP_HALTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (env->interrupt_request & CPU_INTERRUPT_SIPI) {
|
||||||
|
kvm_cpu_synchronize_state(env);
|
||||||
|
do_cpu_sipi(env);
|
||||||
|
}
|
||||||
|
|
||||||
|
return env->halted;
|
||||||
|
}
|
||||||
|
|
||||||
static int kvm_handle_halt(CPUState *env)
|
static int kvm_handle_halt(CPUState *env)
|
||||||
{
|
{
|
||||||
if (!((env->interrupt_request & CPU_INTERRUPT_HARD) &&
|
if (!((env->interrupt_request & CPU_INTERRUPT_HARD) &&
|
||||||
|
|
|
@ -224,6 +224,11 @@ int kvm_arch_post_run(CPUState *env, struct kvm_run *run)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int kvm_arch_process_irqchip_events(CPUState *env)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int kvmppc_handle_halt(CPUState *env)
|
static int kvmppc_handle_halt(CPUState *env)
|
||||||
{
|
{
|
||||||
if (!(env->interrupt_request & CPU_INTERRUPT_HARD) && (msr_ee)) {
|
if (!(env->interrupt_request & CPU_INTERRUPT_HARD) && (msr_ee)) {
|
||||||
|
|
|
@ -175,6 +175,11 @@ int kvm_arch_post_run(CPUState *env, struct kvm_run *run)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int kvm_arch_process_irqchip_events(CPUState *env)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void kvm_s390_interrupt_internal(CPUState *env, int type, uint32_t parm,
|
static void kvm_s390_interrupt_internal(CPUState *env, int type, uint32_t parm,
|
||||||
uint64_t parm64, int vm)
|
uint64_t parm64, int vm)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue