Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 04 Jun 2002 18:09:36 -0400 (EDT)
From:      John Baldwin <jhb@FreeBSD.org>
To:        Julian Elischer <julian@elischer.org>
Cc:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   Re: PERFORCE change 12362 for review
Message-ID:  <XFMail.20020604180936.jhb@FreeBSD.org>
In-Reply-To: <Pine.BSF.4.21.0206041410060.49318-100000@InterJet.elischer.org>

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

On 04-Jun-2002 Julian Elischer wrote:
> 
> 
> On Tue, 4 Jun 2002, John Baldwin wrote:
> 
>> http://people.freebsd.org/~peter/p4db/chv.cgi?CH=12362
>> 
>> Change 12362 by jhb@jhb_laptop on 2002/06/04 10:45:42
>> 
>>      - Add a thread_runnable() macro to make some code more readable
>>        and make the KSE diff easier.
>>      - Fix the adaptive mutex spin optimization.  We need to stop
>>        spinning not just when mtx_owner(m) changes, but also if the
>>        owner stops running.
>> 
>> Affected files ...
>> 
>> ... //depot/projects/smpng/sys/kern/kern_mutex.c#36 edit
>> 
>> Differences ...
>> 
>> ==== //depot/projects/smpng/sys/kern/kern_mutex.c#36 (text+ko) ====
>> 
>> @@ -70,6 +70,9 @@
>>  #define mtx_owner(m)        (mtx_unowned((m)) ? NULL \
>>      : (struct thread *)((m)->mtx_lock & MTX_FLAGMASK))
>>  
>> +#define     thread_runnable(td)                                             \
>> +    ((td)->td_kse != NULL && (td)->td_kse->ke_oncpu != NOCPU)
>> +    
> 
> this actually checks for "thread_running" not "thread_runnable".
> Since you are mentioning KSE diffs, in KSE this test is performed by:

Duh, good point.  I'll fix.

> if (td->td_state == TDS_RUNNING)
> 
> and if you want to check for both running and runnable, you need:
> 
> if ((td->td_state == TDS_RUNNING) || (td->td_state == TDS_RUNQ))
> 
> 
>>  /*
>>   * Lock classes for sleep and spin mutexes.
>>   */
>> @@ -129,7 +132,7 @@
>>               * If lock holder is actually running, just bump priority.
>>               */
>>               /* XXXKSE this test is not sufficient */
>> -            if (td->td_kse && (td->td_kse->ke_oncpu != NOCPU)) { 
>> +            if (thread_runnable(td)) {
>>                      MPASS(td->td_proc->p_stat == SRUN
>>                      || td->td_proc->p_stat == SZOMB
>>                      || td->td_proc->p_stat == SSTOP);
>> @@ -531,10 +534,10 @@
>>               * CPU, spin instead of blocking.
>>               */
>>              owner = (struct thread *)(v & MTX_FLAGMASK);
>> -            if (m != &Giant && owner->td_kse != NULL &&
>> -                owner->td_kse->ke_oncpu != NOCPU) {
>> +            if (m != &Giant && thread_runnable(owner)) {
>>                      mtx_unlock_spin(&sched_lock);
>> -                    while (mtx_owner(m) == owner) {
>> +                    while (mtx_owner(m) == owner &&
>> +                        thread_runnable(owner)) {
>>  #ifdef __i386__
>>                              ia32_pause();
>>  #endif
>> 
> 

-- 

John Baldwin <jhb@FreeBSD.org>  <><  http://www.FreeBSD.org/~jhb/
"Power Users Use the Power to Serve!"  -  http://www.FreeBSD.org/

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe p4-projects" in the body of the message




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