From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38900) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZUMXZ-0001Au-0J for qemu-devel@nongnu.org; Tue, 25 Aug 2015 18:18:01 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZUMXU-0000NB-0i for qemu-devel@nongnu.org; Tue, 25 Aug 2015 18:18:00 -0400 Received: from out3-smtp.messagingengine.com ([66.111.4.27]:40541) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZUMXT-0000Mf-Su for qemu-devel@nongnu.org; Tue, 25 Aug 2015 18:17:55 -0400 Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailout.nyi.internal (Postfix) with ESMTP id 4F93320CF3 for ; Tue, 25 Aug 2015 18:17:55 -0400 (EDT) Date: Tue, 25 Aug 2015 18:18:18 -0400 From: "Emilio G. Cota" Message-ID: <20150825221818.GF29063@flamenco> References: <1440375847-17603-1-git-send-email-cota@braap.org> <1440375847-17603-34-git-send-email-cota@braap.org> <55DA7267.1000100@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <55DA7267.1000100@redhat.com> Subject: Re: [Qemu-devel] [RFC 33/38] cpu: introduce cpu_tcg_sched_work to run work while other CPUs sleep List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Paolo Bonzini Cc: mttcg@greensocs.com, mark.burton@greensocs.com, a.rigo@virtualopensystems.com, qemu-devel@nongnu.org, guillaume.delbergue@greensocs.com, alex.bennee@linaro.org, Frederic Konrad On Sun, Aug 23, 2015 at 18:24:55 -0700, Paolo Bonzini wrote: > On 23/08/2015 17:24, Emilio G. Cota wrote: > > This is similar in intent to the async_safe_work mechanism. The main > > differences are: > > > > - Work is run on a single CPU thread *after* all others are put to sleep > > > > - Sleeping threads are woken up by the worker thread upon completing its job > > > > - A flag as been added to tcg_ctx so that only one thread can schedule > > work at a time. The flag is checked every time tb_lock is acquired. > > > > - Handles the possibility of CPU threads being created after the existing > > CPUs are put to sleep. This is easily triggered with many threads on > > a many-core host in usermode. > > > > - Works for both softmmu and usermode > > > > Signed-off-by: Emilio G. Cota > > I think this is a duplicate of the existing run_on_cpu code. If needed > in user-mode emulation, it should be extracted out of cpus.c. They're similar, yes. > Also I think it is dangerous (prone to deadlocks) to wait for other CPUs > with synchronize_cpu and condvar. The key to avoid deadlocks is not to hold any locks that might be acquired within an RCU read critical section when calling synchronize_rcu(). The condvars are for the sleeping threads so that they can be woken up; sleepers don't call synchronize_rcu(). > I would much rather prefer to _halt_ > the CPUs if there is pending work, and keep it halted like this: > > static inline bool cpu_has_work(CPUState *cpu) > { > CPUClass *cc = CPU_GET_CLASS(cpu); > > + if (tcg_ctx.tb_ctx.tcg_has_work) { > + return false; > + } > g_assert(cc->has_work); > return cc->has_work(cpu); > } > > You can then run flush_queued_work from linux-user/main.c (and > bsd-user/main.c) when cpu_exec returns EXCP_HALTED. OK. Will try something like this. Emilio