From patchwork Tue Mar 24 17:16:52 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marcelo Tosatti X-Patchwork-Id: 14075 Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by demeter.kernel.org (8.14.2/8.14.2) with ESMTP id n2OHHQLf010218 for ; Tue, 24 Mar 2009 17:17:26 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1763581AbZCXRRS (ORCPT ); Tue, 24 Mar 2009 13:17:18 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1763577AbZCXRRR (ORCPT ); Tue, 24 Mar 2009 13:17:17 -0400 Received: from mx2.redhat.com ([66.187.237.31]:43433 "EHLO mx2.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1762808AbZCXRRN (ORCPT ); Tue, 24 Mar 2009 13:17:13 -0400 Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n2OHHBPZ021838; Tue, 24 Mar 2009 13:17:11 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx2.corp.redhat.com (8.13.1/8.13.1) with ESMTP id n2OHH5fe026842; Tue, 24 Mar 2009 13:17:06 -0400 Received: from amt.cnet (vpn-10-78.str.redhat.com [10.32.10.78]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id n2OHH8iM019682; Tue, 24 Mar 2009 13:17:10 -0400 Received: from amt.cnet (amt.cnet [127.0.0.1]) by amt.cnet (Postfix) with ESMTP id 2A754550004; Tue, 24 Mar 2009 14:16:55 -0300 (BRT) Received: (from marcelo@localhost) by amt.cnet (8.14.3/8.14.3/Submit) id n2OHGq08004068; Tue, 24 Mar 2009 14:16:52 -0300 Date: Tue, 24 Mar 2009 14:16:52 -0300 From: Marcelo Tosatti To: Avi Kivity , kvm-devel Cc: Dor Laor , Yaniv Kamay Subject: kvm: qemu: stop/start cpus before/after devices Message-ID: <20090324171652.GA3655@amt.cnet> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.18 (2008-05-17) X-Scanned-By: MIMEDefang 2.58 on 172.16.27.26 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org From: Yaniv Kamay Stop cpus before devices when stopping the VM, start cpus after devices when starting VM. Acked-by: Dor Laor Signed-off-by: Marcelo Tosatti --- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/qemu/qemu-kvm.c b/qemu/qemu-kvm.c index 93af6ea..4164368 100644 --- a/qemu/qemu-kvm.c +++ b/qemu/qemu-kvm.c @@ -285,7 +285,7 @@ static int all_threads_paused(void) return 1; } -static void pause_all_threads(void) +void qemu_kvm_pause_all_threads(void) { CPUState *penv = first_cpu; @@ -305,7 +305,7 @@ static void pause_all_threads(void) qemu_cond_wait(&qemu_pause_cond); } -static void resume_all_threads(void) +void qemu_kvm_resume_all_threads(void) { CPUState *penv = first_cpu; @@ -319,14 +319,6 @@ static void resume_all_threads(void) } } -static void kvm_vm_state_change_handler(void *context, int running, int reason) -{ - if (running) - resume_all_threads(); - else - pause_all_threads(); -} - static void update_regs_for_sipi(CPUState *env) { kvm_arch_update_regs_for_sipi(env); @@ -371,7 +363,7 @@ static void qemu_kvm_system_reset(void) { CPUState *penv = first_cpu; - pause_all_threads(); + qemu_kvm_pause_all_threads(); qemu_system_reset(); @@ -380,7 +372,7 @@ static void qemu_kvm_system_reset(void) penv = (CPUState *)penv->next_cpu; } - resume_all_threads(); + qemu_kvm_resume_all_threads(); } static int kvm_main_loop_cpu(CPUState *env) @@ -466,7 +458,6 @@ int kvm_init_ap(void) #ifdef TARGET_I386 kvm_tpr_opt_setup(); #endif - qemu_add_vm_change_state_handler(kvm_vm_state_change_handler, NULL); signal(SIG_IPI, sig_ipi_handler); return 0; @@ -610,7 +601,7 @@ int kvm_main_loop(void) #endif } - pause_all_threads(); + qemu_kvm_pause_all_threads(); pthread_mutex_unlock(&qemu_mutex); return 0; diff --git a/qemu/qemu-kvm.h b/qemu/qemu-kvm.h index c0549df..ca59af8 100644 --- a/qemu/qemu-kvm.h +++ b/qemu/qemu-kvm.h @@ -119,6 +119,9 @@ int qemu_kvm_register_coalesced_mmio(target_phys_addr_t addr, int qemu_kvm_unregister_coalesced_mmio(target_phys_addr_t addr, unsigned int size); +void qemu_kvm_pause_all_threads(void); +void qemu_kvm_resume_all_threads(void); + int kvm_coalesce_mmio_region(target_phys_addr_t start, ram_addr_t size); int kvm_uncoalesce_mmio_region(target_phys_addr_t start, ram_addr_t size); diff --git a/qemu/vl.c b/qemu/vl.c index 7ae266e..c52d2d7 100644 --- a/qemu/vl.c +++ b/qemu/vl.c @@ -3596,6 +3596,8 @@ void vm_start(void) cpu_enable_ticks(); vm_running = 1; vm_state_notify(1, 0); + if (kvm_enabled()) + qemu_kvm_resume_all_threads(); qemu_rearm_alarm_timer(alarm_timer); } } @@ -3605,6 +3607,8 @@ void vm_stop(int reason) if (vm_running) { cpu_disable_ticks(); vm_running = 0; + if (kvm_enabled()) + qemu_kvm_pause_all_threads(); vm_state_notify(0, reason); } }