}
}
-VOID
+NDIS_STATUS
OvsInit()
{
+ NDIS_STATUS status = NDIS_STATUS_SUCCESS;
+
gOvsCtrlLock = &ovsCtrlLockObj;
NdisAllocateSpinLock(gOvsCtrlLock);
OvsInitEventQueue();
- OvsDeferredActionsQueueAlloc();
- OvsDeferredActionsLevelAlloc();
+
+ status = OvsPerCpuDataInit();
+
+ return status;
}
VOID
OvsCleanup()
{
+ OvsPerCpuDataCleanup();
OvsCleanupEventQueue();
if (gOvsCtrlLock) {
NdisFreeSpinLock(gOvsCtrlLock);
gOvsCtrlLock = NULL;
}
- OvsDeferredActionsQueueFree();
- OvsDeferredActionsLevelFree();
}
VOID
NDIS_STATUS OvsCreateDeviceObject(NDIS_HANDLE ovsExtDriverHandle);
VOID OvsDeleteDeviceObject();
-VOID OvsInit();
+NDIS_STATUS OvsInit();
VOID OvsCleanup();
POVS_OPEN_INSTANCE OvsGetOpenInstance(PFILE_OBJECT fileObject,
UNREFERENCED_PARAMETER(registryPath);
/* Initialize driver associated data structures. */
- OvsInit();
+ status = OvsInit();
+ if (status != NDIS_STATUS_SUCCESS) {
+ goto cleanup;
+ }
gOvsExtDriverObject = driverObject;
{
UNREFERENCED_PARAMETER(driverObject);
- /* Release driver associated data structures. */
- OvsCleanup();
-
OvsDeleteDeviceObject();
NdisFDeregisterFilterDriver(gOvsExtDriverHandle);
+
+ /* Release driver associated data structures. */
+ OvsCleanup();
}
#include "Flow.h"
#include "Jhash.h"
-static POVS_DEFERRED_ACTION_QUEUE ovsDeferredActionQueue = NULL;
-static UINT32* ovsDeferredActionLevel = NULL;
-
/*
* --------------------------------------------------------------------------
- * OvsDeferredActionsQueueAlloc --
- * The function allocates per-cpu deferred actions queue.
+ * '_OVS_DEFERRED_ACTION_QUEUE' structure is responsible for keeping track of
+ * all deferred actions. The maximum number of deferred actions should not
+ * exceed 'DEFERRED_ACTION_QUEUE_SIZE'.
* --------------------------------------------------------------------------
*/
-BOOLEAN
-OvsDeferredActionsQueueAlloc()
-{
- ovsDeferredActionQueue =
- OvsAllocateMemoryPerCpu(sizeof(*ovsDeferredActionQueue),
- OVS_RECIRC_POOL_TAG);
- if (!ovsDeferredActionQueue) {
- return FALSE;
- }
- return TRUE;
-}
+typedef struct _OVS_DEFERRED_ACTION_QUEUE {
+ UINT32 head;
+ UINT32 tail;
+ OVS_DEFERRED_ACTION deferredActions[DEFERRED_ACTION_QUEUE_SIZE];
+} OVS_DEFERRED_ACTION_QUEUE, *POVS_DEFERRED_ACTION_QUEUE;
-/*
- * --------------------------------------------------------------------------
- * OvsDeferredActionsQueueFree --
- * The function frees per-cpu deferred actions queue.
- * --------------------------------------------------------------------------
- */
-VOID
-OvsDeferredActionsQueueFree()
-{
- OvsFreeMemoryWithTag(ovsDeferredActionQueue,
- OVS_RECIRC_POOL_TAG);
- ovsDeferredActionQueue = NULL;
-}
+typedef struct _OVS_DEFERRED_ACTION_DATA {
+ OVS_DEFERRED_ACTION_QUEUE queue;
+ UINT32 level;
+} OVS_DEFERRED_ACTION_DATA, *POVS_DEFERRED_ACTION_DATA;
+
+static POVS_DEFERRED_ACTION_DATA deferredData = NULL;
/*
* --------------------------------------------------------------------------
- * OvsDeferredActionsLevelAlloc --
- * The function allocates per-cpu deferred actions execution level.
+ * OvsDeferredActionsInit --
+ * The function allocates all necessary deferred actions resources.
* --------------------------------------------------------------------------
*/
-BOOLEAN
-OvsDeferredActionsLevelAlloc()
+NTSTATUS
+OvsDeferredActionsInit()
{
- ovsDeferredActionLevel =
- OvsAllocateMemoryPerCpu(sizeof(*ovsDeferredActionLevel),
- OVS_RECIRC_POOL_TAG);
- if (!ovsDeferredActionLevel) {
- return FALSE;
+ NTSTATUS status = STATUS_SUCCESS;
+ ULONG count = KeQueryMaximumProcessorCountEx(ALL_PROCESSOR_GROUPS);
+
+ deferredData = OvsAllocateMemoryPerCpu(sizeof(*deferredData),
+ count,
+ OVS_RECIRC_POOL_TAG);
+ if (!deferredData) {
+ status = NDIS_STATUS_RESOURCES;
}
- return TRUE;
+
+ return status;
}
/*
* --------------------------------------------------------------------------
- * OvsDeferredActionsLevelFree --
- * The function frees per-cpu deferred actions execution level.
+ * OvsDeferredActionsCleanup --
+ * The function frees all deferred actions resources.
* --------------------------------------------------------------------------
*/
VOID
-OvsDeferredActionsLevelFree()
+OvsDeferredActionsCleanup()
{
- OvsFreeMemoryWithTag(ovsDeferredActionLevel,
- OVS_RECIRC_POOL_TAG);
- ovsDeferredActionLevel = NULL;
+ if (deferredData) {
+ OvsFreeMemoryWithTag(deferredData, OVS_RECIRC_POOL_TAG);
+ deferredData = NULL;
+ }
}
/*
}
index = KeGetCurrentProcessorNumberEx(NULL);
- queue = &ovsDeferredActionQueue[index];
+ queue = &deferredData[index].queue;
if (oldIrql < DISPATCH_LEVEL) {
KeLowerIrql(oldIrql);
UINT32
OvsDeferredActionsLevelGet()
{
- UINT32 *level = NULL;
+ UINT32 level = 0;
ULONG index = 0;
KIRQL oldIrql = KeGetCurrentIrql();
}
index = KeGetCurrentProcessorNumberEx(NULL);
- level = &ovsDeferredActionLevel[index];
+ level = deferredData[index].level;
if (oldIrql < DISPATCH_LEVEL) {
KeLowerIrql(oldIrql);
}
- return *level;
+ return level;
}
/*
VOID
OvsDeferredActionsLevelInc()
{
- UINT32 *level = NULL;
ULONG index = 0;
KIRQL oldIrql = KeGetCurrentIrql();
}
index = KeGetCurrentProcessorNumberEx(NULL);
- level = &ovsDeferredActionLevel[index];
- (*level)++;
+ deferredData[index].level++;
if (oldIrql < DISPATCH_LEVEL) {
KeLowerIrql(oldIrql);
VOID
OvsDeferredActionsLevelDec()
{
- UINT32 *level = NULL;
ULONG index = 0;
KIRQL oldIrql = KeGetCurrentIrql();
}
index = KeGetCurrentProcessorNumberEx(NULL);
- level = &ovsDeferredActionLevel[index];
- (*level)--;
+ deferredData[index].level--;
if (oldIrql < DISPATCH_LEVEL) {
KeLowerIrql(oldIrql);
/* Reset the queue for the next packet. */
OvsDeferredActionsQueueInit(queue);
} else {
- deferredAction = &queue->queue[queue->tail++];
+ deferredAction = &queue->deferredActions[queue->tail++];
}
if (oldIrql < DISPATCH_LEVEL) {
}
if (queue->head < DEFERRED_ACTION_QUEUE_SIZE) {
- deferredAction = &queue->queue[queue->head++];
+ deferredAction = &queue->deferredActions[queue->head++];
}
if (oldIrql < DISPATCH_LEVEL) {
OvsFlowKey key;
} OVS_DEFERRED_ACTION, *POVS_DEFERRED_ACTION;
-/*
- * --------------------------------------------------------------------------
- * '_OVS_DEFERRED_ACTION_QUEUE' structure is responsible for keeping track of
- * all deferred actions. The maximum number of deferred actions should not
- * exceed 'DEFERRED_ACTION_QUEUE_SIZE'.
- * --------------------------------------------------------------------------
- */
-typedef struct _OVS_DEFERRED_ACTION_QUEUE {
- UINT32 head;
- UINT32 tail;
- OVS_DEFERRED_ACTION queue[DEFERRED_ACTION_QUEUE_SIZE];
-} OVS_DEFERRED_ACTION_QUEUE, *POVS_DEFERRED_ACTION_QUEUE;
-
/*
* --------------------------------------------------------------------------
* OvsProcessDeferredActions --
/*
* --------------------------------------------------------------------------
- * OvsDeferredActionsQueueAlloc --
- * The function allocates per-cpu deferred actions queue.
- * --------------------------------------------------------------------------
- */
-BOOLEAN
-OvsDeferredActionsQueueAlloc();
-
-/*
- * --------------------------------------------------------------------------
- * OvsDeferredActionsQueueFree --
- * The function frees per-cpu deferred actions queue.
- * --------------------------------------------------------------------------
- */
-VOID
-OvsDeferredActionsQueueFree();
-
-/*
- * --------------------------------------------------------------------------
- * OvsDeferredActionsLevelAlloc --
- * The function allocates per-cpu deferred actions execution level.
+ * OvsDeferredActionsInit --
+ * The function allocates all necessary deferred actions resources.
* --------------------------------------------------------------------------
*/
-BOOLEAN
-OvsDeferredActionsLevelAlloc();
+NTSTATUS
+OvsDeferredActionsInit();
/*
* --------------------------------------------------------------------------
- * OvsDeferredActionsLevelFree --
- * The function frees per-cpu deferred actions execution level.
+ * OvsDeferredActionsCleanup --
+ * The function frees all deferred actions resources.
* --------------------------------------------------------------------------
*/
VOID
-OvsDeferredActionsLevelFree();
+OvsDeferredActionsCleanup();
/*
* --------------------------------------------------------------------------
*/
#include "precomp.h"
+#include "Recirc.h"
#ifdef OVS_DBG_MOD
#undef OVS_DBG_MOD
#endif
}
VOID *
-OvsAllocateMemoryPerCpu(size_t size, ULONG tag)
+OvsAllocateMemoryPerCpu(size_t size,
+ size_t count,
+ ULONG tag)
{
VOID *ptr = NULL;
- ULONG count = KeQueryActiveProcessorCountEx(ALL_PROCESSOR_GROUPS);
ASSERT(KeQueryActiveGroupCount() == 1);
+ if (!count) {
+ count = KeQueryActiveProcessorCountEx(ALL_PROCESSOR_GROUPS);
+ }
+
ptr = OvsAllocateMemoryWithTag(count * size, tag);
if (ptr) {
RtlZeroMemory(ptr, count * size);
return ptr;
}
+
+/*
+ * --------------------------------------------------------------------------
+ * OvsPerCpuDataInit --
+ * The function allocates necessary per-processor resources.
+ * --------------------------------------------------------------------------
+ */
+NTSTATUS
+OvsPerCpuDataInit()
+{
+ return OvsDeferredActionsInit();
+}
+
+/*
+ * --------------------------------------------------------------------------
+ * OvsPerCpuDataCleanup --
+ * The function frees all per-processor resources.
+ * --------------------------------------------------------------------------
+ */
+VOID
+OvsPerCpuDataCleanup()
+{
+ OvsDeferredActionsCleanup();
+}
VOID *OvsAllocateMemory(size_t size);
VOID *OvsAllocateMemoryWithTag(size_t size, ULONG tag);
VOID *OvsAllocateAlignedMemory(size_t size, UINT16 align);
-VOID *OvsAllocateMemoryPerCpu(size_t size, ULONG tag);
+VOID *OvsAllocateMemoryPerCpu(size_t size, size_t count, ULONG tag);
VOID OvsFreeMemory(VOID *ptr);
VOID OvsFreeMemoryWithTag(VOID *ptr, ULONG tag);
VOID OvsFreeAlignedMemory(VOID *ptr);
BOOLEAN OvsCompareString(PVOID string1, PVOID string2);
+/*
+ * --------------------------------------------------------------------------
+ * OvsPerCpuDataInit --
+ * The function allocates necessary per-processor resources.
+ * --------------------------------------------------------------------------
+ */
+NTSTATUS
+OvsPerCpuDataInit();
+
+/*
+ * --------------------------------------------------------------------------
+ * OvsPerCpuDataCleanup --
+ * The function frees all per-processor resources.
+ * --------------------------------------------------------------------------
+ */
+VOID
+OvsPerCpuDataCleanup();
+
#endif /* __UTIL_H_ */