From owner-p4-projects Tue Jun 4 10:46:37 2002 Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 2099A37B404; Tue, 4 Jun 2002 10:46:30 -0700 (PDT) Delivered-To: perforce@freebsd.org Received: from freefall.freebsd.org (freefall.FreeBSD.org [216.136.204.21]) by hub.freebsd.org (Postfix) with ESMTP id BCABE37B400 for ; Tue, 4 Jun 2002 10:46:28 -0700 (PDT) Received: (from perforce@localhost) by freefall.freebsd.org (8.11.6/8.11.6) id g54HkS563688 for perforce@freebsd.org; Tue, 4 Jun 2002 10:46:28 -0700 (PDT) (envelope-from jhb@freebsd.org) Date: Tue, 4 Jun 2002 10:46:28 -0700 (PDT) Message-Id: <200206041746.g54HkS563688@freefall.freebsd.org> X-Authentication-Warning: freefall.freebsd.org: perforce set sender to jhb@freebsd.org using -f From: John Baldwin Subject: PERFORCE change 12362 for review To: Perforce Change Reviews Sender: owner-p4-projects@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG 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) + /* * 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 To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe p4-projects" in the body of the message