- Call KeAcquireSpinLockAtDpcLevel instead of KeAcquireSpinLock when possible

- Don't hold the spin lock as long in MiniportDpc

svn path=/branches/aicom-network-fixes/; revision=36198
This commit is contained in:
Cameron Gutman
2008-09-13 19:00:32 +00:00
parent bd9013b5ae
commit 86ca4446aa
3 changed files with 9 additions and 12 deletions
+2 -3
View File
@@ -112,7 +112,6 @@ EthFilterDprIndicateReceiveComplete(
* Filter = Pointer to Ethernet filter
*/
{
KIRQL OldIrql;
PLIST_ENTRY CurrentEntry;
PLOGICAL_ADAPTER Adapter;
PADAPTER_BINDING AdapterBinding;
@@ -124,7 +123,7 @@ EthFilterDprIndicateReceiveComplete(
Adapter = (PLOGICAL_ADAPTER)((PETHI_FILTER)Filter)->Miniport;
NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n"));
KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql);
KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
{
CurrentEntry = Adapter->ProtocolListHead.Flink;
@@ -138,7 +137,7 @@ EthFilterDprIndicateReceiveComplete(
CurrentEntry = CurrentEntry->Flink;
}
}
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql);
KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
}
/* EOF */
+3 -4
View File
@@ -767,16 +767,17 @@ VOID NTAPI MiniportDpc(
PVOID WorkItemContext;
NDIS_WORK_ITEM_TYPE WorkItemType;
PLOGICAL_ADAPTER Adapter = GET_LOGICAL_ADAPTER(DeferredContext);
KIRQL OldIrql;
NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql);
KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
NdisStatus =
MiniDequeueWorkItem
(Adapter, &WorkItemType, &WorkItemContext);
KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
if (NdisStatus == NDIS_STATUS_SUCCESS)
{
switch (WorkItemType)
@@ -869,8 +870,6 @@ VOID NTAPI MiniportDpc(
break;
}
}
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql);
}
+4 -5
View File
@@ -63,7 +63,6 @@ ProIndicatePacket(
* - XXX ATM, this only handles loopback packets - is that its designed function?
*/
{
KIRQL OldIrql;
UINT BufferedLength;
UINT PacketLength;
@@ -76,12 +75,12 @@ ProIndicatePacket(
NdisQueryPacket(Packet, NULL, NULL, NULL, &PacketLength);
NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n"));
KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql);
KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
{
Adapter->NdisMiniportBlock.IndicatedPacket[KeGetCurrentProcessorNumber()] = Packet;
BufferedLength = CopyPacketToBuffer(Adapter->LookaheadBuffer, Packet, 0, Adapter->NdisMiniportBlock.CurrentLookahead);
}
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql);
KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
if (BufferedLength > Adapter->MediumHeaderSize)
{
@@ -96,11 +95,11 @@ ProIndicatePacket(
}
NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n"));
KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql);
KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
{
Adapter->NdisMiniportBlock.IndicatedPacket[KeGetCurrentProcessorNumber()] = NULL;
}
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql);
KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
return STATUS_SUCCESS;
}