diff options
| author | Yang You (UU) <[email protected]> | 2025-12-04 15:56:22 -0800 |
|---|---|---|
| committer | Yang You (UU) <[email protected]> | 2025-12-04 15:56:22 -0800 |
| commit | fcb9e29e5dfe0c36b9090fbcb43c832af3599907 (patch) | |
| tree | 0c083eb6886cc1357a19c074af97114d57539cfd | |
| parent | 10835ebc2bc4a774907fb47880ffc366b159622c (diff) | |
bring back the KPushLock
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> |
