[ovs-dev] [PATCH v4 09/11] datapath-windows: Track the number of conntrack entries

Nithin Raju nithin at vmware.com
Fri Jul 1 02:25:12 UTC 2016


Acked-by: Nithin Raju <nithin at vmware.com>

-----Original Message-----
From: dev <dev-bounces at openvswitch.org> on behalf of Sairam Venugopal
<vsairam at vmware.com>
Date: Wednesday, June 29, 2016 at 5:08 PM
To: "dev at openvswitch.org" <dev at openvswitch.org>
Subject: [ovs-dev] [PATCH v4 09/11] datapath-windows: Track the number
of	conntrack entries

>Add a counter to track the number of connection tracking entries. Iterate
>over the conntrack entry table only if there are entries.
>
>Signed-off-by: Sairam Venugopal <vsairam at vmware.com>
>---
> datapath-windows/ovsext/Conntrack.c | 108
>++++++++++++++++++++----------------
> 1 file changed, 60 insertions(+), 48 deletions(-)
>
>diff --git a/datapath-windows/ovsext/Conntrack.c
>b/datapath-windows/ovsext/Conntrack.c
>index 1780f60..6cc0fb8 100644
>--- a/datapath-windows/ovsext/Conntrack.c
>+++ b/datapath-windows/ovsext/Conntrack.c
>@@ -39,6 +39,7 @@ static PLIST_ENTRY ovsConntrackTable;
> static OVS_CT_THREAD_CTX ctThreadCtx;
> static PNDIS_RW_LOCK_EX ovsConntrackLockObj;
> extern POVS_SWITCH_CONTEXT gOvsSwitchContext;
>+static UINT64 ctTotalEntries;
> 
> /*
>  
>*-------------------------------------------------------------------------
>---
>@@ -51,6 +52,7 @@ OvsInitConntrack(POVS_SWITCH_CONTEXT context)
> {
>     NTSTATUS status;
>     HANDLE threadHandle = NULL;
>+    ctTotalEntries = 0;
> 
>     /* Init the sync-lock */
>     ovsConntrackLockObj = NdisAllocateRWLock(context->NdisFilterHandle);
>@@ -160,6 +162,7 @@ OvsCtAddEntry(POVS_CT_ENTRY entry,
>OvsConntrackKeyLookupCtx *ctx, UINT64 now)
>     entry->timestampStart = now;
>     InsertHeadList(&ovsConntrackTable[ctx->hash & CT_HASH_TABLE_MASK],
>                    &entry->link);
>+    ctTotalEntries++;
>}
> 
> static __inline POVS_CT_ENTRY
>@@ -252,6 +255,7 @@ OvsCtEntryDelete(POVS_CT_ENTRY entry)
> {
>     RemoveEntryList(&entry->link);
>     OvsFreeMemoryWithTag(entry, OVS_CT_POOL_TAG);
>+    ctTotalEntries--;
> }
> 
> static __inline BOOLEAN
>@@ -322,6 +326,11 @@ OvsCtLookup(OvsConntrackKeyLookupCtx *ctx)
>     BOOLEAN reply = FALSE;
>     POVS_CT_ENTRY found = NULL;
> 
>+    if (!ctTotalEntries)
>+    {
>+        return found;
>+    }
>+
>     LIST_FORALL(&ovsConntrackTable[ctx->hash & CT_HASH_TABLE_MASK],
>link) {
>         entry = CONTAINING_RECORD(link, OVS_CT_ENTRY, link);
> 
>@@ -636,15 +645,16 @@ ovsConntrackEntryCleaner(PVOID data)
>         NdisGetCurrentSystemTime((LARGE_INTEGER *)&currentTime);
>         threadSleepTimeout = currentTime + CT_CLEANUP_INTERVAL;
> 
>-        for (int i = 0; i < CT_HASH_TABLE_SIZE; i++) {
>-            LIST_FORALL_SAFE(&ovsConntrackTable[i], link, next) {
>-                entry = CONTAINING_RECORD(link, OVS_CT_ENTRY, link);
>-                if (entry->expiration < currentTime) {
>-                    OvsCtEntryDelete(entry);
>+        if (ctTotalEntries) {
>+            for (int i = 0; i < CT_HASH_TABLE_SIZE; i++) {
>+                LIST_FORALL_SAFE(&ovsConntrackTable[i], link, next) {
>+                    entry = CONTAINING_RECORD(link, OVS_CT_ENTRY, link);
>+                    if (entry->expiration < currentTime) {
>+                        OvsCtEntryDelete(entry);
>+                    }
>                 }
>             }
>         }
>-
>         NdisReleaseRWLock(ovsConntrackLockObj, &lockState);
>         KeWaitForSingleObject(&context->event, Executive, KernelMode,
>                               FALSE, (LARGE_INTEGER
>*)&threadSleepTimeout);
>@@ -667,12 +677,13 @@ OvsCtFlush(UINT16 zone)
> 
>     LOCK_STATE_EX lockState;
>     NdisAcquireRWLockWrite(ovsConntrackLockObj, &lockState, 0);
>-
>-    for (int i = 0; i < CT_HASH_TABLE_SIZE; i++) {
>-        LIST_FORALL_SAFE(&ovsConntrackTable[i], link, next) {
>-            entry = CONTAINING_RECORD(link, OVS_CT_ENTRY, link);
>-            if (!zone || zone == entry->key.zone)
>-                OvsCtEntryDelete(entry);
>+    if (ctTotalEntries) {
>+        for (int i = 0; i < CT_HASH_TABLE_SIZE; i++) {
>+            LIST_FORALL_SAFE(&ovsConntrackTable[i], link, next) {
>+                entry = CONTAINING_RECORD(link, OVS_CT_ENTRY, link);
>+                if (!zone || zone == entry->key.zone)
>+                    OvsCtEntryDelete(entry);
>+            }
>         }
>     }
> 
>@@ -1081,7 +1092,6 @@ OvsCtDumpCmdHandler(POVS_USER_PARAMS_CONTEXT
>usrParamsCtx,
>     POVS_OPEN_INSTANCE instance =
>         (POVS_OPEN_INSTANCE)usrParamsCtx->ovsInstance;
>     POVS_MESSAGE msgIn;
>-    UINT32 i;
> 
>     ASSERT(usrParamsCtx->devOp == OVS_READ_DEV_OP);
>     if (instance->dumpState.ovsMsg == NULL) {
>@@ -1094,54 +1104,56 @@ OvsCtDumpCmdHandler(POVS_USER_PARAMS_CONTEXT
>usrParamsCtx,
>     msgIn = instance->dumpState.ovsMsg;
>     UINT32 inBucket = instance->dumpState.index[0];
>     UINT32 inIndex = instance->dumpState.index[1];
>+    UINT32 i = CT_HASH_TABLE_SIZE;
>     UINT32 outIndex = 0;
> 
>     LOCK_STATE_EX lockState;
>     NdisAcquireRWLockRead(ovsConntrackLockObj, &lockState, 0);
> 
>-    for (i = inBucket; i < CT_HASH_TABLE_SIZE; i++) {
>-        PLIST_ENTRY head, link;
>-        head = &ovsConntrackTable[i];
>-        POVS_CT_ENTRY entry = NULL;
>-
>-        outIndex = 0;
>-        LIST_FORALL(head, link) {
>-            /*
>-             * if one or more dumps were previously done on this same
>bucket,
>-             * inIndex will be > 0, so we'll need to reply with the
>-             * inIndex + 1 ct-entry from the bucket.
>-             */
>-            if (outIndex >= inIndex) {
>-                entry = CONTAINING_RECORD(link, OVS_CT_ENTRY, link);
>-
>-                rc = OvsCreateNlMsgFromCtEntry(entry, msgIn,
>-                 
>usrParamsCtx->outputBuffer,
>-                 
>usrParamsCtx->outputLength,
>-                                               gOvsSwitchContext->dpNo);
>-
>-                if (rc != NDIS_STATUS_SUCCESS) {
>-                    NdisReleaseRWLock(ovsConntrackLockObj, &lockState);
>-                    return STATUS_UNSUCCESSFUL;
>+    if (ctTotalEntries) {
>+        for (i = inBucket; i < CT_HASH_TABLE_SIZE; i++) {
>+            PLIST_ENTRY head, link;
>+            head = &ovsConntrackTable[i];
>+            POVS_CT_ENTRY entry = NULL;
>+
>+            outIndex = 0;
>+            LIST_FORALL(head, link) {
>+                /*
>+                 * if one or more dumps were previously done on this same
>+                 * bucket, inIndex will be > 0, so we'll need to reply
>with
>+                 * the inIndex + 1 ct-entry from the bucket.
>+                 */
>+                if (outIndex >= inIndex) {
>+                    entry = CONTAINING_RECORD(link, OVS_CT_ENTRY, link);
>+
>+                    rc = OvsCreateNlMsgFromCtEntry(entry, msgIn,
>+                 
>usrParamsCtx->outputBuffer,
>+                 
>usrParamsCtx->outputLength,
>+                 
>gOvsSwitchContext->dpNo);
>+
>+                    if (rc != NDIS_STATUS_SUCCESS) {
>+                        NdisReleaseRWLock(ovsConntrackLockObj,
>&lockState);
>+                        return STATUS_UNSUCCESSFUL;
>+                    }
>+
>+                    ++outIndex;
>+                    break;
>                 }
> 
>                 ++outIndex;
>-                break;
>             }
> 
>-            ++outIndex;
>-        }
>+            if (entry) {
>+                break;
>+            }
> 
>-        if (entry) {
>-            break;
>+            /*
>+             * if no ct-entry was found above, check the next bucket,
>beginning
>+             * with the first (i.e. index 0) elem from within that bucket
>+             */
>+            inIndex = 0;
>         }
>-
>-        /*
>-         * if no ct-entry was found above, check the next bucket,
>beginning
>-         * with the first (i.e. index 0) elem from within that bucket
>-         */
>-        inIndex = 0;
>     }
>-
>     instance->dumpState.index[0] = i;
>     instance->dumpState.index[1] = outIndex;
>     NdisReleaseRWLock(ovsConntrackLockObj, &lockState);
>-- 
>2.5.0.windows.1
>
>_______________________________________________
>dev mailing list
>dev at openvswitch.org
>https://urldefense.proofpoint.com/v2/url?u=http-3A__openvswitch.org_mailma
>n_listinfo_dev&d=CwIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=pN
>HQcdr7B40b4h6Yb7FIedI1dnBsxdDuTLBYD3JqV80&m=xe8nkKi29wQ1ByA901VkQLw8F3bUQs
>Ci0JoJYxugVQ0&s=WJS0HdiPfybyExqr9KEAJbQlgZlBPEaVdE24egF23dk&e= 



More information about the dev mailing list