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>