From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LpWVM-0004j7-8e for qemu-devel@nongnu.org; Thu, 02 Apr 2009 19:39:28 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LpWVH-0004ek-0y for qemu-devel@nongnu.org; Thu, 02 Apr 2009 19:39:27 -0400 Received: from [199.232.76.173] (port=39966 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LpWVF-0004eR-7s for qemu-devel@nongnu.org; Thu, 02 Apr 2009 19:39:22 -0400 Received: from mx2.redhat.com ([66.187.237.31]:45462) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1LpWVD-0007oS-Ti for qemu-devel@nongnu.org; Thu, 02 Apr 2009 19:39:20 -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 n32NdJK6024043 for ; Thu, 2 Apr 2009 19:39:19 -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 n32NdKUD016212 for ; Thu, 2 Apr 2009 19:39:20 -0400 Received: from amt.cnet (vpn-10-5.str.redhat.com [10.32.10.5]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id n32Nd903006761 for ; Thu, 2 Apr 2009 19:39:18 -0400 Received: from amt.cnet (amt.cnet [127.0.0.1]) by amt.cnet (Postfix) with ESMTP id 465775C8004 for ; Thu, 2 Apr 2009 20:38:53 -0300 (BRT) Message-Id: <20090402233746.496016021@localhost.localdomain> References: <20090402233250.577870188@localhost.localdomain> Date: Thu, 02 Apr 2009 20:32:59 -0300 From: Marcelo Tosatti Content-Disposition: inline; filename=handle-vmstop-vcpu Subject: [Qemu-devel] [patch 09/11] qemu: handle vmstop from cpu context Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org There are certain cases where cpu context requests a vm stop, such as -ENOSPC handling. IMO its simpler to handle vmstop only through the iothread. Note there is change in behaviour: now the cpu thread which requested vm_stop will actually only stop when it exits back to cpu_main_loop. It might cause further damage in between vmstop and cpu_main_loop. Index: trunk/vl.c =================================================================== --- trunk.orig/vl.c +++ trunk/vl.c @@ -3551,7 +3551,22 @@ void vm_start(void) } } -void vm_stop(int reason) +static int vmstop_requested; + +static int qemu_vmstop_requested(void) +{ + int r = vmstop_requested; + vmstop_requested = 0; + return r; +} + +static void qemu_system_vmstop_request(int reason) +{ + vmstop_requested = reason; + main_loop_break(); +} + +static void __vm_stop(int reason) { if (vm_running) { cpu_disable_ticks(); @@ -3561,6 +3576,21 @@ void vm_stop(int reason) } } +void vm_stop(int reason) +{ + QemuThread me; + qemu_thread_self(&me); + + if (!qemu_thread_equal(&me, &io_thread)) { + qemu_system_vmstop_request(reason); + /* make sure we can't return to cpu_exec */ + if (cpu_single_env) + cpu_single_env->stop = 1; + return; + } + __vm_stop(reason); +} + /* reset/shutdown handler */ typedef struct QEMUResetEntry { @@ -3758,6 +3788,8 @@ static int cpu_can_run(CPUState *env) return 0; if (reset_requested) return 0; + if (vmstop_requested) + return 0; return 1; } @@ -4204,6 +4236,8 @@ static void qemu_init_state(void) static void main_loop(void) { + int r; + qemu_thread_self(&io_thread); setup_iothread_fd(); @@ -4220,12 +4254,14 @@ static void main_loop(void) no_shutdown = 0; else break; - } else if (qemu_powerdown_requested()) + } else if (qemu_powerdown_requested()) { qemu_system_powerdown(); - else if (qemu_reset_requested()) { + } else if (qemu_reset_requested()) { pause_all_vcpus(); qemu_system_reset(); resume_all_vcpus(); + } else if ((r = qemu_vmstop_requested())) { + vm_stop(r); } } } --