Re: [new PATCH] Re: 8139too: defunct threads

2001-04-16 Thread Andrew Morton

John Fremlin wrote:
> 
> 
> > So it seems that we must reparent the thread to init, and
> > make sure that it delivers SIGCHLD to init when it exits.
> 
> Sounds good. Why isn't SIGCHLD a stronger default anyway.

mm?   The caller gets to choose...

> [...]
> 
> > + /* Set the exit signal to SIGCHLD so we signal init on exit */
> > + if (this_task->exit_signal ! 0) {
> 
> Tyop.

aargh.  Thanks.  So that's what `cvs commit' does :)

The patch is OK with this converted into `!='.  But I'll
refresh and retest for tomorrow.  Still not very happy with
this approach though...
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/



Re: [new PATCH] Re: 8139too: defunct threads

2001-04-16 Thread John Fremlin

 Andrew Morton <[EMAIL PROTECTED]> writes:

[...]

> None of these will work.  The problems with globally setting
> exit_signal to SIGCHLD are that
> 
> a) If the parent does waitpid(pid, status, __WCLONE), the
>waitpid will fail.  request_module() does this.  I don't
>know _why_ it does this.  Maybe it's bogus.  There is no
>explanation.

waitpid doesn't work on cloned children unless you put in __WCLONE or
__WALL, so this was necessary to catch the child at all. If you set to
use SIGCHLD this will no longer be needed (if I understand correctly).

[...]

> So it seems that we must reparent the thread to init, and
> make sure that it delivers SIGCHLD to init when it exits.

Sounds good. Why isn't SIGCHLD a stronger default anyway.

[...]

> + /* Set the exit signal to SIGCHLD so we signal init on exit */
> + if (this_task->exit_signal ! 0) {

Tyop.

> + printk(KERN_ERR "task `%s' exit_signal %d in daemonize()\n",
> + this_task->comm, this_task->exit_signal);
> + }
> + this_task->exit_signal = SIGCHLD;
> +
> + write_unlock_irq(_lock);
>  }
>  
>  void __init init_idle(void)
> 

-- 

http://www.penguinpowered.com/~vii
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/



Re: [new PATCH] Re: 8139too: defunct threads

2001-04-16 Thread Andrew Morton

Manfred Spraul wrote:
> 
> 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.

yep

> 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.

* Add SIGCHLD to all the users of kernel_thread(), in the cases
  where the thread can ever exit.

* Add
if (current->exit_signal == 0)
current->exit_signal = SIGCHLD;
  to daemonize().

None of these will work.  The problems with globally setting exit_signal
to SIGCHLD are that

a) If the parent does waitpid(pid, status, __WCLONE), the
   waitpid will fail.  request_module() does this.  I don't
   know _why_ it does this.  Maybe it's bogus.  There is no
   explanation.

b) When the kernel thread exits, it will send a SIGCHLD to
   its parent.  But the parent is not necessarily init!  It
   could be a userspace process (in this case, ifconfig).
   The kernel has no business spraying signals out to userspace
   tasks just because they happened to open a network interface.

   And for this reason we can't just go in and change 8139too.c
   to use SIGCHLD.

So it seems that we must reparent the thread to init, and
make sure that it delivers SIGCHLD to init when it exits.

The below patch does this, within daemonize().  But this precise
area was the source of serial screwups when I was doing the
call_usermodehelper() stuff, and I bet this approach will
still have problems.

The exit_files() will take care of releasing things like current->tty
and pwd.  But we still do not know what scheduling priority and policy
we inherited from the userspace parent, nor do we know what signal mask
we have, nor do we know what uid we're running as.  Resource limits.
Capabilties.  CPU mask.  Etcetera, etcetera.  All this stuff comes back
to bite.  Been there, got the scars :)

This is why I believe that kernel daemons should be launched by
keventd.  They belong to the *kernel*, not to userspace parents.



