Please consider removing the lock from OvsGetQueue() and holding it by the 
caller so getting the queue and inserting elements to it would be atopmic?
Thanks,
Eirtan

-----Original Message-----
From: dev [mailto:dev-boun...@openvswitch.org] On Behalf Of Ankur Sharma
Sent: Monday, October 20, 2014 5:35 PM
To: dev@openvswitch.org
Subject: [ovs-dev] [PATCH v1 4/6] datapath-windows: Add code for OvsGetQueue.

Signed-off-by: Ankur Sharma <ankursha...@vmware.com>
---
 datapath-windows/ovsext/User.c | 45 +++++++++++++++++++++++++++++++++++++-----
 1 file changed, 40 insertions(+), 5 deletions(-)

diff --git a/datapath-windows/ovsext/User.c b/datapath-windows/ovsext/User.c 
index 42473ab..95b8652 100644
--- a/datapath-windows/ovsext/User.c
+++ b/datapath-windows/ovsext/User.c
@@ -608,16 +608,35 @@ OvsGetNextPacket(POVS_OPEN_INSTANCE instance)
     return CONTAINING_RECORD(link, OVS_PACKET_QUEUE_ELEM, link);  }
 
-
+/*
+ * 
+-----------------------------------------------------------------------
+----
+ * Given a pid, returns the corresponding USER_PACKET_QUEUE.
+ * 
+-----------------------------------------------------------------------
+----
+ */
 POVS_USER_PACKET_QUEUE
 OvsGetQueue(UINT32 pid)
 {
-    /* XXX To be implemented. Return the queue assoiated with the pid*/
-    UNREFERENCED_PARAMETER(pid);
-    ASSERT(FALSE);
-    return NULL;
+    POVS_OPEN_INSTANCE instance;
+    POVS_USER_PACKET_QUEUE ret = NULL;
+
+    OvsAcquireCtrlLock();
+    instance = OvsGetPidInstance(gOvsSwitchContext, pid);
+
+    if (instance) {
+        ret = instance->packetQueue;
+    }
+
+    OvsReleaseCtrlLock();
+
+    return ret;
 }
 
+/*
+ * 
+-----------------------------------------------------------------------
+----
+ * Given a pid, returns the corresponding instance.
+ * gOvsCtrlLock must be acquired before calling this API.
+ * 
+-----------------------------------------------------------------------
+----
+ */
 POVS_OPEN_INSTANCE
 OvsGetPidInstance(POVS_SWITCH_CONTEXT switchContext, UINT32 pid)  { @@ -635,6 
+654,12 @@ OvsGetPidInstance(POVS_SWITCH_CONTEXT switchContext, UINT32 pid)
     return NULL;
 }
 
+/*
+ * 
+-----------------------------------------------------------------------
+----
+ * Given a pid and an instance. This API adds instance to pidHashArray.
+ * gOvsCtrlLock must be acquired before calling this API.
+ * 
+-----------------------------------------------------------------------
+----
+ */
 VOID
 OvsAddPidInstance(POVS_SWITCH_CONTEXT switchContext, UINT32 pid,
                   POVS_OPEN_INSTANCE instance) @@ -647,6 +672,12 @@ 
OvsAddPidInstance(POVS_SWITCH_CONTEXT switchContext, UINT32 pid,
                    &(instance->pidLink));  }
 
+/*
+ * 
+-----------------------------------------------------------------------
+----
+ * Given a pid and an instance. This API removes instance from pidHashArray.
+ * gOvsCtrlLock must be acquired before calling this API.
+ * 
+-----------------------------------------------------------------------
+----
+ */
 VOID
 OvsDelPidInstance(POVS_SWITCH_CONTEXT switchContext, UINT32 pid)  { @@ -903,6 
+934,10 @@ OvsGetPid(POVS_VPORT_ENTRY vport, PNET_BUFFER nb, UINT32 *pid)  {
     UNREFERENCED_PARAMETER(nb);
 
+    if (!vport) {
+        return STATUS_INVALID_PARAMETER;
+    }
+
     /* XXX select a pid from an array of pids using a flow based hash */
     *pid = vport->upcallPid;
     return STATUS_SUCCESS;
--
1.9.1

_______________________________________________
dev mailing list
dev@openvswitch.org
https://urldefense.proofpoint.com/v1/url?u=http://openvswitch.org/mailman/listinfo/dev&k=oIvRg1%2BdGAgOoM1BIlLLqw%3D%3D%0A&r=yTvML8OxA42Jb6ViHe7fUXbvPVOYDPVq87w43doxtlY%3D%0A&m=yyrDWvvn%2BRUDmL5QbF%2FwWkGroacEOzXO6yFXxLT0jSs%3D%0A&s=01096d2a0333004ff7e0ddc464bb61b7abd4d9d30483e55b058895eb96d1f19f
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to