From 7457359d5dd35a7e1021e87355686ca05ecb04a8 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Fri, 8 Jan 2010 18:21:52 +0000 Subject: [PATCH] - Use a spin lock to protect the port bitmap instead of a fast mutex svn path=/branches/aicom-network-branch/; revision=45006 --- drivers/network/tcpip/include/ports.h | 2 +- lib/drivers/ip/network/ports.c | 27 ++++++++++++++++----------- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/drivers/network/tcpip/include/ports.h b/drivers/network/tcpip/include/ports.h index 700682937e3..3be359097fb 100644 --- a/drivers/network/tcpip/include/ports.h +++ b/drivers/network/tcpip/include/ports.h @@ -16,7 +16,7 @@ typedef struct _PORT_SET { PVOID ProtoBitBuffer; UINT StartingPort; UINT PortsToOversee; - FAST_MUTEX Mutex; + KSPIN_LOCK Lock; } PORT_SET, *PPORT_SET; NTSTATUS PortsStartup( PPORT_SET PortSet, diff --git a/lib/drivers/ip/network/ports.c b/lib/drivers/ip/network/ports.c index cd9dbd2f05f..0da272260cd 100644 --- a/lib/drivers/ip/network/ports.c +++ b/lib/drivers/ip/network/ports.c @@ -24,7 +24,7 @@ NTSTATUS PortsStartup( PPORT_SET PortSet, PortSet->ProtoBitBuffer, PortSet->PortsToOversee ); RtlClearAllBits( &PortSet->ProtoBitmap ); - ExInitializeFastMutex( &PortSet->Mutex ); + KeInitializeSpinLock( &PortSet->Lock ); return STATUS_SUCCESS; } @@ -33,17 +33,20 @@ VOID PortsShutdown( PPORT_SET PortSet ) { } VOID DeallocatePort( PPORT_SET PortSet, ULONG Port ) { + KIRQL OldIrql; + Port = htons(Port); ASSERT(Port >= PortSet->StartingPort); ASSERT(Port < PortSet->StartingPort + PortSet->PortsToOversee); - ExAcquireFastMutex( &PortSet->Mutex ); + KeAcquireSpinLock( &PortSet->Lock, &OldIrql ); RtlClearBits( &PortSet->ProtoBitmap, Port - PortSet->StartingPort, 1 ); - ExReleaseFastMutex( &PortSet->Mutex ); + KeReleaseSpinLock( &PortSet->Lock, OldIrql ); } BOOLEAN AllocatePort( PPORT_SET PortSet, ULONG Port ) { BOOLEAN Clear; + KIRQL OldIrql; Port = htons(Port); @@ -55,32 +58,34 @@ BOOLEAN AllocatePort( PPORT_SET PortSet, ULONG Port ) { Port -= PortSet->StartingPort; - ExAcquireFastMutex( &PortSet->Mutex ); + KeAcquireSpinLock( &PortSet->Lock, &OldIrql ); Clear = RtlAreBitsClear( &PortSet->ProtoBitmap, Port, 1 ); if( Clear ) RtlSetBits( &PortSet->ProtoBitmap, Port, 1 ); - ExReleaseFastMutex( &PortSet->Mutex ); + KeReleaseSpinLock( &PortSet->Lock, OldIrql ); return Clear; } ULONG AllocateAnyPort( PPORT_SET PortSet ) { ULONG AllocatedPort; + KIRQL OldIrql; - ExAcquireFastMutex( &PortSet->Mutex ); + KeAcquireSpinLock( &PortSet->Lock, &OldIrql ); AllocatedPort = RtlFindClearBits( &PortSet->ProtoBitmap, 1, 0 ); if( AllocatedPort != (ULONG)-1 ) { RtlSetBit( &PortSet->ProtoBitmap, AllocatedPort ); AllocatedPort += PortSet->StartingPort; - ExReleaseFastMutex( &PortSet->Mutex ); + KeReleaseSpinLock( &PortSet->Lock, OldIrql ); return htons(AllocatedPort); } - ExReleaseFastMutex( &PortSet->Mutex ); + KeReleaseSpinLock( &PortSet->Lock, OldIrql ); return -1; } ULONG AllocatePortFromRange( PPORT_SET PortSet, ULONG Lowest, ULONG Highest ) { ULONG AllocatedPort; + KIRQL OldIrql; if ((Lowest < PortSet->StartingPort) || (Highest >= PortSet->StartingPort + PortSet->PortsToOversee)) @@ -91,15 +96,15 @@ ULONG AllocatePortFromRange( PPORT_SET PortSet, ULONG Lowest, ULONG Highest ) { Lowest -= PortSet->StartingPort; Highest -= PortSet->StartingPort; - ExAcquireFastMutex( &PortSet->Mutex ); + KeAcquireSpinLock( &PortSet->Lock, &OldIrql ); AllocatedPort = RtlFindClearBits( &PortSet->ProtoBitmap, 1, Lowest ); if( AllocatedPort != (ULONG)-1 && AllocatedPort <= Highest) { RtlSetBit( &PortSet->ProtoBitmap, AllocatedPort ); AllocatedPort += PortSet->StartingPort; - ExReleaseFastMutex( &PortSet->Mutex ); + KeReleaseSpinLock( &PortSet->Lock, OldIrql ); return htons(AllocatedPort); } - ExReleaseFastMutex( &PortSet->Mutex ); + KeReleaseSpinLock( &PortSet->Lock, OldIrql ); return -1; } -- 2.17.1