summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYang You (UU) <[email protected]>2025-12-04 15:56:22 -0800
committerYang You (UU) <[email protected]>2025-12-04 15:56:22 -0800
commitfcb9e29e5dfe0c36b9090fbcb43c832af3599907 (patch)
tree0c083eb6886cc1357a19c074af97114d57539cfd
parent10835ebc2bc4a774907fb47880ffc366b159622c (diff)
bring back the KPushLock
-rw-r--r--network/netadaptercx/netvadapterlibrary/code/enl.cpp3
-rw-r--r--network/netadaptercx/netvadapterlibrary/code/enl.h2
-rw-r--r--network/netadaptercx/netvadapterlibrary/code/rtl/KCriticalRegion.h2
-rw-r--r--network/netadaptercx/netvadapterlibrary/code/rtl/KDebug.h31
-rw-r--r--network/netadaptercx/netvadapterlibrary/code/rtl/KLockHolder.h2
-rw-r--r--network/netadaptercx/netvadapterlibrary/code/rtl/KPushLock.h106
-rw-r--r--network/netadaptercx/netvadapterlibrary/code/rtl/KWaitEvent.h2
7 files changed, 103 insertions, 45 deletions
diff --git a/network/netadaptercx/netvadapterlibrary/code/enl.cpp b/network/netadaptercx/netvadapterlibrary/code/enl.cpp
index 4087372d..4d4120b8 100644
--- a/network/netadaptercx/netvadapterlibrary/code/enl.cpp
+++ b/network/netadaptercx/netvadapterlibrary/code/enl.cpp
@@ -6,6 +6,7 @@
#include "txqueue.h"
#include "trace.h"
#include "memory.h"
+#include "rtl\KLockHolder.h"
#include "enl.tmh"
///////////////////////////////////////////////////////////////////////////////
@@ -759,7 +760,7 @@ EnlDeactivateLinkPort(
ULONG i;
NT_FRE_ASSERT(EnlIsPortActive(EnlLink, PortIndex));
- //KLockThisExclusive(EnlLink->Lock);
+ KLockThisExclusive(EnlLink->Lock);
NT_FRE_ASSERT(!EnlpIsThreadPaused(&EnlLink->EnlThread));
EnlpPauseThread(&EnlLink->EnlThread);
diff --git a/network/netadaptercx/netvadapterlibrary/code/enl.h b/network/netadaptercx/netvadapterlibrary/code/enl.h
index 41f8d11d..2927a582 100644
--- a/network/netadaptercx/netvadapterlibrary/code/enl.h
+++ b/network/netadaptercx/netvadapterlibrary/code/enl.h
@@ -27,6 +27,7 @@
#endif
#include "rtl/KWaitEvent.h"
+#include "rtl/KPushLock.h"
#define ENL_MAX_PROC_COUNT 16
#define ENLP_PORT_COUNT 2
@@ -237,6 +238,7 @@ struct DECLSPEC_ALIGN(PAGE_SIZE) ENLP_PORT
struct ENLP_LINK
{
+ KPushLock Lock{};
ULONG64 Ts{};
ULONG64 BusyTicks{};
ULONG64 EmptyTicks{};
diff --git a/network/netadaptercx/netvadapterlibrary/code/rtl/KCriticalRegion.h b/network/netadaptercx/netvadapterlibrary/code/rtl/KCriticalRegion.h
index 3f226355..0bbedadb 100644
--- a/network/netadaptercx/netvadapterlibrary/code/rtl/KCriticalRegion.h
+++ b/network/netadaptercx/netvadapterlibrary/code/rtl/KCriticalRegion.h
@@ -1,4 +1,4 @@
-
+// Copyright (C) Microsoft Corporation. All rights reserved.
#pragma once
#include <KMacros.h>
diff --git a/network/netadaptercx/netvadapterlibrary/code/rtl/KDebug.h b/network/netadaptercx/netvadapterlibrary/code/rtl/KDebug.h
deleted file mode 100644
index d90e6056..00000000
--- a/network/netadaptercx/netvadapterlibrary/code/rtl/KDebug.h
+++ /dev/null
@@ -1,31 +0,0 @@
-
-#pragma once
-
-#include <KMacros.h>
-
-template<ULONG SIGNATURE>
-struct KRTL_CLASS NdisDebugBlock
-{
-#if DBG
- PAGED ~NdisDebugBlock()
- {
- ASSERT_VALID();
- Signature |= 0x80;
- }
-#endif
-
- _IRQL_requires_max_(HIGH_LEVEL)
- NONPAGEDX bool ASSERT_VALID() const
- {
-#if DBG
- return NT_VERIFY(Signature == SIGNATURE);
-#else
- return true;
-#endif
- }
-
-private:
-#if DBG
- ULONG Signature = SIGNATURE;
-#endif
-};
diff --git a/network/netadaptercx/netvadapterlibrary/code/rtl/KLockHolder.h b/network/netadaptercx/netvadapterlibrary/code/rtl/KLockHolder.h
index 1e21c0f2..d398f137 100644
--- a/network/netadaptercx/netvadapterlibrary/code/rtl/KLockHolder.h
+++ b/network/netadaptercx/netvadapterlibrary/code/rtl/KLockHolder.h
@@ -1,4 +1,4 @@
-
+// Copyright (C) Microsoft Corporation. All rights reserved.
#pragma once
#include <KCriticalRegion.h>
diff --git a/network/netadaptercx/netvadapterlibrary/code/rtl/KPushLock.h b/network/netadaptercx/netvadapterlibrary/code/rtl/KPushLock.h
index 81c58071..c589866c 100644
--- a/network/netadaptercx/netvadapterlibrary/code/rtl/KPushLock.h
+++ b/network/netadaptercx/netvadapterlibrary/code/rtl/KPushLock.h
@@ -1,3 +1,4 @@
+// Copyright (C) Microsoft Corporation. All rights reserved.
#pragma once
@@ -5,6 +6,7 @@
#include <KCriticalRegion.h>
typedef struct _KTHREAD *PKTHREAD;
+// Copyright (C) Microsoft Corporation. All rights reserved.
class KPushLockBase
{
@@ -14,21 +16,90 @@ public:
KPushLockBase(KPushLockBase &) = delete;
KPushLockBase & operator=(KPushLockBase &) = delete;
- PAGED void AcquireShared();
+ PAGED
+ void
+ KPushLockBase::AcquireShared()
+ {
+#ifdef _KERNEL_MODE
+ ExAcquirePushLockShared(&m_Lock);
+#else
+ AcquireSRWLockShared(&m_Lock);
+#endif
+ }
- PAGED void ReleaseShared();
+ PAGED
+ void
+ KPushLockBase::ReleaseShared()
+ {
+#ifdef _KERNEL_MODE
+ ExReleasePushLockShared(&m_Lock);
+#else
+ ReleaseSRWLockShared(&m_Lock);
+#endif
+ }
- PAGED void AcquireExclusive();
+ PAGED
+ void
+ KPushLockBase::AcquireExclusive()
+ {
+#ifdef _KERNEL_MODE
+ ExAcquirePushLockExclusive(&m_Lock);
+#if DBG
+ m_ExclusiveOwner = KeGetCurrentThread();
+#endif
+#else
+ AcquireSRWLockExclusive(&m_Lock);
+#endif
- PAGED void ReleaseExclusive();
+ }
- PAGED void AssertLockHeld();
+ PAGED
+ void
+ KPushLockBase::ReleaseExclusive()
+ {
+#if DBG
+ m_ExclusiveOwner = nullptr;
+#endif
+#ifdef _KERNEL_MODE
+ ExReleasePushLockExclusive(&m_Lock);
+#else
+ ReleaseSRWLockExclusive(&m_Lock);
+#endif
+ }
- PAGED void AssertLockNotHeld();
+ PAGED
+ void
+ KPushLockBase::AssertLockHeld()
+ {
+#ifdef _KERNEL_MODE
+ WIN_ASSERT(m_ExclusiveOwner == KeGetCurrentThread());
+#endif
+ }
+
+ PAGED
+ void
+ KPushLockBase::AssertLockNotHeld()
+ {
+#if DBG && defined(_KERNEL_MODE)
+ WIN_ASSERT(m_ExclusiveOwner != KeGetCurrentThread());
+#endif
+ }
protected:
- PAGED void InitializeInner();
+ PAGED
+ void
+ KPushLockBase::InitializeInner()
+ {
+#ifdef _KERNEL_MODE
+ ExInitializePushLock(&m_Lock);
+#else
+ InitializeSRWLock(&m_Lock);
+#endif
+#if DBG
+ m_ExclusiveOwner = nullptr;
+#endif
+ }
private:
@@ -47,15 +118,30 @@ class KPushLock : public KPushLockBase
{
public:
- PAGED KPushLock() noexcept;
+ PAGED
+ KPushLock::KPushLock() noexcept
+ {
+ InitializeInner();
+ }
+
+
- PAGED ~KPushLock();
+ PAGED
+ KPushLock::~KPushLock()
+ {
+ AssertLockNotHeld();
+ }
};
class KPushLockManualConstruct : public KPushLockBase
{
public:
- PAGED void Initialize();
+ PAGED
+ void
+ KPushLockManualConstruct::Initialize()
+ {
+ InitializeInner();
+ }
};
diff --git a/network/netadaptercx/netvadapterlibrary/code/rtl/KWaitEvent.h b/network/netadaptercx/netvadapterlibrary/code/rtl/KWaitEvent.h
index d1287f5b..124f416e 100644
--- a/network/netadaptercx/netvadapterlibrary/code/rtl/KWaitEvent.h
+++ b/network/netadaptercx/netvadapterlibrary/code/rtl/KWaitEvent.h
@@ -1,4 +1,4 @@
-
+// Copyright (C) Microsoft Corporation. All rights reserved.
#pragma once
#include <KMacros.h>