Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 12 Dec 2016 11:11:50 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r309886 - head/sys/kern
Message-ID:  <201612121111.uBCBBoE3086826@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kib
Date: Mon Dec 12 11:11:50 2016
New Revision: 309886
URL: https://svnweb.freebsd.org/changeset/base/309886

Log:
  When a zombie gets reparented due to the parent exit, send SIGCHLD to
  the reaper.
  
  The traditional reaper init(8) is aware of zombies silently reparented
  to it after the parents exit, it loops around waitpid(2) to collect
  them.  For other reapers, the silent reparenting is surprising and
  collecting zombies requires a thread blocking in waitpid(2) just for
  that purpose.  It seems that sending second SIGCHLD is a better
  workaround than forcing all reapers to obey the setup.
  
  Reported by:	 Michael Zuo <muh.muhten@gmail.com>, jilles
  PR:	213928
  Reviewed by:	jilles (previous version)
  Sponsored by:	The FreeBSD Foundation
  MFC after:	2 weeks

Modified:
  head/sys/kern/kern_exit.c

Modified: head/sys/kern/kern_exit.c
==============================================================================
--- head/sys/kern/kern_exit.c	Mon Dec 12 11:04:22 2016	(r309885)
+++ head/sys/kern/kern_exit.c	Mon Dec 12 11:11:50 2016	(r309886)
@@ -455,6 +455,11 @@ exit1(struct thread *td, int rval, int s
 
 		if (!(q->p_flag & P_TRACED)) {
 			proc_reparent(q, q->p_reaper);
+			if (q->p_state == PRS_ZOMBIE) {
+				PROC_LOCK(q->p_reaper);
+				pksignal(q->p_reaper, SIGCHLD, q->p_ksi);
+				PROC_UNLOCK(q->p_reaper);
+			}
 		} else {
 			/*
 			 * Traced processes are killed since their existence



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201612121111.uBCBBoE3086826>