Linux Container Development
 help / color / mirror / Atom feed
From: Oren Laadan <orenl-eQaUEPhvms7ENvBUuze7eA@public.gmane.org>
To: Nathan Lynch <ntl-e+AXbWqSrlAAvxtiuMwx3w@public.gmane.org>
Cc: Containers
	<containers-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org>,
	Sukadev Bhattiprolu
	<sukadev-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
Subject: Re: [PATCH] user-cr: invoke exit system call directly from ckpt_do_feeder
Date: Thu, 26 Nov 2009 10:10:15 -0500	[thread overview]
Message-ID: <4B0E9A57.4020501@cs.columbia.edu> (raw)
In-Reply-To: <1259108404.10928.3.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>



Nathan Lynch wrote:
> The feeder thread can cause the restart process to fail by indirectly
> calling exit_group, which sends SIGKILL to all other threads in the
> process.  If the feeder thread "wins" the race, the restart is
> disrupted.  A common symptom of this race is the coordinator task
> returning from the wait_for_completion_interruptible in
> wait_all_tasks_finish with a signal (the SIGKILL) pending.

So the clone mage page says:
  ...
  The main use of clone() is to implement threads: multiple threads
  of control in a program that run concurrently in a shared memory
  space.
  ...
  When the fn(arg) function application returns, the child process
  terminates. The integer returned by fn is the exit code for the
  child process.  The child process may also terminate explicitly by
  calling exit(2) or after receiving a fatal signal.
  ...
(http://www.kernel.org/doc/man-pages/online/pages/man2/__clone2.2.html)

I expected "terminates" here to mean invoke the syscall _exit().
Clearly this is desirable with CLONE_THREAD, but not for regular
processes that will want to proceed to the usual glibc exit path
(e.g. process at_exit() and what-not). Then again, the last thread
to exit should also call glibc's exit for the same reason. So
that's probably why it's handled this way.

This matters for us because our user-space wrapper to eclone()
should eventually do what the glibc's clone() wrapper does, instead
of calling _exit() directly as it is today...

???

Oren.

> 
> Calling _exit isn't enough; see
> http://www.kernel.org/doc/man-pages/online/pages/man2/exit.2.html#NOTES
> 
> Exit the feeder thread by using the syscall() macro.
> 
> Signed-off-by: Nathan Lynch <ntl-e+AXbWqSrlAAvxtiuMwx3w@public.gmane.org>
> ---
>  restart.c |   12 ++++++++++--
>  1 files changed, 10 insertions(+), 2 deletions(-)
> 
> diff --git a/restart.c b/restart.c
> index d5d069a..ed4268c 100644
> --- a/restart.c
> +++ b/restart.c
> @@ -2079,8 +2079,16 @@ static int ckpt_do_feeder(void *data)
>  		ckpt_read_write_inspect(ctx);
>  	else
>  		ckpt_read_write_blind(ctx);
> -		
> -	/* all is well: feeder thread is done */
> +
> +	/* All is well: feeder thread is done.  However, we must
> +	 * invoke the exit system call directly. Otherwise, upon
> +	 * return from this function, glibc's clone wrapper will call
> +	 * _exit, which calls exit_group, which will terminate the
> +	 * whole process, which is not what we want.
> +	 */
> +	syscall(SYS_exit, 0);
> +
> +	/* not reached */
>  	return 0;
>  }
>  

  parent reply	other threads:[~2009-11-26 15:10 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-11-25  0:20 [PATCH] user-cr: invoke exit system call directly from ckpt_do_feeder Nathan Lynch
     [not found] ` <1259108404.10928.3.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2009-11-25 18:35   ` Oren Laadan
2009-11-26 15:10   ` Oren Laadan [this message]
     [not found]     ` <4B0E9A57.4020501-eQaUEPhvms7ENvBUuze7eA@public.gmane.org>
2009-11-30 18:14       ` Nathan Lynch
     [not found]         ` <1259604874.6060.41.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2009-12-01  7:12           ` Oren Laadan

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=4B0E9A57.4020501@cs.columbia.edu \
    --to=orenl-eqauephvms7envbuuze7ea@public.gmane.org \
    --cc=containers-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org \
    --cc=ntl-e+AXbWqSrlAAvxtiuMwx3w@public.gmane.org \
    --cc=sukadev-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org \
    /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