From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Lmc14-0002Aw-OD for qemu-devel@nongnu.org; Wed, 25 Mar 2009 18:56:10 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Lmc0y-00022J-HW for qemu-devel@nongnu.org; Wed, 25 Mar 2009 18:56:10 -0400 Received: from [199.232.76.173] (port=51790 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Lmc0x-00021f-Vv for qemu-devel@nongnu.org; Wed, 25 Mar 2009 18:56:04 -0400 Received: from mx2.redhat.com ([66.187.237.31]:51079) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1Lmc0w-0006IF-VL for qemu-devel@nongnu.org; Wed, 25 Mar 2009 18:56:03 -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 n2PMu2v8032469 for ; Wed, 25 Mar 2009 18:56:02 -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 n2PMttxN032677 for ; Wed, 25 Mar 2009 18:55:56 -0400 Received: from amt.cnet (vpn-10-17.str.redhat.com [10.32.10.17]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id n2PMtwLP013167 for ; Wed, 25 Mar 2009 18:56:01 -0400 Received: from amt.cnet (amt.cnet [127.0.0.1]) by amt.cnet (Postfix) with ESMTP id 11C57588008 for ; Wed, 25 Mar 2009 19:55:52 -0300 (BRT) Message-Id: <20090325225439.339053495@amt.cnet> Date: Wed, 25 Mar 2009 19:47:23 -0300 From: Marcelo Tosatti References: <20090325224714.853788328@amt.cnet> Content-Disposition: inline; filename=handle-vmstop-vcpu Subject: [Qemu-devel] [patch 09/10] 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 @@ -3550,7 +3550,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(); @@ -3560,6 +3575,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 { @@ -3757,6 +3787,8 @@ static int cpu_can_run(CPUState *env) return 0; if (reset_requested) return 0; + if (vmstop_requested) + return 0; return 1; } @@ -4203,6 +4235,8 @@ static void qemu_init_state(void) static void main_loop(void) { + int r; + qemu_thread_self(&io_thread); setup_iothread_fd(); @@ -4219,12 +4253,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); } } }