lkml.org 
[lkml]   [2002]   [May]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
Subject[PATCH 2.5] Thread group exit problem reappeared

A long time ago there was thread group code that at exit time tried to
reparent a task to another task in the thread group. I discovered a major
race condition in this code, and submitted a patch that removed it. This
patch was accepted in, I think, 2.4.12. The code reappeared in 2.4.18 and
sometime in the 2.5 tree before 2.5.15, breaking applications that use
thread groups.

As part of chasing this down, I figured out a way to remove the race
condition while still preserving this behavior. I've attached a patch
against 2.5.15 that fixes it.

My apologies for including it as an attachment, but it appears to be the
only feasible way to keep my mail client from trashing it.

Dave McCracken

======================================================================
Dave McCracken IBM Linux Base Kernel Team 1-512-838-3059
dmccr@us.ibm.com T/L 678-3059
--- linux-2.5.15-orig/./kernel/exit.c Thu May 9 17:23:28 2002
+++ linux-2.5.15-reparent/./kernel/exit.c Fri May 10 13:35:50 2002
@@ -231,7 +231,7 @@

/*
* When we die, we re-parent all our children.
- * Try to give them to another thread in our process
+ * Try to give them to another thread in our thread
* group, and if no such member exists, give it to
* the global child reaper process (ie "init")
*/
@@ -241,8 +241,14 @@

read_lock(&tasklist_lock);

- /* Next in our thread group */
- reaper = next_thread(father);
+ /* Next in our thread group, if they're not already exiting */
+ reaper = father;
+ do {
+ reaper = next_thread(reaper);
+ if (!(reaper->flags & PF_EXITING))
+ break;
+ } while (reaper != father);
+
if (reaper == father)
reaper = child_reaper;
\
 
 \ /
  Last update: 2005-03-22 13:26    [W:0.032 / U:0.380 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site