From: VMware, Inc <> Date: Tue, 13 Mar 2012 20:00:12 +0000 (-0700) Subject: lib/lock: reapply previously reverted commit X-Git-Tag: 2012.03.13-651368~73 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=76ca68bc991e5c84821e61d54efc1d3434e04bba;p=thirdparty%2Fopen-vm-tools.git lib/lock: reapply previously reverted commit Now that the big change is in, reapply this change. Signed-off-by: Dmitry Torokhov --- diff --git a/open-vm-tools/lib/lock/ul.c b/open-vm-tools/lib/lock/ul.c index 597fda62e..aa60e7077 100644 --- a/open-vm-tools/lib/lock/ul.c +++ b/open-vm-tools/lib/lock/ul.c @@ -446,7 +446,8 @@ MXUserAllocPerThread(void) ASSERT(perThreadLock); - MXRecLockAcquire(perThreadLock); + MXRecLockAcquire(perThreadLock, + NULL); // non-stats if (perThreadFreeList == NULL) { perThread = Util_SafeMalloc(sizeof *perThread); @@ -494,7 +495,8 @@ MXUserFreePerThread(MXUserPerThread *perThread) // IN: perThreadLock = MXUserInternalSingleton(&perThreadLockMem); ASSERT(perThreadLock); - MXRecLockAcquire(perThreadLock); + MXRecLockAcquire(perThreadLock, + NULL); // non-stats perThread->next = perThreadFreeList; perThreadFreeList = perThread; MXRecLockRelease(perThreadLock); diff --git a/open-vm-tools/lib/lock/ulCondVar.c b/open-vm-tools/lib/lock/ulCondVar.c index f9d560a40..53cdc9385 100644 --- a/open-vm-tools/lib/lock/ulCondVar.c +++ b/open-vm-tools/lib/lock/ulCondVar.c @@ -300,7 +300,8 @@ MXUserWaitInternal(MXRecLock *lock, // IN: LeaveCriticalSection(&condVar->x.compat.condVarLock); } while (!done); - MXRecLockAcquire(lock); + MXRecLockAcquire(lock, + NULL); // non-stats MXRecLockIncCount(lock, lockCount - 1); diff --git a/open-vm-tools/lib/lock/ulExcl.c b/open-vm-tools/lib/lock/ulExcl.c index e7d0fe52a..ef5366f99 100644 --- a/open-vm-tools/lib/lock/ulExcl.c +++ b/open-vm-tools/lib/lock/ulExcl.c @@ -409,21 +409,15 @@ MXUser_AcquireExclLock(MXUserExclLock *lock) // IN/OUT: MXUserAcquisitionTracking(&lock->header, TRUE); if (vmx86_stats) { - Bool contended; - VmTimeType start = 0; + VmTimeType value = 0; MXUserStats *stats = Atomic_ReadPtr(&lock->statsMem); - if (LIKELY(stats != NULL)) { - start = Hostinfo_SystemTimerNS(); - } - - contended = MXRecLockAcquire(&lock->recursiveLock); + MXRecLockAcquire(&lock->recursiveLock, (stats == NULL) ? NULL : &value); if (LIKELY(stats != NULL)) { MXUserHisto *histo; - VmTimeType value = Hostinfo_SystemTimerNS() - start; - MXUserAcquisitionSample(&stats->acquisitionStats, TRUE, contended, + MXUserAcquisitionSample(&stats->acquisitionStats, TRUE, value != 0, value); histo = Atomic_ReadPtr(&stats->acquisitionHisto); @@ -435,7 +429,8 @@ MXUser_AcquireExclLock(MXUserExclLock *lock) // IN/OUT: stats->holdStart = Hostinfo_SystemTimerNS(); } } else { - MXRecLockAcquire(&lock->recursiveLock); + MXRecLockAcquire(&lock->recursiveLock, + NULL); // non-stats } if (vmx86_debug && (MXRecLockCount(&lock->recursiveLock) > 1)) { diff --git a/open-vm-tools/lib/lock/ulInt.h b/open-vm-tools/lib/lock/ulInt.h index abfa49056..58a60e57d 100644 --- a/open-vm-tools/lib/lock/ulInt.h +++ b/open-vm-tools/lib/lock/ulInt.h @@ -39,6 +39,7 @@ typedef pthread_t MXUserThreadID; #include "vm_basic_types.h" #include "vthreadBase.h" +#include "hostinfo.h" #include "circList.h" @@ -271,7 +272,7 @@ static INLINE void MXRecLockIncCount(MXRecLock *lock, // IN/OUT: int count) // IN: { - ASSERT(count > 0); + ASSERT(count >= 0); if (MXRecLockCount(lock) == 0) { MXRecLockSetOwner(lock); @@ -281,15 +282,21 @@ MXRecLockIncCount(MXRecLock *lock, // IN/OUT: } -static INLINE Bool -MXRecLockAcquire(MXRecLock *lock) // IN/OUT: +static INLINE void +MXRecLockAcquire(MXRecLock *lock, // IN/OUT: + VmTimeType *duration) // OUT/OPT: { int err; + VmTimeType start = 0; if ((MXRecLockCount(lock) > 0) && MXRecLockIsOwner(lock)) { MXRecLockIncCount(lock, 1); - return FALSE; // Not contended + if (duration != NULL) { + *duration = 0ULL; + } + + return; // Uncontended } err = MXRecLockTryAcquireInternal(lock); @@ -297,15 +304,27 @@ MXRecLockAcquire(MXRecLock *lock) // IN/OUT: if (err == 0) { MXRecLockIncCount(lock, 1); - return FALSE; // Not contended + if (duration != NULL) { + *duration = 0ULL; + } + + return; // Uncontended } if (vmx86_debug && (err != EBUSY)) { Panic("%s: MXRecLockTryAcquireInternal error %d\n", __FUNCTION__, err); } + if (duration != NULL) { + start = Hostinfo_SystemTimerNS(); + } + err = MXRecLockAcquireInternal(lock); + if (duration != NULL) { + *duration = Hostinfo_SystemTimerNS() - start; + } + if (vmx86_debug && (err != 0)) { Panic("%s: MXRecLockAcquireInternal error %d\n", __FUNCTION__, err); } @@ -314,7 +333,7 @@ MXRecLockAcquire(MXRecLock *lock) // IN/OUT: MXRecLockIncCount(lock, 1); - return TRUE; // Contended + return; // Contended } @@ -348,7 +367,7 @@ static INLINE void MXRecLockDecCount(MXRecLock *lock, // IN/OUT: int count) // IN: { - ASSERT(count > 0); + ASSERT(count >= 0); lock->referenceCount -= count; diff --git a/open-vm-tools/lib/lock/ulRW.c b/open-vm-tools/lib/lock/ulRW.c index 8ec5cb7d9..9de291870 100644 --- a/open-vm-tools/lib/lock/ulRW.c +++ b/open-vm-tools/lib/lock/ulRW.c @@ -735,30 +735,31 @@ MXUserAcquisition(MXUserRWLock *lock, // IN/OUT: } if (vmx86_stats) { - Bool contended; - VmTimeType start = 0; + VmTimeType value; MXUserStats *stats = Atomic_ReadPtr(&lock->statsMem); - if (LIKELY(stats != NULL)) { - start = Hostinfo_SystemTimerNS(); - } - if (lock->useNative) { int err = 0; + Bool contended; + VmTimeType begin = Hostinfo_SystemTimerNS(); contended = MXUserNativeRWAcquire(&lock->nativeLock, forRead, &err); + value = contended ? Hostinfo_SystemTimerNS() - begin : 0; + if (UNLIKELY(err != 0)) { MXUserDumpAndPanic(&lock->header, "%s: Error %d: contended %d\n", __FUNCTION__, err, contended); } } else { - contended = MXRecLockAcquire(&lock->recursiveLock); + value = 0; + + MXRecLockAcquire(&lock->recursiveLock, + (stats == NULL) ? NULL : &value); } if (LIKELY(stats != NULL)) { MXUserHisto *histo; - VmTimeType value = Hostinfo_SystemTimerNS() - start; /* * The statistics are not atomically safe so protect them when @@ -766,10 +767,11 @@ MXUserAcquisition(MXUserRWLock *lock, // IN/OUT: */ if (forRead && lock->useNative) { - MXRecLockAcquire(&lock->recursiveLock); + MXRecLockAcquire(&lock->recursiveLock, + NULL); // non-stats } - MXUserAcquisitionSample(&stats->acquisitionStats, TRUE, contended, + MXUserAcquisitionSample(&stats->acquisitionStats, TRUE, value != 0, value); histo = Atomic_ReadPtr(&stats->acquisitionHisto); @@ -795,7 +797,8 @@ MXUserAcquisition(MXUserRWLock *lock, // IN/OUT: __FUNCTION__, err); } } else { - MXRecLockAcquire(&lock->recursiveLock); + MXRecLockAcquire(&lock->recursiveLock, + NULL); // non-stats } } @@ -940,7 +943,8 @@ MXUser_ReleaseRWLock(MXUserRWLock *lock) // IN/OUT: */ if ((myContext->state == RW_LOCKED_FOR_READ) && lock->useNative) { - MXRecLockAcquire(&lock->recursiveLock); + MXRecLockAcquire(&lock->recursiveLock, + NULL); // non-stats } MXUserBasicStatsSample(&stats->heldStats, duration); diff --git a/open-vm-tools/lib/lock/ulRec.c b/open-vm-tools/lib/lock/ulRec.c index e5d125b82..ee07d00ea 100644 --- a/open-vm-tools/lib/lock/ulRec.c +++ b/open-vm-tools/lib/lock/ulRec.c @@ -521,23 +521,18 @@ MXUser_AcquireRecLock(MXUserRecLock *lock) // IN/OUT: MXUserAcquisitionTracking(&lock->header, TRUE); if (vmx86_stats) { - Bool contended; - VmTimeType start = 0; + VmTimeType value = 0; MXUserStats *stats = Atomic_ReadPtr(&lock->statsMem); - if (LIKELY(stats != NULL)) { - start = Hostinfo_SystemTimerNS(); - } - - contended = MXRecLockAcquire(&lock->recursiveLock); + MXRecLockAcquire(&lock->recursiveLock, + (stats == NULL) ? NULL : &value); if (LIKELY(stats != NULL)) { if (MXRecLockCount(&lock->recursiveLock) == 1) { MXUserHisto *histo; - VmTimeType value = Hostinfo_SystemTimerNS() - start; MXUserAcquisitionSample(&stats->acquisitionStats, TRUE, - contended, value); + value != 0, value); histo = Atomic_ReadPtr(&stats->acquisitionHisto); @@ -549,7 +544,8 @@ MXUser_AcquireRecLock(MXUserRecLock *lock) // IN/OUT: } } } else { - MXRecLockAcquire(&lock->recursiveLock); + MXRecLockAcquire(&lock->recursiveLock, + NULL); // non-stats } } diff --git a/open-vm-tools/lib/lock/ulStats.c b/open-vm-tools/lib/lock/ulStats.c index 2bc66e108..4f9a98f21 100644 --- a/open-vm-tools/lib/lock/ulStats.c +++ b/open-vm-tools/lib/lock/ulStats.c @@ -87,7 +87,8 @@ MXUserAddToList(MXUserHeader *header) // IN: /* Tolerate a failure. This is too low down to log */ if (listLock) { - MXRecLockAcquire(listLock); + MXRecLockAcquire(listLock, + NULL); // non-stats LIST_QUEUE(&header->item, &mxUserLockList); MXRecLockRelease(listLock); } @@ -117,7 +118,8 @@ MXUserRemoveFromList(MXUserHeader *header) // IN: /* Tolerate a failure. This is too low down to log */ if (listLock) { - MXRecLockAcquire(listLock); + MXRecLockAcquire(listLock, + NULL); // non-stats LIST_DEL(&header->item, &mxUserLockList); MXRecLockRelease(listLock); }