[ovs-dev] [PATCH v2 1/6] datapath-windows: pid-instance hash table data structure.

Sorin Vinturis svinturis at cloudbasesolutions.com
Wed Oct 22 12:43:18 UTC 2014


Acked-by: Sorin Vinturis <svinturis at cloudbasesolutions.com>

-----Original Message-----
From: dev [mailto:dev-bounces at openvswitch.org] On Behalf Of Ankur Sharma
Sent: Wednesday, October 22, 2014 3:25 AM
To: dev at openvswitch.org
Subject: [ovs-dev] [PATCH v2 1/6] datapath-windows: pid-instance hash table data structure.

This patch introduces data structure for holding instances hashed by pid.

Signed-off-by: Ankur Sharma <ankursharma at vmware.com>
---
 datapath-windows/ovsext/Datapath.h |  2 ++
 datapath-windows/ovsext/Switch.c   | 15 ++++++++++++++-
 datapath-windows/ovsext/Switch.h   |  3 +++
 datapath-windows/ovsext/User.c     |  1 +
 4 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/datapath-windows/ovsext/Datapath.h b/datapath-windows/ovsext/Datapath.h
index abbcc1a..221515d 100644
--- a/datapath-windows/ovsext/Datapath.h
+++ b/datapath-windows/ovsext/Datapath.h
@@ -87,6 +87,8 @@ typedef struct _OVS_OPEN_INSTANCE {
                                  * markers can store the row and the column
                                  * indices. */
     } dumpState;                /* data to support dump commands. */
+    LIST_ENTRY             pidLink; /* Links the instance to
+                                     * pidHashArray */
 } OVS_OPEN_INSTANCE, *POVS_OPEN_INSTANCE;
 
 NDIS_STATUS OvsCreateDeviceObject(NDIS_HANDLE ovsExtDriverHandle); diff --git a/datapath-windows/ovsext/Switch.c b/datapath-windows/ovsext/Switch.c
index ac4a847..5593d43 100644
--- a/datapath-windows/ovsext/Switch.c
+++ b/datapath-windows/ovsext/Switch.c
@@ -360,6 +360,8 @@ OvsInitSwitchContext(POVS_SWITCH_CONTEXT switchContext)
         OvsAllocateMemory(sizeof (LIST_ENTRY) * OVS_MAX_VPORT_ARRAY_SIZE);
     switchContext->portIdHashArray= (PLIST_ENTRY)
         OvsAllocateMemory(sizeof (LIST_ENTRY) * OVS_MAX_VPORT_ARRAY_SIZE);
+    switchContext->pidHashArray = (PLIST_ENTRY)
+        OvsAllocateMemory(sizeof(LIST_ENTRY) * OVS_MAX_PID_ARRAY_SIZE);
     status = OvsAllocateFlowTable(&switchContext->datapath, switchContext);
 
     if (status == NDIS_STATUS_SUCCESS) { @@ -369,7 +371,8 @@ OvsInitSwitchContext(POVS_SWITCH_CONTEXT switchContext)
         switchContext->dispatchLock == NULL ||
         switchContext->portNoHashArray == NULL ||
         switchContext->ovsPortNameHashArray == NULL ||
-        switchContext->portIdHashArray== NULL) {
+        switchContext->portIdHashArray== NULL ||
+        switchContext->pidHashArray == NULL) {
         if (switchContext->dispatchLock) {
             NdisFreeRWLock(switchContext->dispatchLock);
         }
@@ -382,6 +385,11 @@ OvsInitSwitchContext(POVS_SWITCH_CONTEXT switchContext)
         if (switchContext->portIdHashArray) {
             OvsFreeMemory(switchContext->portIdHashArray);
         }
+
+        if (switchContext->pidHashArray) {
+            OvsFreeMemory(switchContext->pidHashArray);
+        }
+
         OvsDeleteFlowTable(&switchContext->datapath);
         OvsCleanupBufferPool(switchContext);
 
@@ -399,6 +407,10 @@ OvsInitSwitchContext(POVS_SWITCH_CONTEXT switchContext)
         InitializeListHead(&switchContext->portNoHashArray[i]);
     }
 
+    for (i = 0; i < OVS_MAX_PID_ARRAY_SIZE; i++) {
+        InitializeListHead(&switchContext->pidHashArray[i]);
+    }
+
     switchContext->isActivated = FALSE;
     switchContext->isActivateFailed = FALSE;
     switchContext->dpNo = OVS_DP_NUMBER; @@ -420,6 +432,7 @@ OvsCleanupSwitchContext(POVS_SWITCH_CONTEXT switchContext)
     OvsFreeMemory(switchContext->ovsPortNameHashArray);
     OvsFreeMemory(switchContext->portIdHashArray);
     OvsFreeMemory(switchContext->portNoHashArray);
+    OvsFreeMemory(switchContext->pidHashArray);
     OvsDeleteFlowTable(&switchContext->datapath);
     OvsCleanupBufferPool(switchContext);
     OVS_LOG_TRACE("Exit: Delete switchContext: %p", switchContext); diff --git a/datapath-windows/ovsext/Switch.h b/datapath-windows/ovsext/Switch.h
index ac708b7..7fdca5f 100644
--- a/datapath-windows/ovsext/Switch.h
+++ b/datapath-windows/ovsext/Switch.h
@@ -24,8 +24,10 @@
 #include "NetProto.h"
 #include "BufferMgmt.h"
 #define OVS_MAX_VPORT_ARRAY_SIZE 1024
+#define OVS_MAX_PID_ARRAY_SIZE   1024
 
 #define OVS_VPORT_MASK (OVS_MAX_VPORT_ARRAY_SIZE - 1)
+#define OVS_PID_MASK (OVS_MAX_PID_ARRAY_SIZE - 1)
 
 #define OVS_INTERNAL_VPORT_DEFAULT_INDEX 0
 
@@ -107,6 +109,7 @@ typedef struct _OVS_SWITCH_CONTEXT
     PLIST_ENTRY             ovsPortNameHashArray;   // based on ovsName
     PLIST_ENTRY             portIdHashArray;        // based on portId
     PLIST_ENTRY             portNoHashArray;        // based on ovs port number
+    PLIST_ENTRY             pidHashArray;           // based on packet pids
 
     UINT32                  numPhysicalNics;
     UINT32                  numVports;     // include validation port
diff --git a/datapath-windows/ovsext/User.c b/datapath-windows/ovsext/User.c index 329b964..3e6cda2 100644
--- a/datapath-windows/ovsext/User.c
+++ b/datapath-windows/ovsext/User.c
@@ -143,6 +143,7 @@ OvsSubscribeDpIoctl(PVOID instanceP,
         if (queue == NULL) {
             return STATUS_NO_MEMORY;
         }
+        InitializeListHead(&(instance->pidLink));
         instance->packetQueue = queue;
         RtlZeroMemory(queue, sizeof (*queue));
         NdisAllocateSpinLock(&queue->queueLock);
--
1.9.1

_______________________________________________
dev mailing list
dev at openvswitch.org
http://openvswitch.org/mailman/listinfo/dev



More information about the dev mailing list