Hi Wilson,
Sorry for the delay and thank you for the patch.
Apologies for the format but unfortunately I don't have a proper mail client on
this machine.
I hope this will be readable.
B<--------------------------------------
diff --git a/datapath-windows/ovsext/Conntrack-nat.c
b/datapath-windows/ovsext/Conntrack-nat.c
index 497354ec8..a222f6aea 100644
--- a/datapath-windows/ovsext/Conntrack-nat.c
+++ b/datapath-windows/ovsext/Conntrack-nat.c
@@ -108,6 +108,7 @@ NTSTATUS OvsNatInit()
OVS_CT_POOL_TAG);
if (ovsUnNatTable == NULL) {
OvsFreeMemoryWithTag(ovsNatTable, OVS_CT_POOL_TAG);
+ ovsNatTable = NULL;
return STATUS_INSUFFICIENT_RESOURCES;
}
@@ -157,7 +158,6 @@ VOID OvsNatFlush(UINT16 zone)
VOID OvsNatCleanup()
{
if (ovsNatTable == NULL) {
- NdisFreeSpinLock(&ovsCtNatLock);
return;
}
[Alin] Nice catch
diff --git a/datapath-windows/ovsext/Conntrack.c
b/datapath-windows/ovsext/Conntrack.c
index 39ba5cc10..156861d6c 100644
--- a/datapath-windows/ovsext/Conntrack.c
+++ b/datapath-windows/ovsext/Conntrack.c
@@ -94,16 +94,28 @@ OvsInitConntrack(POVS_SWITCH_CONTEXT context)
if (status != STATUS_SUCCESS) {
goto freeBucketLock;
}
-
- ObReferenceObjectByHandle(threadHandle, SYNCHRONIZE, NULL, KernelMode,
- &ctThreadCtx.threadObject, NULL);
+ ctThreadCtx.exit = 0;
+ status = ObReferenceObjectByHandle(threadHandle, SYNCHRONIZE, NULL,
KernelMode,
+ &ctThreadCtx.threadObject, NULL);
ZwClose(threadHandle);
threadHandle = NULL;
+ if (!NT_SUCCESS(status)) {
+ ctThreadCtx.exit = 1;
+ KeSetEvent(&ctThreadCtx.event, 0, FALSE);
+ KeWaitForSingleObject(ctThreadCtx.threadObject, Executive,
+ KernelMode, FALSE, NULL);
+ goto freeBucketLock;
+ }
[Alin] This is already done in OvsCleanupConntrack lets just readjust the code
and call it in case of failure.
zoneInfo = OvsAllocateMemoryWithTag(sizeof(OVS_CT_ZONE_INFO) *
CT_MAX_ZONE, OVS_CT_POOL_TAG);
if (zoneInfo == NULL) {
status = STATUS_INSUFFICIENT_RESOURCES;
+ ctThreadCtx.exit = 1;
+ KeSetEvent(&ctThreadCtx.event, 0, FALSE);
+ KeWaitForSingleObject(ctThreadCtx.threadObject, Executive,
+ KernelMode, FALSE, NULL);
+ ObDereferenceObject(ctThreadCtx.threadObject);
goto freeBucketLock;
}
[Alin] Same as above lets call OvsCleanupConntrack.
@@ -119,7 +131,7 @@ OvsInitConntrack(POVS_SWITCH_CONTEXT context)
if (status != STATUS_SUCCESS) {
OvsCleanupConntrack();
}
- return STATUS_SUCCESS;
+ return status;
freeBucketLock:
for (UINT32 i = 0; i < numBucketLocks; i++) {
@@ -172,6 +184,7 @@ OvsCleanupConntrack(VOID)
NdisFreeSpinLock(&ovsCtZoneLock);
if (zoneInfo) {
OvsFreeMemoryWithTag(zoneInfo, OVS_CT_POOL_TAG);
+ zoneInfo = NULL;
[Alin] Why is this needed?
}
}
@@ -1520,6 +1533,8 @@ OvsConntrackEntryCleaner(PVOID data)
LOCK_STATE_EX lockState;
BOOLEAN success = TRUE;
+ OVS_LOG_INFO("Start the OVS ConntrackEntry Cleaner system thread,"
+ " context: %p", context);
while (success) {
if (context->exit) {
break;
@@ -1541,6 +1556,7 @@ OvsConntrackEntryCleaner(PVOID data)
KeWaitForSingleObject(&context->event, Executive, KernelMode,
FALSE, (LARGE_INTEGER *)&threadSleepTimeout);
}
+ OVS_LOG_INFO("Terminate the OVS ConntrackEntry Cleaner system thread");
PsTerminateSystemThread(STATUS_SUCCESS);
}
--
2.39.2 (Apple Git-143)
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev