From: Manfred Spraul <manfred@colorfullife.com>
To: Rod Stewart <stewart@dystopia.lab43.org>
Cc: linux-kernel@vger.kernel.org, Alan Cox <alan@lxorguk.ukuu.org.uk>,
Andreas Ferber <aferber@techfak.uni-bielefeld.de>
Subject: [new PATCH] Re: 8139too: defunct threads
Date: Sun, 15 Apr 2001 15:06:44 +0200 [thread overview]
Message-ID: <3AD99CE4.E1ED7090@colorfullife.com> (raw)
In-Reply-To: <Pine.LNX.4.33.0104150100210.13758-100000@dystopia.lab43.org>
[-- Attachment #1: Type: text/plain, Size: 801 bytes --]
I found the problem:
* init uses waitpid(-1,,), thus the __WALL flag is not set
* without __WALL, only processes with exit_signal == SIGCHLD are reaped
* it's impossible for user space processes to die with another
exit_signal, forget_original_parent changes the exit_signal back to
SIGCHLD ("We dont want people slaying init"), and init itself doesn't
use clone.
* kernel threads can die with an arbitrary exit_signal.
Alan, which fix would you prefer:
* init could use wait3 and set __WALL.
* all kernel thread users could set SIGCHLD. Some already do that
(__call_usermodehelper).
* the kernel_thread implementations could force the exit signal to
SIGCHLD.
I'd prefer the last version.
The attached patch is tested with i386. The alpha, parisc and ppc
assember changes are guessed.
--
Manfred
[-- Attachment #2: patch-child --]
[-- Type: text/plain, Size: 6794 bytes --]
diff -ur 2.4/arch/alpha/kernel/entry.S build-2.4/arch/alpha/kernel/entry.S
--- 2.4/arch/alpha/kernel/entry.S Sun Sep 3 20:36:45 2000
+++ build-2.4/arch/alpha/kernel/entry.S Sun Apr 15 14:58:01 2001
@@ -242,12 +242,12 @@
subq $30,4*8,$30
stq $10,16($30)
stq $9,8($30)
- lda $0,CLONE_VM
+ lda $0,CLONE_VM|SIGCHLD
stq $26,0($30)
.prologue 1
mov $16,$9 /* save fn */
mov $17,$10 /* save arg */
- or $18,$0,$16 /* shuffle flags to front; add CLONE_VM. */
+ or $18,$0,$16 /* shuffle flags to front; add CLONE_VM|SIGCHLD. */
bsr $26,kernel_clone
bne $20,1f /* $20 is non-zero in child */
ldq $26,0($30)
diff -ur 2.4/arch/arm/kernel/process.c build-2.4/arch/arm/kernel/process.c
--- 2.4/arch/arm/kernel/process.c Thu Feb 22 22:28:51 2001
+++ build-2.4/arch/arm/kernel/process.c Sun Apr 15 14:51:08 2001
@@ -368,6 +368,8 @@
{
pid_t __ret;
+ flags |= SIGCHLD;
+
__asm__ __volatile__(
"orr r0, %1, %2 @ kernel_thread sys_clone
mov r1, #0
diff -ur 2.4/arch/cris/kernel/process.c build-2.4/arch/cris/kernel/process.c
--- 2.4/arch/cris/kernel/process.c Sat Apr 7 22:01:49 2001
+++ build-2.4/arch/cris/kernel/process.c Sun Apr 15 14:51:16 2001
@@ -127,6 +127,8 @@
int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
{
register long __a __asm__ ("r10");
+
+ flags |= SIGCHLD;
__asm__ __volatile__
("movu.w %1,r9\n\t" /* r9 contains syscall number, to sys_clone */
diff -ur 2.4/arch/i386/kernel/process.c build-2.4/arch/i386/kernel/process.c
--- 2.4/arch/i386/kernel/process.c Thu Feb 22 22:28:52 2001
+++ build-2.4/arch/i386/kernel/process.c Sun Apr 15 14:40:43 2001
@@ -440,6 +440,8 @@
{
long retval, d0;
+ flags |= SIGCHLD;
+
__asm__ __volatile__(
"movl %%esp,%%esi\n\t"
"int $0x80\n\t" /* Linux/i386 system call */
diff -ur 2.4/arch/ia64/kernel/process.c build-2.4/arch/ia64/kernel/process.c
--- 2.4/arch/ia64/kernel/process.c Thu Jan 4 21:50:17 2001
+++ build-2.4/arch/ia64/kernel/process.c Sun Apr 15 14:51:44 2001
@@ -500,7 +500,7 @@
struct task_struct *parent = current;
int result, tid;
- tid = clone(flags | CLONE_VM, 0);
+ tid = clone(flags | CLONE_VM | SIGCHLD, 0);
if (parent != current) {
result = (*fn)(arg);
_exit(result);
diff -ur 2.4/arch/m68k/kernel/process.c build-2.4/arch/m68k/kernel/process.c
--- 2.4/arch/m68k/kernel/process.c Thu Feb 22 22:28:54 2001
+++ build-2.4/arch/m68k/kernel/process.c Sun Apr 15 14:51:58 2001
@@ -135,7 +135,7 @@
{
register long retval __asm__ ("d0");
- register long clone_arg __asm__ ("d1") = flags | CLONE_VM;
+ register long clone_arg __asm__ ("d1") = flags | CLONE_VM | SIGCHLD;
__asm__ __volatile__
("clrl %%d2\n\t"
diff -ur 2.4/arch/mips/kernel/process.c build-2.4/arch/mips/kernel/process.c
--- 2.4/arch/mips/kernel/process.c Sat Apr 7 22:01:56 2001
+++ build-2.4/arch/mips/kernel/process.c Sun Apr 15 14:52:12 2001
@@ -161,6 +161,8 @@
{
long retval;
+ flags |= SIGCHLD;
+
__asm__ __volatile__(
".set\tnoreorder\n\t"
"move\t$6,$sp\n\t"
diff -ur 2.4/arch/mips64/kernel/process.c build-2.4/arch/mips64/kernel/process.c
--- 2.4/arch/mips64/kernel/process.c Thu Feb 22 22:28:55 2001
+++ build-2.4/arch/mips64/kernel/process.c Sun Apr 15 14:52:21 2001
@@ -154,6 +154,8 @@
{
int retval;
+ flags |= SIGCHLD;
+
__asm__ __volatile__(
"move\t$6, $sp\n\t"
"move\t$4, %5\n\t"
diff -ur 2.4/arch/parisc/kernel/entry.S build-2.4/arch/parisc/kernel/entry.S
--- 2.4/arch/parisc/kernel/entry.S Sat Apr 7 22:01:58 2001
+++ build-2.4/arch/parisc/kernel/entry.S Sun Apr 15 14:56:58 2001
@@ -497,7 +497,7 @@
#endif
STREG %r26, PT_GR26(%r1) /* Store function & argument for child */
STREG %r25, PT_GR25(%r1)
- ldo CLONE_VM(%r0), %r26 /* Force CLONE_VM since only init_mm */
+ ldo SIGCHLD|CLONE_VM(%r0), %r26 /* Force CLONE_VM since only init_mm */
or %r26, %r24, %r26 /* will have kernel mappings. */
copy %r0, %r25
bl do_fork, %r2
diff -ur 2.4/arch/ppc/kernel/misc.S build-2.4/arch/ppc/kernel/misc.S
--- 2.4/arch/ppc/kernel/misc.S Sat Apr 7 22:01:59 2001
+++ build-2.4/arch/ppc/kernel/misc.S Sun Apr 15 14:56:17 2001
@@ -1080,7 +1080,7 @@
*/
_GLOBAL(kernel_thread)
mr r6,r3 /* function */
- ori r3,r5,CLONE_VM /* flags */
+ ori r3,r5,CLONE_VM|SIGCHLD /* flags */
li r0,__NR_clone
sc
cmpi 0,r3,0 /* parent or child? */
diff -ur 2.4/arch/s390/kernel/process.c build-2.4/arch/s390/kernel/process.c
--- 2.4/arch/s390/kernel/process.c Thu Feb 22 22:28:57 2001
+++ build-2.4/arch/s390/kernel/process.c Sun Apr 15 14:52:58 2001
@@ -242,7 +242,7 @@
int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
{
- int clone_arg = flags | CLONE_VM;
+ int clone_arg = flags | CLONE_VM | SIGCHLD;
int retval;
__asm__ __volatile__(
diff -ur 2.4/arch/s390x/kernel/process.c build-2.4/arch/s390x/kernel/process.c
--- 2.4/arch/s390x/kernel/process.c Thu Feb 22 22:28:57 2001
+++ build-2.4/arch/s390x/kernel/process.c Sun Apr 15 14:53:06 2001
@@ -242,7 +242,7 @@
int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
{
- int clone_arg = flags | CLONE_VM;
+ int clone_arg = flags | CLONE_VM | SIGCHLD;
int retval;
__asm__ __volatile__(
diff -ur 2.4/arch/sh/kernel/process.c build-2.4/arch/sh/kernel/process.c
--- 2.4/arch/sh/kernel/process.c Thu Feb 22 22:28:57 2001
+++ build-2.4/arch/sh/kernel/process.c Sun Apr 15 14:53:16 2001
@@ -148,7 +148,7 @@
{ /* Don't use this in BL=1(cli). Or else, CPU resets! */
register unsigned long __sc0 __asm__ ("r0");
register unsigned long __sc3 __asm__ ("r3") = __NR_clone;
- register unsigned long __sc4 __asm__ ("r4") = (long) flags | CLONE_VM;
+ register unsigned long __sc4 __asm__ ("r4") = (long) flags | CLONE_VM | SIGCHLD;
register unsigned long __sc5 __asm__ ("r5") = 0;
register unsigned long __sc8 __asm__ ("r8") = (long) arg;
register unsigned long __sc9 __asm__ ("r9") = (long) fn;
diff -ur 2.4/arch/sparc/kernel/process.c build-2.4/arch/sparc/kernel/process.c
--- 2.4/arch/sparc/kernel/process.c Thu Feb 22 22:28:57 2001
+++ build-2.4/arch/sparc/kernel/process.c Sun Apr 15 14:53:39 2001
@@ -678,6 +678,8 @@
{
long retval;
+ flags |= SIGCHLD;
+
__asm__ __volatile("mov %4, %%g2\n\t" /* Set aside fn ptr... */
"mov %5, %%g3\n\t" /* and arg. */
"mov %1, %%g1\n\t"
diff -ur 2.4/arch/sparc64/kernel/process.c build-2.4/arch/sparc64/kernel/process.c
--- 2.4/arch/sparc64/kernel/process.c Sat Mar 31 21:47:37 2001
+++ build-2.4/arch/sparc64/kernel/process.c Sun Apr 15 14:53:49 2001
@@ -647,6 +647,8 @@
{
long retval;
+ flags |= SIGCHLD;
+
/* If the parent runs before fn(arg) is called by the child,
* the input registers of this function can be clobbered.
* So we stash 'fn' and 'arg' into global registers which
next prev parent reply other threads:[~2001-04-15 13:08 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2001-04-14 14:00 8139too: defunct threads Manfred Spraul
2001-04-14 16:21 ` Rod Stewart
2001-04-14 17:33 ` [PATCH] " Manfred Spraul
2001-04-14 18:53 ` Alan Cox
2001-04-14 21:43 ` Manfred Spraul
2001-04-15 5:08 ` Rod Stewart
2001-04-15 13:06 ` Manfred Spraul [this message]
2001-04-15 22:01 ` [new PATCH] " Rod Stewart
2001-04-16 17:00 ` Andrew Morton
2001-04-16 19:42 ` John Fremlin
2001-04-16 19:59 ` Andrew Morton
2001-04-14 23:29 ` [PATCH] " Andreas Ferber
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=3AD99CE4.E1ED7090@colorfullife.com \
--to=manfred@colorfullife.com \
--cc=aferber@techfak.uni-bielefeld.de \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=linux-kernel@vger.kernel.org \
--cc=stewart@dystopia.lab43.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.