[ovs-dev] [PATCH v2 5/6] datapath-windows: Refactor CreateQueue function to handle vport pid.
Ankur Sharma
ankursharma at vmware.com
Wed Oct 22 00:24:39 UTC 2014
Refactored CreateQueue function so that packets are enqueued to correct corresponding queue.
Signed-off-by: Ankur Sharma <ankursharma at vmware.com>
---
datapath-windows/ovsext/Actions.c | 4 +-
datapath-windows/ovsext/PacketIO.c | 2 +-
datapath-windows/ovsext/Tunnel.c | 2 +-
datapath-windows/ovsext/User.c | 78 +++++++++++++++++++++++---------------
datapath-windows/ovsext/User.h | 4 +-
5 files changed, 53 insertions(+), 37 deletions(-)
diff --git a/datapath-windows/ovsext/Actions.c b/datapath-windows/ovsext/Actions.c
index 408b9be..f5ce12e 100644
--- a/datapath-windows/ovsext/Actions.c
+++ b/datapath-windows/ovsext/Actions.c
@@ -564,7 +564,7 @@ OvsDoFlowLookupOutput(OvsForwardingContext *ovsFwdCtx)
ovsFwdCtx->tunnelRxNic != NULL, &ovsFwdCtx->layers,
ovsFwdCtx->switchContext, &missedPackets, &num);
if (num) {
- OvsQueuePackets(OVS_DEFAULT_PACKET_QUEUE, &missedPackets, num);
+ OvsQueuePackets(&missedPackets, num);
}
if (status == NDIS_STATUS_SUCCESS) {
/* Complete the packet since it was copied to user buffer. */
@@ -1495,7 +1495,7 @@ OvsActionsExecute(POVS_SWITCH_CONTEXT switchContext,
LIST_ENTRY missedPackets;
InitializeListHead(&missedPackets);
InsertTailList(&missedPackets, &elem->link);
- OvsQueuePackets(OVS_DEFAULT_PACKET_QUEUE, &missedPackets, 1);
+ OvsQueuePackets(&missedPackets, 1);
dropReason = L"OVS-Completed since packet was copied to "
L"userspace";
} else {
diff --git a/datapath-windows/ovsext/PacketIO.c b/datapath-windows/ovsext/PacketIO.c
index 493c8cb..7eb6ed8 100644
--- a/datapath-windows/ovsext/PacketIO.c
+++ b/datapath-windows/ovsext/PacketIO.c
@@ -314,7 +314,7 @@ dropit:
}
/* Queue the missed packets. */
- OvsQueuePackets(OVS_DEFAULT_PACKET_QUEUE, &missedPackets, num);
+ OvsQueuePackets(&missedPackets, num);
OvsFinalizeCompletionList(&completionList);
}
diff --git a/datapath-windows/ovsext/Tunnel.c b/datapath-windows/ovsext/Tunnel.c
index eb45454..b55a223 100644
--- a/datapath-windows/ovsext/Tunnel.c
+++ b/datapath-windows/ovsext/Tunnel.c
@@ -320,7 +320,7 @@ OvsInjectPacketThroughActions(PNET_BUFFER_LIST pNbl,
if (elem) {
/* Complete the packet since it was copied to user buffer. */
InsertTailList(&missedPackets, &elem->link);
- OvsQueuePackets(OVS_DEFAULT_PACKET_QUEUE, &missedPackets, 1);
+ OvsQueuePackets(&missedPackets, 1);
} else {
status = STATUS_INSUFFICIENT_RESOURCES;
}
diff --git a/datapath-windows/ovsext/User.c b/datapath-windows/ovsext/User.c
index 54f9682..6797350 100644
--- a/datapath-windows/ovsext/User.c
+++ b/datapath-windows/ovsext/User.c
@@ -687,55 +687,66 @@ OvsDelPidInstance(POVS_SWITCH_CONTEXT switchContext, UINT32 pid)
}
VOID
-OvsQueuePackets(UINT32 queueId,
- PLIST_ENTRY packetList,
+OvsQueuePackets(PLIST_ENTRY packetList,
UINT32 numElems)
{
- POVS_USER_PACKET_QUEUE queue = OvsGetQueue(queueId);
+ POVS_USER_PACKET_QUEUE upcallQueue = NULL;
POVS_PACKET_QUEUE_ELEM elem;
PIRP irp = NULL;
PLIST_ENTRY link;
UINT32 num = 0;
+ LIST_ENTRY dropPackets;
- OVS_LOG_LOUD("Enter: queueId %u, numELems: %u",
- queueId, numElems);
- if (queue == NULL) {
- goto cleanup;
- }
+ OVS_LOG_LOUD("Enter: numELems: %u", numElems);
- NdisAcquireSpinLock(&queue->queueLock);
- if (queue->instance == NULL) {
- NdisReleaseSpinLock(&queue->queueLock);
- goto cleanup;
- } else {
- OvsAppendList(&queue->packetList, packetList);
- queue->numPackets += numElems;
- }
- if (queue->pendingIrp) {
- PDRIVER_CANCEL cancelRoutine;
- irp = queue->pendingIrp;
- queue->pendingIrp = NULL;
- cancelRoutine = IoSetCancelRoutine(irp, NULL);
- if (cancelRoutine == NULL) {
- irp = NULL;
- }
- }
- NdisReleaseSpinLock(&queue->queueLock);
- if (irp) {
- OvsCompleteIrpRequest(irp, 0, STATUS_SUCCESS);
- }
+ InitializeListHead(&dropPackets);
-cleanup:
while (!IsListEmpty(packetList)) {
link = RemoveHeadList(packetList);
elem = CONTAINING_RECORD(link, OVS_PACKET_QUEUE_ELEM, link);
+
+ OvsAcquireCtrlLock();
+
+ upcallQueue = OvsGetQueue(elem->upcallPid);
+ if (!upcallQueue) {
+ /* No upcall queue found, drop this packet. */
+ InsertTailList(&dropPackets, &elem->link);
+ } else {
+ NdisAcquireSpinLock(&upcallQueue->queueLock);
+
+ if (upcallQueue->instance == NULL) {
+ InsertTailList(&dropPackets, &elem->link);
+ } else {
+ InsertTailList(&upcallQueue->packetList, &elem->link);
+ upcallQueue->numPackets ++;
+
+ if (upcallQueue->pendingIrp) {
+ PDRIVER_CANCEL cancelRoutine;
+ irp = upcallQueue->pendingIrp;
+ upcallQueue->pendingIrp = NULL;
+ cancelRoutine = IoSetCancelRoutine(irp, NULL);
+ if (cancelRoutine == NULL) {
+ irp = NULL;
+ }
+ }
+ }
+
+ NdisReleaseSpinLock(&upcallQueue->queueLock);
+ }
+
+ OvsReleaseCtrlLock();
+ }
+
+ while (!IsListEmpty(&dropPackets)) {
+ link = RemoveHeadList(&dropPackets);
+ elem = CONTAINING_RECORD(link, OVS_PACKET_QUEUE_ELEM, link);
OvsFreeMemory(elem);
num++;
}
+
OVS_LOG_LOUD("Exit: drop %u packets", num);
}
-
/*
*----------------------------------------------------------------------------
* OvsCreateAndAddPackets --
@@ -932,6 +943,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;
@@ -1029,6 +1044,7 @@ OvsCreateQueueNlPacket(PVOID userData,
return NULL;
}
elem->hdrInfo.value = hdrInfo->value;
+ elem->upcallPid = pid;
elem->packet.totalLen = nlMsgSize;
/* XXX remove queueid */
elem->packet.queue = 0;
diff --git a/datapath-windows/ovsext/User.h b/datapath-windows/ovsext/User.h
index 47fb10b..69bba09 100644
--- a/datapath-windows/ovsext/User.h
+++ b/datapath-windows/ovsext/User.h
@@ -49,6 +49,7 @@ typedef struct _OVS_USER_PACKET_QUEUE {
} OVS_USER_PACKET_QUEUE, *POVS_USER_PACKET_QUEUE;
typedef struct _OVS_PACKET_QUEUE_ELEM {
+ UINT32 upcallPid;
LIST_ENTRY link;
OVS_PACKET_HDR_INFO hdrInfo;
OVS_PACKET_INFO packet;
@@ -78,8 +79,7 @@ POVS_PACKET_QUEUE_ELEM OvsCreateQueueNlPacket(PVOID userData,
BOOLEAN isRecv,
POVS_PACKET_HDR_INFO hdrInfo);
-VOID OvsQueuePackets(UINT32 queueId, PLIST_ENTRY packetList,
- UINT32 numElems);
+VOID OvsQueuePackets(PLIST_ENTRY packetList, UINT32 numElems);
NTSTATUS OvsCreateAndAddPackets(PVOID userData,
UINT32 userDataLen,
UINT32 cmd,
--
1.9.1
More information about the dev
mailing list