Acked-by: Nithin Raju <nit...@vmware.com> -----Original Message----- From: dev <dev-boun...@openvswitch.org> on behalf of Sairam Venugopal <vsai...@vmware.com> Date: Wednesday, June 29, 2016 at 5:08 PM To: "dev@openvswitch.org" <dev@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 <vsai...@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 *)¤tTime); > 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@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= _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev