From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LqtDc-0007Aw-9k for qemu-devel@nongnu.org; Mon, 06 Apr 2009 14:06:48 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LqtDX-00079E-Iu for qemu-devel@nongnu.org; Mon, 06 Apr 2009 14:06:48 -0400 Received: from [199.232.76.173] (port=43985 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LqtDX-00079B-F7 for qemu-devel@nongnu.org; Mon, 06 Apr 2009 14:06:43 -0400 Received: from e2.ny.us.ibm.com ([32.97.182.142]:37593) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1LqtDW-0000cI-WB for qemu-devel@nongnu.org; Mon, 06 Apr 2009 14:06:43 -0400 Received: from d01relay04.pok.ibm.com (d01relay04.pok.ibm.com [9.56.227.236]) by e2.ny.us.ibm.com (8.13.1/8.13.1) with ESMTP id n36I3T2s015914 for ; Mon, 6 Apr 2009 14:03:29 -0400 Received: from d01av04.pok.ibm.com (d01av04.pok.ibm.com [9.56.224.64]) by d01relay04.pok.ibm.com (8.13.8/8.13.8/NCO v9.2) with ESMTP id n36I6dVB176916 for ; Mon, 6 Apr 2009 14:06:39 -0400 Received: from d01av04.pok.ibm.com (loopback [127.0.0.1]) by d01av04.pok.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id n36I6dGt031510 for ; Mon, 6 Apr 2009 14:06:39 -0400 Received: from squirrel.codemonkey.ws (sig-9-65-87-20.mts.ibm.com [9.65.87.20]) by d01av04.pok.ibm.com (8.12.11.20060308/8.12.11) with ESMTP id n36I6cm2031481 for ; Mon, 6 Apr 2009 14:06:39 -0400 Message-ID: <49DA44AE.6070802@us.ibm.com> Date: Mon, 06 Apr 2009 13:06:38 -0500 From: Anthony Liguori MIME-Version: 1.0 Subject: Re: [Qemu-devel] [patch 09/11] qemu: handle vmstop from cpu context References: <20090402233250.577870188@localhost.localdomain> <20090402233746.496016021@localhost.localdomain> In-Reply-To: <20090402233746.496016021@localhost.localdomain> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit 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 Marcelo Tosatti wrote: > 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. > Missing SoB line. Regards, Anthony Liguori > 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); > } > } > } > > -- Regards, Anthony Liguori