From: Anthony Liguori <anthony@codemonkey.ws>
To: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
Cc: Kevin Wolf <kwolf@redhat.com>,
Anthony Liguori <aliguori@us.ibm.com>,
qemu-devel@nongnu.org, Paolo Bonzini <pbonzini@redhat.com>,
Venkateswararao Jujjuri <jvrao@linux.vnet.ibm.com>
Subject: Re: [Qemu-devel] [PATCH 1/2] coroutine: introduce coroutines
Date: Tue, 24 May 2011 16:22:19 -0500 [thread overview]
Message-ID: <4DDC218B.6060907@codemonkey.ws> (raw)
In-Reply-To: <20110524195812.GA13211@stefanha-thinkpad.localdomain>
On 05/24/2011 02:58 PM, Stefan Hajnoczi wrote:
> On Tue, May 24, 2011 at 08:37:50PM +0100, Jamie Lokier wrote:
>> Daniel P. Berrange wrote:
>>> On Wed, May 11, 2011 at 03:45:39PM +0200, Paolo Bonzini wrote:
>>>> On 05/11/2011 03:05 PM, Anthony Liguori wrote:
>>>>>>
>>>>>> A very slow way, too (on Windows at least if you use qemu_cond...).
>>>>>
>>>>> That doesn't mean you can't do a fiber implementation for Windows... but
>>>>> having a highly portable fallback is a good thing.
>>>>
>>>> I agree but where would you place it, since QEMU is only portable to
>>>> POSIX and Windows?
>>>>
>>>> osdep-$(CONFIG_POSIX) += coroutine-posix.c
>>>> osdep-$(CONFIG_WIN32) += coroutine-win32.c
>>>> osdep-??? += coroutine-fallback.c
>>>
>>> NetBSD forbids the use of 'makecontext' in any application
>>> which also links to libpthread.so[1]. We used makecontext in
>>> GTK-VNC's coroutines and got random crashes in threaded
>>> apps running on NetBSD. So for NetBSD we tell people to use
>>> the thread based coroutines instead.
>>
>> You have to use swapcontext(), no wait, you have to use setjmp(), no wait,
>> _setjmp(), no wait, threads.... Read on.
>>
>> From Glibc's FAQ, setjmp/longjmp are not portable choices:
>>
>> - UNIX provides no other (portable) way of effecting a synchronous
>> context switch (also known as co-routine switch). Some versions
>> support this via setjmp()/longjmp() but this does not work
>> universally.
>>
>> So in principle you should use swapcontext() in portable code.
>>
>> (By the way, Glibc goes on about how it won't support swapcontext()
>> from async signal handlers, i.e. preemption, on some architectures
>> (IA-64/S-390), and I know it has been very subtly broken from a signal
>> handler on ARM. Fair enough, somehow disappointing, but doesn't
>> matter for QEMU coroutines.)
>>
>> But swapcontext() etc. have been withdrawn from POSIX 2008:
>>
>> - Functions to be deleted
>>
>> Legacy: Delete all legacy functions except utimes (which should not be legacy).
>> OB: Default position is to delete all OB functions.
>>
>> XSI Functions to change state
>>
>> ....
>> _setjmp and _longjmp. Should become obsolete.
>> ....
>> getcontext, setcontext, makecontext and swapcontext are already
>> marked OB and should be withdrawn. And header file<ucontext.h>.
>>
>> OB means obsolescent. They were marked obsolescent a few versions
>> prior, with the rationale that you can use threads instead...
>
> Yep, aware of this but at the end of the day these functions are
> commonly available.
>
>> It's not surprising that NetBSD forbids makecontext() with
>> libpthread.so. I suspect old versions of FreeBSD, OpenBSD, DragonFly
>> BSD, (and Mac OS X?), have the same restriction, because they have a
>> similar pthreads evolutionary history to LinuxThreads. LinuxThreads
>> also breaks when using coroutines that switch stacks, because it uses
>> the stack pointer to know the current thread.
>>
>> (LinuxThreads is old now, but that particular quirk still affects me
>> because some uCLinux platforms, on which I wish to use coroutines, still
>> don't have working NPTL - but they aren't likely to be running QEMU :-)
>
> That is nasty.
>
>> Finally, if you are using setjmp/longjmp, consider (from FreeBSD man page):
>>
>> The setjmp()/longjmp() pairs save and restore the signal mask
>> while _setjmp()/_longjmp() pairs save and restore only the
>> register set and the stack. (See sigprocmask(2).)
>>
>> As setjmp/longjmp were chosen for performance, you may wish to use
>> _setjmp/_longjmp instead (when available), as swizzling the signal
>> mask on each switch may involve a system call and be rather slow.
>
> Thanks, I read about that but didn't try to implement special cases
> because I don't have relevant OSes here to test against.
>
> My current plan is to try using sigaltstack(2) instead of
> makecontext()/swapcontext() as a hack since OpenBSD doesn't have
> makecontext()/swapcontext().
>
> TBH I'm almost at the stage where I think we should just use threads
> and/or async callbacks, as appropriate. Hopefully I'll be able to cook
> up a reasonably portable implementation of coroutines though, because
> the prospect of having to go fully threaded or do async callbacks isn't
> attractive in many cases.
I'm meant to say threads as a coroutine fallback.
Regards,
Anthony Liguori
>
> Stefan
>
next prev parent reply other threads:[~2011-05-24 21:22 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-05-11 10:15 [Qemu-devel] [PATCH 0/2] Coroutines for better asynchronous programming Stefan Hajnoczi
2011-05-11 10:15 ` [Qemu-devel] [PATCH 1/2] coroutine: introduce coroutines Stefan Hajnoczi
2011-05-11 11:20 ` Kevin Wolf
2011-05-11 12:04 ` Paolo Bonzini
2011-05-11 12:15 ` Kevin Wolf
2011-05-11 12:51 ` Anthony Liguori
2011-05-11 12:52 ` Paolo Bonzini
2011-05-11 13:05 ` Anthony Liguori
2011-05-11 13:45 ` Paolo Bonzini
2011-05-11 13:51 ` Daniel P. Berrange
2011-05-24 19:37 ` Jamie Lokier
2011-05-24 19:58 ` Stefan Hajnoczi
2011-05-24 20:51 ` Jamie Lokier
2011-05-25 7:09 ` Stefan Hajnoczi
2011-05-25 18:54 ` Richard Henderson
2011-05-24 21:21 ` Anthony Liguori
2011-05-25 7:32 ` Paolo Bonzini
2011-05-24 21:22 ` Anthony Liguori [this message]
2011-05-25 11:43 ` Bastien ROUCARIES
2011-05-11 12:36 ` Anthony Liguori
2011-05-11 12:46 ` Paolo Bonzini
2011-05-11 12:54 ` Stefan Hajnoczi
2011-05-11 13:08 ` Kevin Wolf
2011-05-11 19:12 ` Stefan Weil
2011-05-12 7:59 ` Kevin Wolf
2011-05-12 9:51 ` Jan Kiszka
2011-05-12 9:59 ` Stefan Hajnoczi
2011-05-24 19:54 ` Jamie Lokier
2011-05-12 10:02 ` Kevin Wolf
2011-05-11 10:15 ` [Qemu-devel] [PATCH 2/2] coroutine: add check-coroutine automated tests Stefan Hajnoczi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4DDC218B.6060907@codemonkey.ws \
--to=anthony@codemonkey.ws \
--cc=aliguori@us.ibm.com \
--cc=jvrao@linux.vnet.ibm.com \
--cc=kwolf@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@linux.vnet.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).