From patchwork Mon Aug 31 20:53:15 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sorin Vinturis X-Patchwork-Id: 512588 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 9E3F9140761 for ; Tue, 1 Sep 2015 06:53:46 +1000 (AEST) Received: from archives.nicira.com (localhost [127.0.0.1]) by archives.nicira.com (Postfix) with ESMTP id A49E110886; Mon, 31 Aug 2015 13:53:45 -0700 (PDT) X-Original-To: dev@openvswitch.org Delivered-To: dev@openvswitch.org Received: from mx1e3.cudamail.com (mx1.cudamail.com [69.90.118.67]) by archives.nicira.com (Postfix) with ESMTPS id 756D310132 for ; Mon, 31 Aug 2015 13:53:43 -0700 (PDT) Received: from bar5.cudamail.com (localhost [127.0.0.1]) by mx1e3.cudamail.com (Postfix) with ESMTPS id 752174205C3 for ; Mon, 31 Aug 2015 14:53:42 -0600 (MDT) X-ASG-Debug-ID: 1441054418-09eadd44af011a0001-byXFYA Received: from mx1-pf2.cudamail.com ([192.168.24.2]) by bar5.cudamail.com with ESMTP id RYZYDzdVbf4hu00I (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 31 Aug 2015 14:53:39 -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; 31 Aug 2015 20:53:38 -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 DE04D409FE for ; Mon, 31 Aug 2015 23:53:36 +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 0qYK2bRmF1Gu for ; Mon, 31 Aug 2015 23:53:16 +0300 (EEST) Received: from CBSEX1.cloudbase.local (unknown [10.77.78.3]) by cbssmtp1.cloudbase.local (Postfix) with ESMTP id 6A61C3FB27 for ; Mon, 31 Aug 2015 23:53:16 +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; Mon, 31 Aug 2015 22:53:16 +0200 X-CudaMail-Envelope-Sender: svinturis@cloudbasesolutions.com From: Sorin Vinturis To: "dev@openvswitch.org" X-CudaMail-MID: CM-E2-830075853 X-CudaMail-DTE: 083115 X-CudaMail-Originating-IP: 91.232.152.5 Thread-Topic: [PATCH v4 1/2] datapath-windows: Process tunnel filter requests iteratively X-ASG-Orig-Subj: [##CM-E2-830075853##][PATCH v4 1/2] datapath-windows: Process tunnel filter requests iteratively Thread-Index: AQHQ5C8OS3VBymEiv0W4uE8fV1gL2A== Date: Mon, 31 Aug 2015 20:53:15 +0000 Message-ID: <1441054394-4996-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.303425 p=-0.368421 Source Normal X-MessageSniffer-Rules: 0-0-0-13557-c X-Barracuda-Connect: UNKNOWN[192.168.24.2] X-Barracuda-Start-Time: 1441054419 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.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=3.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=3.0 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.22098 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Subject: [ovs-dev] [PATCH v4 1/2] datapath-windows: Process tunnel filter requests iteratively 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" In order to support IRP cancelling mechanism for pending IRPs, all tunnel filter requests, VXLAN create/delete tunnel, need to be processed iteratively. Signed-off-by: Sorin Vinturis Acked-by: Nithin Raju --- datapath-windows/ovsext/TunnelFilter.c | 103 ++++++++++----------------------- 1 file changed, 30 insertions(+), 73 deletions(-) diff --git a/datapath-windows/ovsext/TunnelFilter.c b/datapath-windows/ovsext/TunnelFilter.c index 00e57c3..6cf9a94 100644 --- a/datapath-windows/ovsext/TunnelFilter.c +++ b/datapath-windows/ovsext/TunnelFilter.c @@ -955,38 +955,25 @@ OvsTunnelFilterExecuteAction(HANDLE engineSession, /* * -------------------------------------------------------------------------- - * This function pops the whole request entries from the queue and returns the - * number of entries through the 'count' parameter. The operation is - * synchronized using request list spinlock. + * This function pops the head item from the requests list while holding + * the list's spinlock. * -------------------------------------------------------------------------- */ -VOID -OvsTunnelFilterRequestPopList(POVS_TUNFLT_REQUEST_LIST listRequests, - PLIST_ENTRY head, - UINT32 *count) +POVS_TUNFLT_REQUEST +OvsTunnelFilterRequestPop(POVS_TUNFLT_REQUEST_LIST listRequests) { + POVS_TUNFLT_REQUEST request = NULL; + NdisAcquireSpinLock(&listRequests->spinlock); if (!IsListEmpty(&listRequests->head)) { - PLIST_ENTRY PrevEntry; - PLIST_ENTRY NextEntry; - - NextEntry = listRequests->head.Flink; - PrevEntry = listRequests->head.Blink; - - head->Flink = NextEntry; - NextEntry->Blink = head; - - head->Blink = PrevEntry; - PrevEntry->Flink = head; - - *count = listRequests->numEntries; - - InitializeListHead(&listRequests->head); - listRequests->numEntries = 0; + request = (POVS_TUNFLT_REQUEST)RemoveHeadList(&listRequests->head); + listRequests->numEntries--; } NdisReleaseSpinLock(&listRequests->spinlock); + + return request; } /* @@ -1056,16 +1043,10 @@ VOID OvsTunnelFilterRequestListProcess(POVS_TUNFLT_THREAD_CONTEXT threadCtx) { POVS_TUNFLT_REQUEST request = NULL; - PLIST_ENTRY link = NULL; - PLIST_ENTRY next = NULL; - LIST_ENTRY head; NTSTATUS status = STATUS_SUCCESS; - UINT32 count = 0; BOOLEAN inTransaction = FALSE; - BOOLEAN error = TRUE; - do - { + do { if (!InterlockedCompareExchange( (LONG volatile *)&threadCtx->listRequests.numEntries, 0, 0)) { OVS_LOG_INFO("Nothing to do... request list is empty."); @@ -1080,38 +1061,24 @@ OvsTunnelFilterRequestListProcess(POVS_TUNFLT_THREAD_CONTEXT threadCtx) } inTransaction = TRUE; - InitializeListHead(&head); - OvsTunnelFilterRequestPopList(&threadCtx->listRequests, &head, &count); - - LIST_FORALL_SAFE(&head, link, next) { - request = CONTAINING_RECORD(link, OVS_TUNFLT_REQUEST, entry); - - status = OvsTunnelFilterExecuteAction(threadCtx->engineSession, - request); - if (!NT_SUCCESS(status)) { - RemoveEntryList(&request->entry); - count--; - - /* Complete the IRP with the failure status. */ - OvsTunnelFilterCompleteRequest(request->irp, - request->callback, - request->context, - status); - OvsFreeMemory(request); - request = NULL; - } else { - error = FALSE; - } - } + while (NULL != + (request = OvsTunnelFilterRequestPop(&threadCtx->listRequests))) { - if (error) { - /* No successful requests were made, so there is no point to commit - * the transaction. */ - break; + status = OvsTunnelFilterExecuteAction(threadCtx->engineSession, + request); + + /* Complete the IRP with the last operation status. */ + OvsTunnelFilterCompleteRequest(request->irp, + request->callback, + request->context, + status); + + OvsFreeMemory(request); + request = NULL; } status = FwpmTransactionCommit(threadCtx->engineSession); - if (!NT_SUCCESS(status)){ + if (!NT_SUCCESS(status)) { OVS_LOG_ERROR("Failed to commit transaction, status: %x.", status); break; @@ -1125,20 +1092,6 @@ OvsTunnelFilterRequestListProcess(POVS_TUNFLT_THREAD_CONTEXT threadCtx) OVS_LOG_ERROR("Failed to execute request, status: %x.\ Transaction aborted.", status); } - - /* Complete the requests successfully executed with the transaction commit - * status. */ - while (count) { - request = (POVS_TUNFLT_REQUEST)RemoveHeadList(&head); - count--; - - OvsTunnelFilterCompleteRequest(request->irp, - request->callback, - request->context, - status); - OvsFreeMemory(request); - request = NULL; - } } /* @@ -1194,7 +1147,7 @@ OvsTunnelFilterThreadProc(PVOID context) OvsTunnelFilterRequestListProcess(threadCtx); break; default: - /* Finish processing the received requests and exit. */ + /* Finish processing the remaining requests and exit. */ OvsTunnelFilterRequestListProcess(threadCtx); exit = TRUE; break; @@ -1423,6 +1376,10 @@ OvsTunnelFilterQueueRequest(PIRP irp, } while (error); if (error) { + OvsTunnelFilterCompleteRequest(irp, + callback, + tunnelContext, + status); if (request) { OvsFreeMemory(request); request = NULL;