From: sleybo Date: Wed, 7 Feb 2007 12:10:54 +0000 (+0000) Subject: [COMPLIB] improve spinlocks to take a more efficient spinlock while at DPC level X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=5ccfa0ec9bc8b5971556c64d1819d2e2a96bad67;p=~shefty%2Frdma-win.git [COMPLIB] improve spinlocks to take a more efficient spinlock while at DPC level git-svn-id: svn://openib.tc.cornell.edu/gen1@579 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86 --- diff --git a/trunk/inc/kernel/complib/cl_spinlock_osd.h b/trunk/inc/kernel/complib/cl_spinlock_osd.h index 54306bbf..bf6a4196 100644 --- a/trunk/inc/kernel/complib/cl_spinlock_osd.h +++ b/trunk/inc/kernel/complib/cl_spinlock_osd.h @@ -88,9 +88,15 @@ CL_INLINE void cl_spinlock_acquire( IN cl_spinlock_t* const p_spinlock ) { + KIRQL irql = KeGetCurrentIrql(); CL_ASSERT( p_spinlock ); - KeAcquireSpinLock( &p_spinlock->lock, &p_spinlock->irql ); + if (irql == DISPATCH_LEVEL) { + KeAcquireSpinLockAtDpcLevel( &p_spinlock->lock ); + p_spinlock->irql = irql; + } + else + KeAcquireSpinLock( &p_spinlock->lock, &p_spinlock->irql ); } @@ -100,7 +106,10 @@ cl_spinlock_release( { CL_ASSERT( p_spinlock ); - KeReleaseSpinLock( &p_spinlock->lock, p_spinlock->irql ); + if (p_spinlock->irql == DISPATCH_LEVEL) + KeReleaseSpinLockFromDpcLevel( &p_spinlock->lock ); + else + KeReleaseSpinLock( &p_spinlock->lock, p_spinlock->irql ); }