[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 2/2] qemu-ga: Add the guest-suspend command
From: |
Jamie Lokier |
Subject: |
Re: [Qemu-devel] [PATCH 2/2] qemu-ga: Add the guest-suspend command |
Date: |
Tue, 17 Jan 2012 10:57:03 +0000 |
User-agent: |
Mutt/1.5.21 (2010-09-15) |
Eric Blake wrote:
> On 01/16/2012 03:51 AM, Jamie Lokier wrote:
> > I'm not sure if it's relevant to the this code, but on Glibc fork() is
> > not async-signal-safe and has been known to crash in signal handlers.
> > This is why fork() was removed from SUS async-signal-safe functions.
>
> fork() is still in the list of async-signal-safe functions [1];
You're right, but it looks like it may be removed in the next edition:
https://www.opengroup.org/austin/docs/austin_446.txt
> it was only pthread_atfork() which was removed.
I didn't think pthread_atfork() ever was async-signal-safe.
> That is, fork() is _required_
> to be async-signal-safe (and usable from signal handlers), provided that
> the actions following the fork also follow safety rules.
Nonethless, Glibc fork() isn't async-signal-safe even if it should be:
http://sourceware.org/bugzilla/show_bug.cgi?id=4737
> > In general, why is multithreadedness relevant to async-signal-safety here?
>
> Because POSIX 2008 (SUS inherits from POSIX, so it has the same
> restriction) states that if a multithreaded app calls fork, the child
> can only portably use async-signal-safe functions up until a successful
> exec or _exit. Even though the child is _not_ operating in a signal
> handler context, it _is_ operating in a context of a single thread where
> other threads from the parent may have been holding locks, and thus
> calling any unsafe function (that is, any function that tries to obtain
> a lock) may deadlock.
Somewhat confusing, when you have pthread_atfork() existing for the
entire purpose of allowing non-async-signal-safe functions, provided
the application isn't multithreaded, but libraries can be (I'm not
sure what the difference between application and library is in this
context).
http://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_atfork.html
It is suggested that programs that use fork() call an exec function
very soon afterwards in the child process, thus resetting all
states. In the meantime, only a short list of async-signal-safe
library routines are promised to be available.
Unfortunately, this solution does not address the needs of
multi-threaded libraries. Application programs may not be aware that a
multi-threaded library is in use, and they feel free to call any
number of library routines between the fork() and exec calls, just as
they always have. Indeed, they may be extant single-threaded programs
and cannot, therefore, be expected to obey new restrictions imposed by
the threads library.
> I don't know if qemu-ga is intended to be a multi-threaded app, so I
> don't know if being paranoid about async-signal-safety matters in this
> particular case, but I _do_ know that libvirt has encountered issues
> with using non-safe functions prior to exec, which is why it always
> raises red flags when I see unsafe code between fork and exec.
Quite right, I agree. :-)
-- Jamie
- Re: [Qemu-devel] [PATCH 2/2] qemu-ga: Add the guest-suspend command, (continued)
- Re: [Qemu-devel] [PATCH 2/2] qemu-ga: Add the guest-suspend command, Luiz Capitulino, 2012/01/16
- Re: [Qemu-devel] [PATCH 2/2] qemu-ga: Add the guest-suspend command, Michael Roth, 2012/01/16
- Re: [Qemu-devel] [PATCH 2/2] qemu-ga: Add the guest-suspend command, Daniel P. Berrange, 2012/01/16
- Re: [Qemu-devel] [PATCH 2/2] qemu-ga: Add the guest-suspend command, Michael Roth, 2012/01/16
- Re: [Qemu-devel] [PATCH 2/2] qemu-ga: Add the guest-suspend command, Jamie Lokier, 2012/01/17
- Re: [Qemu-devel] [PATCH 2/2] qemu-ga: Add the guest-suspend command, Eric Blake, 2012/01/16
- Re: [Qemu-devel] [PATCH 2/2] qemu-ga: Add the guest-suspend command, Luiz Capitulino, 2012/01/16
- Re: [Qemu-devel] [PATCH 2/2] qemu-ga: Add the guest-suspend command, Eric Blake, 2012/01/16
- Re: [Qemu-devel] [PATCH 2/2] qemu-ga: Add the guest-suspend command, Jamie Lokier, 2012/01/16
- Re: [Qemu-devel] [PATCH 2/2] qemu-ga: Add the guest-suspend command, Eric Blake, 2012/01/16
- Re: [Qemu-devel] [PATCH 2/2] qemu-ga: Add the guest-suspend command,
Jamie Lokier <=
- Re: [Qemu-devel] [PATCH 2/2] qemu-ga: Add the guest-suspend command, Eric Blake, 2012/01/18
[Qemu-devel] [PATCH 1/2] qemu-ga: set O_NONBLOCK for serial channels, Luiz Capitulino, 2012/01/13