From patchwork Wed Sep 23 12:40:18 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sorin Vinturis X-Patchwork-Id: 521681 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from archives.nicira.com (li376-54.members.linode.com [96.126.127.54]) by ozlabs.org (Postfix) with ESMTP id 394C614018C for ; Wed, 23 Sep 2015 22:40:49 +1000 (AEST) Received: from archives.nicira.com (localhost [127.0.0.1]) by archives.nicira.com (Postfix) with ESMTP id 09C6E10AB9; Wed, 23 Sep 2015 05:40:48 -0700 (PDT) X-Original-To: dev@openvswitch.org Delivered-To: dev@openvswitch.org Received: from mx1e4.cudamail.com (mx1.cudamail.com [69.90.118.67]) by archives.nicira.com (Postfix) with ESMTPS id B2F8710AB8 for ; Wed, 23 Sep 2015 05:40:46 -0700 (PDT) Received: from bar5.cudamail.com (unknown [192.168.21.12]) by mx1e4.cudamail.com (Postfix) with ESMTPS id 5B4AD1E0199 for ; Wed, 23 Sep 2015 06:40:45 -0600 (MDT) X-ASG-Debug-ID: 1443012042-09eadd11e830a900001-byXFYA Received: from mx1-pf2.cudamail.com ([192.168.24.2]) by bar5.cudamail.com with ESMTP id fgyQ2qkPlxX3lNqc (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Wed, 23 Sep 2015 06:40:42 -0600 (MDT) X-Barracuda-Envelope-From: svinturis@cloudbasesolutions.com X-Barracuda-RBL-Trusted-Forwarder: 192.168.24.2 Received: from unknown (HELO cbssmtp1.cloudbase.local) (91.232.152.5) by mx1-pf2.cudamail.com with SMTP; 23 Sep 2015 12:40:41 -0000 Received-SPF: pass (mx1-pf2.cudamail.com: SPF record at cloudbasesolutions.com designates 91.232.152.5 as permitted sender) X-Barracuda-Apparent-Source-IP: 91.232.152.5 X-Barracuda-RBL-IP: 91.232.152.5 Received: from localhost (localhost [127.0.0.1]) by cbssmtp1.cloudbase.local (Postfix) with ESMTP id 311484215E for ; Wed, 23 Sep 2015 15:40:40 +0300 (EEST) X-Virus-Scanned: amavisd-new at cloudbasesolutions.com Received: from cbssmtp1.cloudbase.local ([127.0.0.1]) by localhost (cbssmtp1.cloudbase.local [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id nsWARWkNx799 for ; Wed, 23 Sep 2015 15:40:19 +0300 (EEST) Received: from CBSEX1.cloudbase.local (unknown [10.77.78.3]) by cbssmtp1.cloudbase.local (Postfix) with ESMTP id 9EBF53FF9E for ; Wed, 23 Sep 2015 15:40:19 +0300 (EEST) Received: from CBSEX1.cloudbase.local ([10.77.78.3]) by CBSEX1.cloudbase.local ([10.77.78.3]) with mapi id 14.03.0224.002; Wed, 23 Sep 2015 14:40:19 +0200 X-CudaMail-Envelope-Sender: svinturis@cloudbasesolutions.com From: Sorin Vinturis To: "dev@openvswitch.org" X-CudaMail-MID: CM-E2-922016103 X-CudaMail-DTE: 092315 X-CudaMail-Originating-IP: 91.232.152.5 Thread-Topic: [PATCH] datapath-windows: Avoid unnecessary vport array search X-ASG-Orig-Subj: [##CM-E2-922016103##][PATCH] datapath-windows: Avoid unnecessary vport array search Thread-Index: AQHQ9f0AgBlZF5Fl3EOlBlZ7l2i6Jw== Date: Wed, 23 Sep 2015 12:40:18 +0000 Message-ID: <1441159785-16317-1-git-send-email-svinturis@cloudbasesolutions.com> Accept-Language: en-US, it-IT Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.77.78.1] MIME-Version: 1.0 X-GBUdb-Analysis: 0, 91.232.152.5, Ugly c=0.291963 p=-0.529412 Source Normal X-MessageSniffer-Rules: 0-0-0-20552-c X-Barracuda-Connect: UNKNOWN[192.168.24.2] X-Barracuda-Start-Time: 1443012042 X-Barracuda-Encrypted: DHE-RSA-AES256-SHA X-Barracuda-URL: https://web.cudamail.com:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at cudamail.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=3.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=3.0 tests=BSF_RULE7568M, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.22819 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Subject: [ovs-dev] [PATCH] datapath-windows: Avoid unnecessary vport array search X-BeenThere: dev@openvswitch.org X-Mailman-Version: 2.1.16 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@openvswitch.org Sender: "dev" Signed-off-by: Sorin Vinturis Acked-by: Sairam Venugopal --- This patch is for both master and 2.4 branch. --- datapath-windows/ovsext/Actions.c | 20 ++++++++++---------- datapath-windows/ovsext/PacketIO.c | 6 +++--- datapath-windows/ovsext/PacketIO.h | 10 +++++----- datapath-windows/ovsext/Tunnel.c | 8 ++++---- datapath-windows/ovsext/User.c | 12 ++++-------- datapath-windows/ovsext/User.h | 5 +++-- 6 files changed, 29 insertions(+), 32 deletions(-) diff --git a/datapath-windows/ovsext/Actions.c b/datapath-windows/ovsext/Actions.c index bfe5d7f..b4644a7 100644 --- a/datapath-windows/ovsext/Actions.c +++ b/datapath-windows/ovsext/Actions.c @@ -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"); @@ -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); @@ -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); diff --git a/datapath-windows/ovsext/PacketIO.c b/datapath-windows/ovsext/PacketIO.c index d41335b..cfbae34 100644 --- a/datapath-windows/ovsext/PacketIO.c +++ b/datapath-windows/ovsext/PacketIO.c @@ -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; @@ -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) { diff --git a/datapath-windows/ovsext/PacketIO.h b/datapath-windows/ovsext/PacketIO.h index 4d29a18..7247869 100644 --- a/datapath-windows/ovsext/PacketIO.h +++ b/datapath-windows/ovsext/PacketIO.h @@ -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); diff --git a/datapath-windows/ovsext/Tunnel.c b/datapath-windows/ovsext/Tunnel.c index ffb9c01..eea4a84 100644 --- a/datapath-windows/ovsext/Tunnel.c +++ b/datapath-windows/ovsext/Tunnel.c @@ -309,8 +309,8 @@ 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 { @@ -318,8 +318,8 @@ OvsInjectPacketThroughActions(PNET_BUFFER_LIST pNbl, 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); diff --git a/datapath-windows/ovsext/User.c b/datapath-windows/ovsext/User.c index 8045e9a..7af4816 100644 --- a/datapath-windows/ovsext/User.c +++ b/datapath-windows/ovsext/User.c @@ -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, @@ -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); @@ -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, @@ -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; @@ -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++; diff --git a/datapath-windows/ovsext/User.h b/datapath-windows/ovsext/User.h index 139b0ca..9182585 100644 --- a/datapath-windows/ovsext/User.h +++ b/datapath-windows/ovsext/User.h @@ -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, @@ -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,