On Thu, Aug 29, 2013 at 10:44:41AM -0500, Serge Hallyn wrote:
> Signalfd does not guarantee that we'll get an event for every signal.
> So if 3 tasks exit at the same time, we may get only one sigchld
> event.  Therefore, in signal_handler(), always check whether init has
> exited.  Do with with WNOWAIT so that we can still wait4 to cleanup
> the init after lxc_poll() exists (rather than complicating the code).
> 
> Note - there is still a race in the kernel which can cause the
> container init to become a defunct child of the host init (!).  This
> doesn't solve that, but is a potential (if very unlikely) race which
> apw pointed out while we were trying to create a reproducer for the
> kernel bug.
> 
> Signed-off-by: Serge Hallyn <serge.hal...@ubuntu.com>

Acked-by: Stéphane Graber <stgra...@ubuntu.com>

> ---
>  src/lxc/start.c | 15 ++++++++++++---
>  1 file changed, 12 insertions(+), 3 deletions(-)
> 
> diff --git a/src/lxc/start.c b/src/lxc/start.c
> index f552e35..a574a8d 100644
> --- a/src/lxc/start.c
> +++ b/src/lxc/start.c
> @@ -162,8 +162,10 @@ static int signal_handler(int fd, void *data,
>                          struct lxc_epoll_descr *descr)
>  {
>       struct signalfd_siginfo siginfo;
> +     siginfo_t info;
>       int ret;
>       pid_t *pid = data;
> +     bool init_died = false;
>  
>       ret = read(fd, &siginfo, sizeof(siginfo));
>       if (ret < 0) {
> @@ -176,16 +178,23 @@ static int signal_handler(int fd, void *data,
>               return -1;
>       }
>  
> +     // check whether init is running
> +     info.si_pid = 0;
> +     ret = waitid(P_PID, *pid, &info, WEXITED | WNOWAIT | WNOHANG);
> +     if (ret == 0 && info.si_pid == *pid) {
> +             init_died = true;
> +     }
> +
>       if (siginfo.ssi_signo != SIGCHLD) {
>               kill(*pid, siginfo.ssi_signo);
>               INFO("forwarded signal %d to pid %d", siginfo.ssi_signo, *pid);
> -             return 0;
> +             return init_died ? 1 : 0;
>       }
>  
>       if (siginfo.ssi_code == CLD_STOPPED ||
>           siginfo.ssi_code == CLD_CONTINUED) {
>               INFO("container init process was stopped/continued");
> -             return 0;
> +             return init_died ? 1 : 0;
>       }
>  
>       /* more robustness, protect ourself from a SIGCHLD sent
> @@ -193,7 +202,7 @@ static int signal_handler(int fd, void *data,
>        */
>       if (siginfo.ssi_pid != *pid) {
>               WARN("invalid pid for SIGCHLD");
> -             return 0;
> +             return init_died ? 1 : 0;
>       }
>  
>       DEBUG("container init process exited");
> -- 
> 1.8.3.2
> 
> 
> ------------------------------------------------------------------------------
> Learn the latest--Visual Studio 2012, SharePoint 2013, SQL 2012, more!
> Discover the easy way to master current and previous Microsoft technologies
> and advance your career. Get an incredible 1,500+ hours of step-by-step
> tutorial videos with LearnDevNow. Subscribe today and save!
> http://pubads.g.doubleclick.net/gampad/clk?id=58040911&iu=/4140/ostg.clktrk
> _______________________________________________
> Lxc-devel mailing list
> Lxc-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/lxc-devel

-- 
Stéphane Graber
Ubuntu developer
http://www.ubuntu.com

Attachment: signature.asc
Description: Digital signature

------------------------------------------------------------------------------
Learn the latest--Visual Studio 2012, SharePoint 2013, SQL 2012, more!
Discover the easy way to master current and previous Microsoft technologies
and advance your career. Get an incredible 1,500+ hours of step-by-step
tutorial videos with LearnDevNow. Subscribe today and save!
http://pubads.g.doubleclick.net/gampad/clk?id=58040911&iu=/4140/ostg.clktrk
_______________________________________________
Lxc-devel mailing list
Lxc-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/lxc-devel

Reply via email to