Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 2 Jul 2004 17:11:14 -0400 (EDT)
From:      Andrew Gallatin <gallatin@cs.duke.edu>
To:        Daniel Eischen <eischen@vigrid.com>
Cc:        freebsd-threads@freebsd.org
Subject:   Re: odd KSE panic
Message-ID:  <16613.53106.413179.808734@grasshopper.cs.duke.edu>
In-Reply-To: <Pine.GSO.4.10.10407021526210.3102-100000@pcnet5.pcnet.com>
References:  <16613.45444.528419.643022@grasshopper.cs.duke.edu> <Pine.GSO.4.10.10407021526210.3102-100000@pcnet5.pcnet.com>

next in thread | previous in thread | raw e-mail | index | archive | help

Daniel Eischen writes:
 > On Fri, 2 Jul 2004, Andrew Gallatin wrote:

 > > The interesting thing is that there is no stack..  Just one function
 > > from my driver (mx_free()) sitting out there by itself.  Is the kernel
 > > somehow ripping the kernel stacks of all threads out from under them
 > > when one thread calls exit()?  How do I take a reference so I
 > > don't risk getting marooned without a stack?
 > 
 > exit() exits the process, including reaping all kernel threads.
 > I'm not sure why one thread (worker) doing an exit() will
 > still allow other threads to continue running.  You should
 > be using pthread_exit() to exit from the worker thread,
 > but that still doesn't explain why you're having the problem.
 > 

Thanks.. I'm calling pthread_exit() now.  Still having a problem.

What can you tell about the state of threads from this ddb info:

Fatal trap 12: page fault while in kernel mode
cpuid = 1; apic id = 01
fault virtual address   = 0x0
fault code              = supervisor read, page not present
instruction pointer     = 0x8:0xc1d69193
stack pointer           = 0x10:0x0
frame pointer           = 0x10:0x0
code segment            = base 0x0, limit 0xfffff, type 0x1b
                        = DPL 0, pres 1, def32 1, gran 1
processor eflags        = interrupt enabled, resume, IOPL = 0
current process         = 1937 (mx_loopback_test)
kernel: type 12 trap, code=0
kernel trap 12 with interrupts disabled


Fatal trap 12: page fault while in kernel mode
cpuid = 1; apic id = 01
fault virtual address   = 0x0
fault code              = supervisor read, page not present
instruction pointer     = 0x8:0xc0651e11
stack pointer           = 0x10:0xfffffefc
frame pointer           = 0x10:0xffffff1c
code segment            = base 0x0, limit 0xfffff, type 0x1b
                        = DPL 0, pres 1, def32 1, gran 1
processor eflags        = resume, IOPL = 0
current process         = 1937 (mx_loopback_test)
kernel: type 12 trap, code=0
Stopped at      kdb_trap+0x151: movl    0x40(%edx),%eax

db> ps
 pid   proc     uarea   uid  ppid  pgrp  flag   stat  wmesg    wchan  cmd
 1937 c1c5a898 e6319000 1387   643  1937 000c002 (threaded)   mx_loopback_test
   thread 0xc21cec60 ksegrp 0xc182c580 [SLPQ kserel 0xc182c5dc][SLP]
   thread 0xc21cedc0 ksegrp 0xc1cf1c00 [SLPQ ksesigwait 0xc1c5a998][SLP]
   thread 0xc1b962c0 ksegrp 0xc182c580 [CPU 1][kse 0xc2161360]

db> sho thread  0xc21cec60
Proc 0xc1c5a898    thread 0xc21cec60 ksegrp 0xc182c580 [SLPQ kserel 0xc182c5dc][SLP]
sched_switch(c21cec60,df262f7,22c29cb3,ffc03014,c21cec60) at sched_switch+0xbc
mi_switch(1,c052c35e,c182c5dc,c1c5a898,0) at mi_switch+0x1a2
sleepq_switch(c182c5dc,0,0,e8474c98,c0512cef) at sleepq_switch+0x169
sleepq_timedwait_sig(c182c5dc,0,c1c5a904,c069e850,0) at sleepq_timedwait_sig+0x17
msleep(c182c5dc,c1c5a904,168,c069e850,ea61) at msleep+0x490
kse_release(c21cec60,e8474d14,4,c04f102e,1) at kse_release+0x288
syscall(2f,2f,2f,8052200,0) at syscall+0x2f0
Xint0x80_syscall() at Xint0x80_syscall+0x1f
--- syscall (383, FreeBSD ELF32, kse_release), eip = 0x280941a7, esp = 0x8193f90, ebp = 0x8193fcc ---

