tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: -current kernel hang with a 4.0 binary



On Fri, Oct 24, 2008 at 09:30:38PM -0700, Bill Stouder-Studenmund wrote:
> On Fri, Oct 24, 2008 at 08:54:22PM +0200, Manuel Bouyer wrote:
> > [...]
> > netbsd:sparc_interrupt+0x1c8:   subcc           %l7, %l2, %g0
> > netbsd:sparc_interrupt+0x1cc:   bne,pn          netbsd:sparc_interrupt+0x1ac
> > netbsd:sparc_interrupt+0x1d0:   add             %sp, 0xb0, %o2
> > netbsd:sparc_interrupt+0x1d4:   ld              [%l2 + 0x18], %l7
> > netbsd:sparc_interrupt+0x1d8:   membar          0x4l
> > netbsd:sparc_interrupt+0x1dc:   st              %g0, [%l2 + 0x18]
> > netbsd:sparc_interrupt+0x1e0:   membar          0x4l
> > netbsd:sparc_interrupt+0x1e4:   ld              [%l2 + 0x0], %o4
> > netbsd:sparc_interrupt+0x1e8:   ld              [%l2 + 0x4], %o0
> > netbsd:sparc_interrupt+0x1ec:   wrpr            %g0, 0xe, %pstate
> > netbsd:sparc_interrupt+0x1f0:   jmpl            [%o4 + %g0], %o7
> > netbsd:sparc_interrupt+0x1f4:   movrz           %o0, %o2, %o0
> > netbsd:sparc_interrupt+0x1f8:   wrpr            %g0, 0xc, %pstate
> > netbsd:sparc_interrupt+0x1fc:   ld              [%l2 + 0x20], %l1
> > netbsd:sparc_interrupt+0x200:   membar          0x4l
> > netbsd:sparc_interrupt+0x204:   brz,pn          %l1, 
> > netbsd:sparc_interrupt+0x214
> > netbsd:sparc_interrupt+0x208:   add             %l5, %o0, %l5
> > netbsd:sparc_interrupt+0x20c:   stx             %g0, [%l1 + %g0]
> > netbsd:sparc_interrupt+0x210:   membar          0x4l
> > netbsd:sparc_interrupt+0x214:   subcc           %l7, -0x1, %g0
> > netbsd:sparc_interrupt+0x218:   bne,pn          netbsd:sparc_interrupt+0x1d0
> > 
> > 
> > 
> > netbsd:sys_sa_enable+0xac:      ld              [%i0 + 0x10], %g1
> > netbsd:sys_sa_enable+0xb0:      or              %g0, %l0, %o1
> > netbsd:sys_sa_enable+0xb4:      subcc           %l0, %g1, %g0
> > netbsd:sys_sa_enable+0xb8:      bne,pn          netbsd:sys_sa_enable+0xfc
> > netbsd:sys_sa_enable+0xbc:      or              %g0, %i0, %o0
> > netbsd:sys_sa_enable+0xc0:      ld              [%i0 + 0x24], %g1
> > netbsd:sys_sa_enable+0xc4:      ld              [%i0 + 0x10], %o0
> > netbsd:sys_sa_enable+0xc8:      or              %g1, 0x400, %g1
> > netbsd:sys_sa_enable+0xcc:      st              %g1, [%i0 + 0x24]
> > netbsd:sys_sa_enable+0xd0:      call            netbsd:mutex_vector_exit
> > netbsd:sys_sa_enable+0xd4:      or              %g0, %l2, %i0
> > netbsd:sys_sa_enable+0xd8:      call            netbsd:mutex_exit
> > netbsd:sys_sa_enable+0xdc:      ld              [%l1 + 0xc], %o0
> > netbsd:sys_sa_enable+0xe0:      return          [%i7 + 0x8]
> > netbsd:sys_sa_enable+0xe4:      nop
> > 
> > any idea ?
> 
> gdb netbsd.gdb
> list *(sys_sa_enable+0xd8)
> list *(sparc_interrupt+0x1f0)
> 
> Looking at it, it sure looks like the call to mutex_exit. The C code is:
> 
>         mutex_enter(p->p_lock);
>         vp->savp_lwp = l;
>         p->p_sflag |= PS_SA;
>         lwp_lock(l);
>         l->l_flag |= LW_SA; /* We are now an activation LWP */
>         lwp_unlock(l);
>         mutex_exit(p->p_lock);
> 
> Looking at the other code in sys_sa_enable(), I think all the locking is 
> fine. While I haven't tried a recent (last 2 days) kernel, this was 
> working fine on i386.
> 
> Try a kernel with LOCKDEBUG?

I'll give it a try (I'm not in an easy position to do so in the
next week though), but I suspect this is a sparc64-specific issue.
I've seen hangs with sparc_interrupt in the trace before. I assumed
sparc_interrupt was there because of the break to ddb, it may be in fact
be spinning in sparc_interrupt. This is what playing with break and step
shows at last ...

-- 
Manuel Bouyer <bouyer%antioche.eu.org@localhost>
     NetBSD: 26 ans d'experience feront toujours la difference
--


Home | Main Index | Thread Index | Old Index