Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 16 Sep 2004 21:40:45 -0700
From:      Julian Elischer <julian@elischer.org>
To:        John Baldwin <jhb@freebsd.org>
Cc:        freebsd-threads@freebsd.org
Subject:   Re: Unkillable KSE threaded proc
Message-ID:  <414A6ACD.2020600@elischer.org>
In-Reply-To: <200409161316.43010.jhb@FreeBSD.org>
References:  <16703.11479.679335.588170@grasshopper.cs.duke.edu> <414942B3.1060703@elischer.org> <16713.38977.864343.415015@grasshopper.cs.duke.edu> <200409161316.43010.jhb@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
John Baldwin wrote:
> On Thursday 16 September 2004 09:42 am, Andrew Gallatin wrote:
> 
>>Julian Elischer writes:
>> > Andrew, please try -current on ts own now..
>> > I have checked in some fixes that have helped others.
>>
>>OK, preemption off... Still a system lockup, but a little different.
>>
>>The interesting thing here is that continuing and breaking into the
>>debugger repeatedly seems to show that thread 0xc1646af0 is looping in
>>exit.  I've seen him in thread_single, thread_suspend_check, and in
>>exit itself at kern_exit.c:163, etc.  A breakpoint in
>>thread_suspend_one never triggers, so I guess he's holding the proc
>>lock and just looping forever.  A breakpoint in _mtx_assert() shows
>>him asserting the proc lock in thread_suspend_check at kern_thread.c:898.
>>Over and over.
> 
> 
> There is definitely some sort of infinite loop here.  Stripping out the 
> comments in exit1() for that section of code reveals basically:
> 
>         PROC_LOCK(p);
>         if (p->p_flag & P_HADTHREADS) {
> retry:
>                 thread_suspend_check(0);
>                 if (thread_single(SINGLE_EXIT))
>                         goto retry;
> 	}
>         p->p_flag |= P_WEXIT;
>         PROC_UNLOCK(p);
> 
> So it's easy to see how it can stuck in a loop I think.  If thread_single() 
> never drops the lock then other threads that are waiting to die can't 
> actually wait because they can never get the proc lock so that they can die.
> 


hmm intersting..
but this code hasn't changed in ages...


in thread_single we see:

                 thread_suspend_one(td);
                 PROC_UNLOCK(p);
                 mi_switch(SW_VOL, NULL);
                 mtx_unlock_spin(&sched_lock);
                 PROC_LOCK(p);
                 mtx_lock_spin(&sched_lock);

so when it sleeps it releases the proc lock.



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