db> sho thread 0xc21cedc0 
Proc 0xc1c5a898    thread 0xc21cedc0 ksegrp 0xc1cf1c00 [SLPQ ksesigwait 0xc1c5a998][SLP]
sched_switch(c21cedc0,2717cc87,22c51a72,ffc00014,c21cedc0) at sched_switch+0xbc
mi_switch(1,c052c35e,c1c5a998,c1c5a898,0) at mi_switch+0x1a2
sleepq_switch(c1c5a998,0,0,e8477c98,c0512cef) at sleepq_switch+0x169
sleepq_timedwait_sig(c1c5a998,0,c1c5a904,c069e845,0) at sleepq_timedwait_sig+0x17
msleep(c1c5a998,c1c5a904,168,c069e845,7531) at msleep+0x490
kse_release(c21cedc0,e8477d14,4,c04f102e,1) at kse_release+0x195
syscall(2f,2f,2f,8052100,81) at syscall+0x2f0
Xint0x80_syscall() at Xint0x80_syscall+0x1f
--- syscall (383, FreeBSD ELF32, kse_release), eip = 0x280941a7, esp = 0xbfafef40, ebp = 0xbfafef8c ---

db> sho thread 0xc1b962c0 
Proc 0xc1c5a898    thread 0xc1b962c0 ksegrp 0xc182c580 [CPU 1][kse 0xc2161360]
kdb_trap(c,0,ffffffc0,1,1) at kdb_trap+0x151
trap_fatal(ffffffc0,0,1,0,c1b962c0) at trap_fatal+0x2e3
trap_pfault(ffffffc0,0,0,0,0) at trap_pfault+0x22d
trap(18,10,10,0,c16c8ce0) at trap+0x2dd
calltrap() at calltrap+0x5
--- trap 0xc, eip = 0xc1d69193, esp = 0, ebp = 0 ---
mx_free() at mx_free+0x1b
db> 



(gdb) l * kse_release+0x288
0xc04f5145 is in kse_release (../../../kern/kern_kse.c:357).
352                             kg->kg_upsleeps++;
353                             td->td_kflags |= TDK_KSEREL;
354                             error = msleep(&kg->kg_completed, &p->p_mtx,
355                                     PPAUSE|PCATCH, "kserel",
356                                     (uap->timeout ? tvtohz(&tv) : 0));
357                             td->td_kflags &= ~(TDK_KSEREL | TDK_WAKEUP);
358                             kg->kg_upsleeps--;
359                     }
360                     PROC_UNLOCK(p);
361             }


(gdb) l * kse_release+0x195
0xc04f5052 is in kse_release (../../../kern/kern_kse.c:343).
338                     /* UTS wants to wait for signal event */
339                     if (!(p->p_flag & P_SIGEVENT) && !(ku->ku_flags & KUF_DOUPCALL)) {
340                             td->td_kflags |= TDK_KSERELSIG;
341                             error = msleep(&p->p_siglist, &p->p_mtx, PPAUSE|PCATCH,
342                                 "ksesigwait", (uap->timeout ? tvtohz(&tv) : 0));
343                             td->td_kflags &= ~(TDK_KSERELSIG | TDK_WAKEUP);
344                     }
345                     p->p_flag &= ~P_SIGEVENT;
346                     sigset = p->p_siglist;
347                     PROC_UNLOCK(p);


(from objdump -D -S, since gdb -k seems to no longer work..)
00008178 <mx_free>:

void
mx_free(void *ptr)
{
    8178:       55                      push   %ebp
    8179:       89 e5                   mov    %esp,%ebp
    817b:       83 ec 08                sub    $0x8,%esp
  free(ptr, M_MXBUF);
    817e:       c7 44 24 04 20 71 02    movl   $0x27120,0x4(%esp)
    8185:       00 
    8186:       8b 45 08                mov    0x8(%ebp),%eax
    8189:       89 04 24                mov    %eax,(%esp)
    818c:       e8 fc ff ff ff          call   818d <mx_free+0x15>
}
    8191:       89 ec                   mov    %ebp,%esp
    8193:       5d                      pop    %ebp
    8194:       c3                      ret    


Thanks,

Drew



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