struct _XENVIF_MAC {
PXENVIF_FRONTEND Frontend;
- KSPIN_LOCK Lock;
+ EX_SPIN_LOCK Lock;
BOOLEAN Connected;
BOOLEAN Enabled;
ULONG MaximumFrameSize;
if (*Mac == NULL)
goto fail1;
- KeInitializeSpinLock(&(*Mac)->Lock);
InitializeListHead(&(*Mac)->MulticastList);
FdoGetDebugInterface(PdoGetFdo(FrontendGetPdo(Frontend)),
return status;
}
+static FORCEINLINE VOID
+__drv_requiresIRQL(DISPATCH_LEVEL)
+__MacAcquireLockExclusive(
+ IN PXENVIF_MAC Mac
+ )
+{
+ ASSERT3U(KeGetCurrentIrql(), ==, DISPATCH_LEVEL);
+
+ ExAcquireSpinLockExclusiveAtDpcLevel(&Mac->Lock);
+}
+
+static FORCEINLINE VOID
+__drv_requiresIRQL(DISPATCH_LEVEL)
+__MacReleaseLockExclusive(
+ IN PXENVIF_MAC Mac
+ )
+{
+ ASSERT3U(KeGetCurrentIrql(), ==, DISPATCH_LEVEL);
+
+#pragma prefast(disable:26110)
+ ExReleaseSpinLockExclusiveFromDpcLevel(&Mac->Lock);
+}
+
+static FORCEINLINE VOID
+__drv_requiresIRQL(DISPATCH_LEVEL)
+__MacAcquireLockShared(
+ IN PXENVIF_MAC Mac
+ )
+{
+ ASSERT3U(KeGetCurrentIrql(), ==, DISPATCH_LEVEL);
+
+ ExAcquireSpinLockSharedAtDpcLevel(&Mac->Lock);
+}
+
+static FORCEINLINE VOID
+__drv_requiresIRQL(DISPATCH_LEVEL)
+__MacReleaseLockShared(
+ IN PXENVIF_MAC Mac
+ )
+{
+ ASSERT3U(KeGetCurrentIrql(), ==, DISPATCH_LEVEL);
+
+#pragma prefast(disable:26110)
+ ExReleaseSpinLockSharedFromDpcLevel(&Mac->Lock);
+}
+
static NTSTATUS
MacDumpAddressTable(
IN PXENVIF_MAC Mac
Frontend = Mac->Frontend;
- KeAcquireSpinLock(&Mac->Lock, &Irql);
+ KeRaiseIrql(DISPATCH_LEVEL, &Irql);
+ __MacAcquireLockShared(Mac);
status = STATUS_UNSUCCESSFUL;
if (!Mac->Connected)
ASSERT3U(Index, ==, Count);
- KeReleaseSpinLock(&Mac->Lock, Irql);
+ __MacReleaseLockShared(Mac);
+ KeLowerIrql(Irql);
(VOID) XENBUS_STORE(Remove,
&Mac->StoreInterface,
fail1:
Error("fail1 (%08x)\n", status);
- KeReleaseSpinLock(&Mac->Lock, Irql);
+ __MacReleaseLockExclusive(Mac);
+ KeLowerIrql(Irql);
return status;
}
ULONG64 Mtu;
NTSTATUS status;
+ ASSERT3U(KeGetCurrentIrql(), ==, DISPATCH_LEVEL);
+
Frontend = Mac->Frontend;
status = XENBUS_DEBUG(Acquire, &Mac->DebugInterface);
if (!NT_SUCCESS(status))
goto fail5;
- KeAcquireSpinLockAtDpcLevel(&Mac->Lock);
+ __MacAcquireLockExclusive(Mac);
+
ASSERT(!Mac->Connected);
Mac->Connected = TRUE;
- KeReleaseSpinLockFromDpcLevel(&Mac->Lock);
+
+ __MacReleaseLockExclusive(Mac);
(VOID) MacDumpAddressTable(Mac);
Frontend = Mac->Frontend;
ASSERT3U(KeGetCurrentIrql(), ==, DISPATCH_LEVEL);
- KeAcquireSpinLockAtDpcLevel(&Mac->Lock);
+
+ __MacAcquireLockExclusive(Mac);
Thread = VifGetMacThread(PdoGetVifContext(FrontendGetPdo(Frontend)));
ASSERT(!Mac->Enabled);
Mac->Enabled = TRUE;
- KeReleaseSpinLockFromDpcLevel(&Mac->Lock);
+ __MacReleaseLockExclusive(Mac);
Trace("<====\n");
return STATUS_SUCCESS;
fail1:
Error("fail1 (%08x)\n");
- KeReleaseSpinLockFromDpcLevel(&Mac->Lock);
+ __MacReleaseLockExclusive(Mac);
return status;
}
Frontend = Mac->Frontend;
ASSERT3U(KeGetCurrentIrql(), ==, DISPATCH_LEVEL);
- KeAcquireSpinLockAtDpcLevel(&Mac->Lock);
+
+ __MacAcquireLockExclusive(Mac);
ASSERT(Mac->Enabled);
Mac->Enabled = FALSE;
Mac->Watch);
Mac->Watch = NULL;
- KeReleaseSpinLockFromDpcLevel(&Mac->Lock);
+ __MacReleaseLockExclusive(Mac);
Trace("<====\n");
}
Frontend = Mac->Frontend;
- KeAcquireSpinLockAtDpcLevel(&Mac->Lock);
+ ASSERT3U(KeGetCurrentIrql(), ==, DISPATCH_LEVEL);
+
+ __MacAcquireLockExclusive(Mac);
+
ASSERT(Mac->Connected);
Mac->Connected = FALSE;
- KeReleaseSpinLockFromDpcLevel(&Mac->Lock);
+
+ __MacReleaseLockExclusive(Mac);
XENBUS_DEBUG(Deregister,
&Mac->DebugInterface,
RtlZeroMemory(&Mac->DebugInterface,
sizeof (XENBUS_DEBUG_INTERFACE));
- RtlZeroMemory(&Mac->Lock, sizeof (KSPIN_LOCK));
+ Mac->Lock = 0;
ASSERT(IsZeroMemory(Mac, sizeof (XENVIF_MAC)));
__MacFree(Mac);
Multicast->Address = *Address;
- KeAcquireSpinLock(&Mac->Lock, &Irql);
+ KeRaiseIrql(DISPATCH_LEVEL, &Irql);
+ __MacAcquireLockExclusive(Mac);
+
InsertTailList(&Mac->MulticastList, &Multicast->ListEntry);
Mac->MulticastCount++;
- KeReleaseSpinLock(&Mac->Lock, Irql);
+
+ __MacReleaseLockExclusive(Mac);
+ KeLowerIrql(Irql);
(VOID) MacDumpAddressTable(Mac);
Frontend = Mac->Frontend;
- KeAcquireSpinLock(&Mac->Lock, &Irql);
+ KeRaiseIrql(DISPATCH_LEVEL, &Irql);
+ __MacAcquireLockExclusive(Mac);
for (ListEntry = Mac->MulticastList.Flink;
ListEntry != &Mac->MulticastList;
RemoveEntryList(&Multicast->ListEntry);
__MacFree(Multicast);
- KeReleaseSpinLock(&Mac->Lock, Irql);
+ __MacReleaseLockExclusive(Mac);
+ KeLowerIrql(Irql);
(VOID) MacDumpAddressTable(Mac);
fail1:
Error("fail1 (%08x)\n", status);
- KeReleaseSpinLock(&Mac->Lock, Irql);
+ __MacReleaseLockExclusive(Mac);
+ KeLowerIrql(Irql);
return status;
}
KIRQL Irql;
NTSTATUS status;
- KeAcquireSpinLock(&Mac->Lock, &Irql);
+ KeRaiseIrql(DISPATCH_LEVEL, &Irql);
+ __MacAcquireLockShared(Mac);
status = STATUS_BUFFER_OVERFLOW;
if (Address == NULL || *Count < Mac->MulticastCount)
}
ASSERT3U(*Count, ==, Mac->MulticastCount);
- KeReleaseSpinLock(&Mac->Lock, Irql);
+ __MacReleaseLockShared(Mac);
+ KeLowerIrql(Irql);
return STATUS_SUCCESS;
fail1:
*Count = Mac->MulticastCount;
- KeReleaseSpinLock(&Mac->Lock, Irql);
+ __MacReleaseLockExclusive(Mac);
+ KeLowerIrql(Irql);
return status;
}
if (Type >= ETHERNET_ADDRESS_TYPE_COUNT)
goto fail1;
- KeAcquireSpinLock(&Mac->Lock, &Irql);
+ KeRaiseIrql(DISPATCH_LEVEL, &Irql);
+ __MacAcquireLockExclusive(Mac);
status = STATUS_INVALID_PARAMETER;
if (Level > XENVIF_MAC_FILTER_ALL || Level < XENVIF_MAC_FILTER_NONE)
goto fail2;
Mac->FilterLevel[Type] = Level;
- KeReleaseSpinLock(&Mac->Lock, Irql);
+
+ __MacReleaseLockExclusive(Mac);
+ KeLowerIrql(Irql);
return STATUS_SUCCESS;
fail2:
Error("fail2\n");
- KeReleaseSpinLock(&Mac->Lock, Irql);
+ __MacReleaseLockExclusive(Mac);
+ KeLowerIrql(Irql);
fail1:
Error("fail1 (%08x)\n", status);
OUT PXENVIF_MAC_FILTER_LEVEL Level
)
{
+ KIRQL Irql;
NTSTATUS status;
status = STATUS_INVALID_PARAMETER;
if (Type >= ETHERNET_ADDRESS_TYPE_COUNT)
goto fail1;
+ KeRaiseIrql(DISPATCH_LEVEL, &Irql);
+ __MacAcquireLockShared(Mac);
+
*Level = Mac->FilterLevel[Type];
+ __MacReleaseLockShared(Mac);
+ KeLowerIrql(Irql);
+
return STATUS_SUCCESS;
fail1:
{
ETHERNET_ADDRESS_TYPE Type;
BOOLEAN Allow;
+ KIRQL Irql;
Type = GET_ETHERNET_ADDRESS_TYPE(DestinationAddress);
Allow = FALSE;
- ASSERT3U(KeGetCurrentIrql(), ==, DISPATCH_LEVEL);
- KeAcquireSpinLockAtDpcLevel(&Mac->Lock);
+ KeRaiseIrql(DISPATCH_LEVEL, &Irql);
+ __MacAcquireLockShared(Mac);
switch (Type) {
case ETHERNET_ADDRESS_UNICAST:
break;
}
- KeReleaseSpinLockFromDpcLevel(&Mac->Lock);
+ __MacReleaseLockShared(Mac);
+ KeLowerIrql(Irql);
return Allow;
}