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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.