Skip to content

Commit

Permalink
datapath-windows: Avoid unnecessary vport array search
Browse files Browse the repository at this point in the history
Signed-off-by: Sorin Vinturis <svinturis@cloudbasesolutions.com>
Acked-by: Sairam Venugopal <vsairam@vmware.com>
Signed-off-by: Ben Pfaff <blp@nicira.com>
  • Loading branch information
svinturis authored and blp committed Sep 29, 2015
1 parent 7804f00 commit bde6bf4
Show file tree
Hide file tree
Showing 6 changed files with 29 additions and 32 deletions.
20 changes: 10 additions & 10 deletions datapath-windows/ovsext/Actions.c
Expand Up @@ -566,9 +566,10 @@ OvsDoFlowLookupOutput(OvsForwardingContext *ovsFwdCtx)

/* Assert that in the Rx direction, key is always setup. */
ASSERT(ovsFwdCtx->tunnelRxNic == NULL || ovsFwdCtx->tunKey.dst != 0);
status = OvsExtractFlow(ovsFwdCtx->curNbl, ovsFwdCtx->srcVportNo,
&key, &ovsFwdCtx->layers, ovsFwdCtx->tunKey.dst != 0 ?
&ovsFwdCtx->tunKey : NULL);
status =
OvsExtractFlow(ovsFwdCtx->curNbl, ovsFwdCtx->srcVportNo,
&key, &ovsFwdCtx->layers,
ovsFwdCtx->tunKey.dst != 0 ? &ovsFwdCtx->tunKey : NULL);
if (status != NDIS_STATUS_SUCCESS) {
OvsCompleteNBLForwardingCtx(ovsFwdCtx,
L"OVS-Flow extract failed");
Expand All @@ -581,18 +582,17 @@ OvsDoFlowLookupOutput(OvsForwardingContext *ovsFwdCtx)
OvsFlowUsed(flow, ovsFwdCtx->curNbl, &ovsFwdCtx->layers);
ovsFwdCtx->switchContext->datapath.hits++;
status = OvsActionsExecute(ovsFwdCtx->switchContext,
ovsFwdCtx->completionList, ovsFwdCtx->curNbl,
ovsFwdCtx->srcVportNo, ovsFwdCtx->sendFlags,
&key, &hash, &ovsFwdCtx->layers,
flow->actions, flow->actionsLen);
ovsFwdCtx->completionList, ovsFwdCtx->curNbl,
ovsFwdCtx->srcVportNo, ovsFwdCtx->sendFlags,
&key, &hash, &ovsFwdCtx->layers,
flow->actions, flow->actionsLen);
ovsFwdCtx->curNbl = NULL;
} else {
LIST_ENTRY missedPackets;
UINT32 num = 0;
ovsFwdCtx->switchContext->datapath.misses++;
InitializeListHead(&missedPackets);
status = OvsCreateAndAddPackets(NULL, 0, OVS_PACKET_CMD_MISS,
ovsFwdCtx->srcVportNo,
status = OvsCreateAndAddPackets(NULL, 0, OVS_PACKET_CMD_MISS, vport,
&key,ovsFwdCtx->curNbl,
ovsFwdCtx->tunnelRxNic != NULL, &ovsFwdCtx->layers,
ovsFwdCtx->switchContext, &missedPackets, &num);
Expand Down Expand Up @@ -1530,7 +1530,7 @@ OvsActionsExecute(POVS_SWITCH_CONTEXT switchContext,
elem = OvsCreateQueueNlPacket((PVOID)userdataAttr,
userdataAttr->nlaLen,
OVS_PACKET_CMD_ACTION,
portNo, key,ovsFwdCtx.curNbl,
vport, key, ovsFwdCtx.curNbl,
NET_BUFFER_LIST_FIRST_NB(ovsFwdCtx.curNbl),
isRecv,
layers);
Expand Down
6 changes: 3 additions & 3 deletions datapath-windows/ovsext/PacketIO.c
Expand Up @@ -333,8 +333,8 @@ OvsStartNBLIngress(POVS_SWITCH_CONTEXT switchContext,
* Otherwise, it adds it to the completionList. No need to
* check the return value. */
OvsActionsExecute(switchContext, &completionList, curNbl,
portNo, SendFlags, &key, &hash, &layers,
flow->actions, flow->actionsLen);
portNo, SendFlags, &key, &hash, &layers,
flow->actions, flow->actionsLen);
OvsReleaseDatapath(datapath, &dpLockState);
NdisReleaseRWLock(switchContext->dispatchLock, &lockState);
continue;
Expand All @@ -343,7 +343,7 @@ OvsStartNBLIngress(POVS_SWITCH_CONTEXT switchContext,

datapath->misses++;
status = OvsCreateAndAddPackets(NULL, 0, OVS_PACKET_CMD_MISS,
portNo, &key, curNbl,
vport, &key, curNbl,
sourcePort == switchContext->virtualExternalPortId,
&layers, switchContext, &missedPackets, &num);
if (status == NDIS_STATUS_SUCCESS) {
Expand Down
10 changes: 5 additions & 5 deletions datapath-windows/ovsext/PacketIO.h
Expand Up @@ -49,11 +49,11 @@ VOID OvsSendNBLIngress(POVS_SWITCH_CONTEXT switchContext,
ULONG sendFlags);

NDIS_STATUS OvsActionsExecute(POVS_SWITCH_CONTEXT switchContext,
OvsCompletionList *completionList,
PNET_BUFFER_LIST curNbl, UINT32 srcVportNo,
ULONG sendFlags, OvsFlowKey *key, UINT64 *hash,
OVS_PACKET_HDR_INFO *layers,
const PNL_ATTR actions, int actionsLen);
OvsCompletionList *completionList,
PNET_BUFFER_LIST curNbl, UINT32 srcVportNo,
ULONG sendFlags, OvsFlowKey *key, UINT64 *hash,
OVS_PACKET_HDR_INFO *layers,
const PNL_ATTR actions, int actionsLen);

VOID OvsLookupFlowOutput(POVS_SWITCH_CONTEXT switchContext,
VOID *compList, PNET_BUFFER_LIST curNbl);
Expand Down
8 changes: 4 additions & 4 deletions datapath-windows/ovsext/Tunnel.c
Expand Up @@ -309,17 +309,17 @@ OvsInjectPacketThroughActions(PNET_BUFFER_LIST pNbl,
datapath->hits++;

OvsActionsExecute(gOvsSwitchContext, &completionList, pNbl,
portNo, SendFlags, &key, &hash, &layers,
flow->actions, flow->actionsLen);
portNo, SendFlags, &key, &hash, &layers,
flow->actions, flow->actionsLen);

OvsReleaseDatapath(datapath, &dpLockState);
} else {
POVS_PACKET_QUEUE_ELEM elem;

datapath->misses++;
elem = OvsCreateQueueNlPacket(NULL, 0, OVS_PACKET_CMD_MISS,
portNo, &key, pNbl, curNb,
TRUE, &layers);
vport, &key, pNbl, curNb,
TRUE, &layers);
if (elem) {
/* Complete the packet since it was copied to user buffer. */
InsertTailList(&missedPackets, &elem->link);
Expand Down
12 changes: 4 additions & 8 deletions datapath-windows/ovsext/User.c
Expand Up @@ -772,7 +772,7 @@ NTSTATUS
OvsCreateAndAddPackets(PVOID userData,
UINT32 userDataLen,
UINT32 cmd,
UINT32 inPort,
POVS_VPORT_ENTRY vport,
OvsFlowKey *key,
PNET_BUFFER_LIST nbl,
BOOLEAN isRecv,
Expand Down Expand Up @@ -809,7 +809,7 @@ OvsCreateAndAddPackets(PVOID userData,
nb = NET_BUFFER_LIST_FIRST_NB(nbl);
while (nb) {
elem = OvsCreateQueueNlPacket(userData, userDataLen,
cmd, inPort, key, nbl, nb,
cmd, vport, key, nbl, nb,
isRecv, hdrInfo);
if (elem) {
InsertTailList(list, &elem->link);
Expand Down Expand Up @@ -988,7 +988,7 @@ POVS_PACKET_QUEUE_ELEM
OvsCreateQueueNlPacket(PVOID userData,
UINT32 userDataLen,
UINT32 cmd,
UINT32 inPort,
POVS_VPORT_ENTRY vport,
OvsFlowKey *key,
PNET_BUFFER_LIST nbl,
PNET_BUFFER nb,
Expand All @@ -1007,10 +1007,6 @@ OvsCreateQueueNlPacket(PVOID userData,
NL_BUFFER nlBuf;
PNL_MSG_HDR nlMsg;

/* XXX pass vport in the stack rather than portNo */
POVS_VPORT_ENTRY vport =
OvsFindVportByPortNo(gOvsSwitchContext, inPort);

if (vport == NULL){
/* No vport is not fatal. */
return NULL;
Expand Down Expand Up @@ -1062,7 +1058,7 @@ OvsCreateQueueNlPacket(PVOID userData,
elem->packet.queue = 0;
/* XXX no need as the length is already in the NL attrib */
elem->packet.userDataLen = userDataLen;
elem->packet.inPort = inPort;
elem->packet.inPort = vport->portNo;
elem->packet.cmd = cmd;
if (cmd == (UINT32)OVS_PACKET_CMD_MISS) {
ovsUserStats.miss++;
Expand Down
5 changes: 3 additions & 2 deletions datapath-windows/ovsext/User.h
Expand Up @@ -72,7 +72,8 @@ VOID OvsCleanupPacketQueue(struct _OVS_OPEN_INSTANCE *instance);

POVS_PACKET_QUEUE_ELEM OvsCreateQueueNlPacket(PVOID userData,
UINT32 userDataLen,
UINT32 cmd, UINT32 inPort,
UINT32 cmd,
POVS_VPORT_ENTRY vport,
OvsFlowKey *key,
PNET_BUFFER_LIST nbl,
PNET_BUFFER nb,
Expand All @@ -83,7 +84,7 @@ VOID OvsQueuePackets(PLIST_ENTRY packetList, UINT32 numElems);
NTSTATUS OvsCreateAndAddPackets(PVOID userData,
UINT32 userDataLen,
UINT32 cmd,
UINT32 inPort,
POVS_VPORT_ENTRY vport,
OvsFlowKey *key,
PNET_BUFFER_LIST nbl,
BOOLEAN isRecv,
Expand Down

0 comments on commit bde6bf4

Please sign in to comment.