linux-mips-fnet
[Top] [All Lists]

Re: process lockups

To: K.H.C.vanHouten@kpn.com
Subject: Re: process lockups
From: Ralf Baechle <ralf@oss.sgi.com>
Date: Tue, 24 Oct 2000 17:09:39 +0200
Cc: linux-mips@fnet.fr, linux-mips@oss.sgi.com
In-reply-to: <200010240551.HAA02069@sparta.research.kpn.com>; from K.H.C.vanHouten@research.kpn.com on Tue, Oct 24, 2000 at 07:51:42AM +0200
References: <20001024044736.B3397@bacchus.dhis.org> <200010240551.HAA02069@sparta.research.kpn.com>
On Tue, Oct 24, 2000 at 07:51:42AM +0200, Houten K.H.C. van (Karel) wrote:

> Aside from this I stil get 'bug in get_wchan' messages, but everything
> seems to run fine. I hope to test my current kernels on a 5000/150 and
> a 3100.

Try this untested fix for get_wchan.  The values in the ps axl column should
now be numbers that make sense as addresses.  Unless the `n' option is
also used ps will try to translate the address back into a symbol.  Cite
from ps(1):

[...]
       To  produce  the  WCHAN  field,  ps needs to read the Sys­
       tem.map file created when  the  kernel  is  compiled.  The
       search path is:
              $PS_SYSTEM_MAP
              /boot/System.map-`uname -r`
              /boot/System.map
              /lib/modules/`uname -r`/System.map
              /usr/src/linux/System.map
              /System.map
[...]

If that's working as planned please send me the WCHAN of any stuck process.
I need to know where they're stuck.

  Ralf

--- arch/mips/kernel/process.c  2000/10/05 01:18:43     1.21
+++ arch/mips/kernel/process.c  2000/10/24 14:54:29
@@ -203,18 +203,9 @@
                return 0;
 
        pc = thread_saved_pc(&p->thread);
-       if (pc == (unsigned long) interruptible_sleep_on
-           || pc == (unsigned long) sleep_on) {
-               schedule_frame = ((unsigned long *)p->thread.reg30)[9];
-               return ((unsigned long *)schedule_frame)[15];
-       }
-       if (pc == (unsigned long) interruptible_sleep_on_timeout
-           || pc == (unsigned long) sleep_on_timeout) {
-               schedule_frame = ((unsigned long *)p->thread.reg30)[9];
-               return ((unsigned long *)schedule_frame)[16];
-       }
        if (pc >= first_sched && pc < last_sched) {
-               printk(KERN_DEBUG "Bug in %s\n", __FUNCTION__);
+               schedule_frame = ((unsigned long *)p->thread.reg30)[9];
+               return ((unsigned long *)schedule_frame)[11];
        }
 
        return pc;

<Prev in Thread] Current Thread [Next in Thread>