From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=51477 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Pi7np-00089T-3a for qemu-devel@nongnu.org; Wed, 26 Jan 2011 11:01:22 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Pi7nO-0001kF-GL for qemu-devel@nongnu.org; Wed, 26 Jan 2011 11:01:01 -0500 Received: from e36.co.us.ibm.com ([32.97.110.154]:59567) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Pi7nO-0001jY-AZ for qemu-devel@nongnu.org; Wed, 26 Jan 2011 11:00:34 -0500 Received: from d03relay04.boulder.ibm.com (d03relay04.boulder.ibm.com [9.17.195.106]) by e36.co.us.ibm.com (8.14.4/8.13.1) with ESMTP id p0QFtU5m016297 for ; Wed, 26 Jan 2011 08:55:30 -0700 Received: from d03av01.boulder.ibm.com (d03av01.boulder.ibm.com [9.17.195.167]) by d03relay04.boulder.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id p0QG0CJT016372 for ; Wed, 26 Jan 2011 09:00:13 -0700 Received: from d03av01.boulder.ibm.com (loopback [127.0.0.1]) by d03av01.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id p0QG0CHZ011086 for ; Wed, 26 Jan 2011 09:00:12 -0700 Message-ID: <4D40450B.3070705@linux.vnet.ibm.com> Date: Wed, 26 Jan 2011 10:00:11 -0600 From: Anthony Liguori MIME-Version: 1.0 Subject: Re: [Qemu-devel] [RFC][PATCH 01/12] coroutine: Add gtk-vnc coroutines library References: <1295688567-25496-1-git-send-email-stefanha@linux.vnet.ibm.com> <1295688567-25496-2-git-send-email-stefanha@linux.vnet.ibm.com> <4D403CF3.8080102@redhat.com> In-Reply-To: <4D403CF3.8080102@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Avi Kivity Cc: Kevin Wolf , Anthony Liguori , Stefan Hajnoczi , qemu-devel@nongnu.org On 01/26/2011 09:25 AM, Avi Kivity wrote: > On 01/22/2011 11:29 AM, Stefan Hajnoczi wrote: >> Asynchronous image format code is becoming very complex. Let's try >> using coroutines to write sequential code without callbacks but use >> coroutines to switch stacks under the hood. >> >> >> + >> +int cc_swap(struct continuation *from, struct continuation *to) >> +{ >> + to->exited = 0; >> + if (getcontext(&to->last) == -1) >> + return -1; >> + else if (to->exited == 0) >> + to->exited = 1; >> + else if (to->exited == 1) >> + return 1; >> + >> + return swapcontext(&from->uc,&to->uc); >> +} > > swapcontext() is very slow, involving the fpu and a syscall. > > A nice trick I've used in the past is to use getcontext/makecontext > for the initial setup and setjmp/longjmp for switching. Of course > this can be done later, as an optimization. Yeah, there are further optimizations that can be had but really, it's not important here. In fact, I'd rather start with the threaded version just because it's far more portable than ucontext. Regards, Anthony Liguori