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