summaryrefslogtreecommitdiff
path: root/network/netadaptercx/netvadapterlibrary/code/memory.cpp
diff options
context:
space:
mode:
authorYang You (UU) <[email protected]>2025-12-02 13:37:13 -0800
committerYang You (UU) <[email protected]>2025-12-02 13:37:13 -0800
commit83019ae0c63454b2835f8fc245c7505351cee677 (patch)
tree0814d281b100265f0dc819b336c4ae2e0c312b40 /network/netadaptercx/netvadapterlibrary/code/memory.cpp
parentee5cca45e2b748ca92e902e876840986fd3d7f18 (diff)
Have the NetVAdapter Lib buildable with EWDK for both UM and KM
Diffstat (limited to 'network/netadaptercx/netvadapterlibrary/code/memory.cpp')
-rw-r--r--network/netadaptercx/netvadapterlibrary/code/memory.cpp77
1 files changed, 77 insertions, 0 deletions
diff --git a/network/netadaptercx/netvadapterlibrary/code/memory.cpp b/network/netadaptercx/netvadapterlibrary/code/memory.cpp
new file mode 100644
index 00000000..6d23f3bc
--- /dev/null
+++ b/network/netadaptercx/netvadapterlibrary/code/memory.cpp
@@ -0,0 +1,77 @@
+// Copyright (C) Microsoft Corporation. All rights reserved.
+#include "pch.hpp"
+#include "memory.h"
+#include <netadaptercx.h>
+#include "trace.h"
+#include "memory.tmh"
+
+NTSTATUS
+Memory::Initialize(
+ NETMEMORYCOLLECTION MemoryCollection,
+ size_t BufferSize
+)
+{
+ m_memoryCollection = MemoryCollection;
+
+ for (size_t i = 0; i < PREALLOCATED_BUFFERS_COUNT; i++)
+ {
+ NET_MEMORY_CONFIG memoryConfig{};
+ NET_MEMORY_CONFIG_INIT(
+ &memoryConfig,
+ m_buffers[i].VirtualAddress,
+ BufferSize);
+
+ RETURN_IF_NOT_STATUS_SUCCESS(
+ NetMemoryCreate(
+ MemoryCollection,
+ &memoryConfig,
+ &m_buffers[i].MemoryId
+ ));
+
+ m_buffersReadyToUse[i] = &m_buffers[i];
+ }
+
+ m_lastBufferToUse = PREALLOCATED_BUFFERS_COUNT;
+ return STATUS_SUCCESS;
+}
+
+void
+Memory::ReleaseAllMappings(
+ void
+)
+{
+ for (size_t i = 0; i < PREALLOCATED_BUFFERS_COUNT; i++)
+ {
+ NetMemoryDestroy(m_memoryCollection, m_buffers[i].MemoryId);
+ }
+
+ m_lastBufferToUse = 0;
+ RtlZeroMemory(m_buffersReadyToUse, sizeof(m_buffersReadyToUse));
+}
+
+MemoryBuffer*
+Memory::PopAvailableBuffer(
+ void
+)
+{
+ KAcquireSpinLock lock{ m_spinLock };
+
+ if (m_lastBufferToUse == 0)
+ {
+ return nullptr;
+ }
+
+ return m_buffersReadyToUse[--m_lastBufferToUse];
+}
+
+void
+Memory::ReturnBuffer(
+ MemoryBuffer* Buffer
+)
+{
+ KAcquireSpinLock lock{ m_spinLock };
+
+ NT_FRE_ASSERT(m_lastBufferToUse < PREALLOCATED_BUFFERS_COUNT);
+
+ m_buffersReadyToUse[m_lastBufferToUse++] = Buffer;
+}