--- linux-2.4.4-pre3/kernel/sched.c Sun Apr 15 15:34:25 2001
+++ linux-akpm/kernel/sched.c   Sun Apr 15 21:59:26 2001
@@ -1260,32 +1260,53 @@
 /*
  * Put all the gunge required to become a kernel thread without
  * attached user resources in one place where it belongs.
+ *
+ * Kernel 2.4.4-pre3, [EMAIL PROTECTED]: reparent the caller
+ * to init and set the exit signal to SIGCHLD so the thread
+ * will be properly reaped if it exits.
  */
 
 void daemonize(void)
 {
struct fs_struct *fs;
-
+   struct task_struct *this_task = current;
 
/*
 * If we were started as result of loading a module, close all of the
 * user space pages.  We don't need them, and if we didn't close them
 * they would be locked into memory.
 */
-   exit_mm(current);
+   exit_mm(this_task);
 
-   current->session = 1;
-   current->pgrp = 1;
+   this_task->session = 1;
+   this_task->pgrp = 1;
 
/* Become as one with the init task */
 
-   exit_fs(current);   /* current->fs->count--; */
+   exit_fs(this_task); /* this_task->fs->count--; */
fs = init_task.fs;
-   current->fs = fs;
+   this_task->fs = fs;
atomic_inc(>count);
-   exit_files(current);
-   current->files = init_task.files;
-   atomic_inc(>files->count);
+   exit_files(this_task);
+   this_task->files = init_task.files;
+   atomic_inc(_task->files->count);
+
+   write_lock_irq(_lock);
+
+   /* Reparent to init */
+   REMOVE_LINKS(this_task);
+   this_task->p_opptr = child_reaper;
+   this_task->p_pptr = child_reaper;
+   SET_LINKS(this_task);
+
+   /* Set the exit signal to SIGCHLD so we signal init on exit */
+   if (this_task->exit_signal ! 0) {
+   printk(KERN_ERR "task `%s' exit_signal %d in daemonize()\n",
+   this_task->comm, this_task->exit_signal);
+   }
+   this_task->exit_signal = SIGCHLD;
+
+   write_unlock_irq(_lock);
 }
 
 void __init init_idle(void)
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/



Re: [new PATCH] Re: 8139too: defunct threads

2001-04-16 Thread Andrew Morton

Manfred Spraul wrote:
 
 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.

yep

 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.

* Add SIGCHLD to all the users of kernel_thread(), in the cases
  where the thread can ever exit.

* Add
if (current-exit_signal == 0)
current-exit_signal = SIGCHLD;
  to daemonize().

None of these will work.  The problems with globally setting exit_signal
to SIGCHLD are that

a) If the parent does waitpid(pid, status, __WCLONE), the
   waitpid will fail.  request_module() does this.  I don't
   know _why_ it does this.  Maybe it's bogus.  There is no
   explanation.

b) When the kernel thread exits, it will send a SIGCHLD to
   its parent.  But the parent is not necessarily init!  It
   could be a userspace process (in this case, ifconfig).
   The kernel has no business spraying signals out to userspace
   tasks just because they happened to open a network interface.

   And for this reason we can't just go in and change 8139too.c
   to use SIGCHLD.

So it seems that we must reparent the thread to init, and
make sure that it delivers SIGCHLD to init when it exits.

The below patch does this, within daemonize().  But this precise
area was the source of serial screwups when I was doing the
call_usermodehelper() stuff, and I bet this approach will
still have problems.

The exit_files() will take care of releasing things like current-tty
and pwd.  But we still do not know what scheduling priority and policy
we inherited from the userspace parent, nor do we know what signal mask
we have, nor do we know what uid we're running as.  Resource limits.
Capabilties.  CPU mask.  Etcetera, etcetera.  All this stuff comes back
to bite.  Been there, got the scars :)

This is why I believe that kernel daemons should be launched by
keventd.  They belong to the *kernel*, not to userspace parents.



