From mboxrd@z Thu Jan 1 00:00:00 1970 From: Marcelo Tosatti Subject: [patch 6/6] qemu-kvm: use reset handler for vcpus Date: Tue, 23 Mar 2010 13:53:39 -0300 Message-ID: <20100323165347.689886209@amt.cnet> References: <20100323165333.062022913@amt.cnet> Cc: Marcelo Tosatti To: kvm@vger.kernel.org Return-path: Received: from mx1.redhat.com ([209.132.183.28]:39898 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752045Ab0CWQzG (ORCPT ); Tue, 23 Mar 2010 12:55:06 -0400 Received: from int-mx05.intmail.prod.int.phx2.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.18]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o2NGt6u6024661 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 23 Mar 2010 12:55:06 -0400 Content-Disposition: inline; filename=register-reset-vcpu Sender: kvm-owner@vger.kernel.org List-ID: Hook into the reset handlers instead of using custom code in qemu_kvm_system_reset. Also move kvm_arch_init_vcpu to kvm_create_vcpu. Signed-off-by: Marcelo Tosatti Index: qemu-kvm-cleanups/qemu-kvm.c =================================================================== --- qemu-kvm-cleanups.orig/qemu-kvm.c +++ qemu-kvm-cleanups/qemu-kvm.c @@ -439,6 +439,13 @@ void kvm_disable_pit_creation(kvm_contex kvm->no_pit_creation = 1; } +static void kvm_reset_vcpu(void *opaque) +{ + CPUState *env = opaque; + + kvm_arch_cpu_reset(env); +} + static void kvm_create_vcpu(CPUState *env, int id) { long mmap_size; @@ -473,6 +480,11 @@ static void kvm_create_vcpu(CPUState *en s->coalesced_mmio * PAGE_SIZE; #endif + r = kvm_arch_init_vcpu(env); + if (r == 0) { + qemu_register_reset(kvm_reset_vcpu, env); + } + return; err_fd: close(env->kvm_fd); @@ -1777,17 +1789,10 @@ static void setup_kernel_sigmask(CPUStat static void qemu_kvm_system_reset(void) { - CPUState *penv = first_cpu; - pause_all_threads(); qemu_system_reset(); - while (penv) { - kvm_arch_cpu_reset(penv); - penv = (CPUState *) penv->next_cpu; - } - resume_all_threads(); } @@ -1829,7 +1834,6 @@ static void *ap_main_loop(void *_env) env->thread_id = kvm_get_thread_id(); sigfillset(&signals); sigprocmask(SIG_BLOCK, &signals, NULL); - kvm_create_vcpu(env, env->cpu_index); #ifdef CONFIG_KVM_DEVICE_ASSIGNMENT /* do ioperm for io ports of assigned devices */ @@ -1837,12 +1841,11 @@ static void *ap_main_loop(void *_env) on_vcpu(env, kvm_arch_do_ioperm, data); #endif - setup_kernel_sigmask(env); - pthread_mutex_lock(&qemu_mutex); cpu_single_env = env; - kvm_arch_init_vcpu(env); + kvm_create_vcpu(env, env->cpu_index); + setup_kernel_sigmask(env); /* signal VCPU creation */ current_env->created = 1;