mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-09-02 12:23:31 +00:00
- 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:
@@ -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 */
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user