--- linux-2.4.4-pre3/kernel/sched.c Sun Apr 15 15:34:25 2001
+++ linux-akpm/kernel/sched.c   Sun Apr 15 21:59:26 2001
@@ -1260,32 +1260,53 @@
 /*
  * Put all the gunge required to become a kernel thread without
  * attached user resources in one place where it belongs.
+ *
+ * Kernel 2.4.4-pre3, [EMAIL PROTECTED]: reparent the caller
+ * to init and set the exit signal to SIGCHLD so the thread
+ * will be properly reaped if it exits.
  */
 
 void daemonize(void)
 {
struct fs_struct *fs;
-
+   struct task_struct *this_task = current;
 
/*
 * If we were started as result of loading a module, close all of the
 * user space pages.  We don't need them, and if we didn't close them
 * they would be locked into memory.
 */
-   exit_mm(current);
+   exit_mm(this_task);
 
-   current-session = 1;
-   current-pgrp = 1;
+   this_task-session = 1;
+   this_task-pgrp = 1;
 
/* Become as one with the init task */
 
-   exit_fs(current);   /* current-fs-count--; */
+   exit_fs(this_task); /* this_task-fs-count--; */
fs = init_task.fs;
-   current-fs = fs;
+   this_task-fs = fs;
atomic_inc(fs-count);
-   exit_files(current);
-   current-files = init_task.files;
-   atomic_inc(current-files-count);
+   exit_files(this_task);
+   this_task-files = init_task.files;
+   atomic_inc(this_task-files-count);
+
+   write_lock_irq(tasklist_lock);
+
+   /* Reparent to init */
+   REMOVE_LINKS(this_task);
+   this_task-p_opptr = child_reaper;
+   this_task-p_pptr = child_reaper;
+   SET_LINKS(this_task);
+
+   /* Set the exit signal to SIGCHLD so we signal init on exit */
+   if (this_task-exit_signal ! 0) {
+   printk(KERN_ERR "task `%s' exit_signal %d in daemonize()\n",
+   this_task-comm, this_task-exit_signal);
+   }
+   this_task-exit_signal = SIGCHLD;
+
+   write_unlock_irq(tasklist_lock);
 }
 
 void __init init_idle(void)
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/



Re: [new PATCH] Re: 8139too: defunct threads

2001-04-16 Thread John Fremlin

 Andrew Morton [EMAIL PROTECTED] writes:

[...]

 None of these will work.  The problems with globally setting
 exit_signal to SIGCHLD are that
 
 a) If the parent does waitpid(pid, status, __WCLONE), the
waitpid will fail.  request_module() does this.  I don't
know _why_ it does this.  Maybe it's bogus.  There is no
explanation.

waitpid doesn't work on cloned children unless you put in __WCLONE or
__WALL, so this was necessary to catch the child at all. If you set to
use SIGCHLD this will no longer be needed (if I understand correctly).

[...]

 So it seems that we must reparent the thread to init, and
 make sure that it delivers SIGCHLD to init when it exits.

Sounds good. Why isn't SIGCHLD a stronger default anyway.

[...]

 + /* Set the exit signal to SIGCHLD so we signal init on exit */
 + if (this_task-exit_signal ! 0) {

Tyop.

 + printk(KERN_ERR "task `%s' exit_signal %d in daemonize()\n",
 + this_task-comm, this_task-exit_signal);
 + }
 + this_task-exit_signal = SIGCHLD;
 +
 + write_unlock_irq(tasklist_lock);
  }
  
  void __init init_idle(void)
 

-- 

http://www.penguinpowered.com/~vii
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/



Re: [new PATCH] Re: 8139too: defunct threads

2001-04-16 Thread Andrew Morton

John Fremlin wrote:
 
 
  So it seems that we must reparent the thread to init, and
  make sure that it delivers SIGCHLD to init when it exits.
 
 Sounds good. Why isn't SIGCHLD a stronger default anyway.

mm?   The caller gets to choose...

 [...]
 
  + /* Set the exit signal to SIGCHLD so we signal init on exit */
  + if (this_task-exit_signal ! 0) {
 
 Tyop.

aargh.  Thanks.  So that's what `cvs commit' does :)

The patch is OK with this converted into `!='.  But I'll
refresh and retest for tomorrow.  Still not very happy with
this approach though...
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/



Re: [new PATCH] Re: 8139too: defunct threads

2001-04-15 Thread Rod Stewart


On Sun, 15 Apr 2001, Manfred Spraul wrote:

> 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.

This patch fixed my problem.

Thanks,
-Rms

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/



[new PATCH] Re: 8139too: defunct threads

2001-04-15 Thread Manfred Spraul

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

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__(
"orrr0, %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.cSun 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.cSun 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.cSun 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.cSun 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.cSun 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.cThu 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.SSun Apr 15 14:56:58 2001
@@ -497,7 +497,7 @@
 #endif
STREG   %r26, 

[new PATCH] Re: 8139too: defunct threads

2001-04-15 Thread Manfred Spraul

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

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__(
"orrr0, %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.cSun 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.cSun 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.cSun 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.cSun 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.cSun 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.cThu 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.SSun Apr 15 14:56:58 2001
@@ -497,7 +497,7 @@
 #endif
STREG   %r26, 

Re: [new PATCH] Re: 8139too: defunct threads

2001-04-15 Thread Rod Stewart


On Sun, 15 Apr 2001, Manfred Spraul wrote:

 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.

This patch fixed my problem.

Thanks,
-Rms

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/