X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=datapath-windows%2Fovsext%2FFlow.c;h=69b546a587cee662d2844cc614fec300109dfa82;hb=706c0c0c17adcb3feb0e51e48c4e4a362f0e7ae9;hp=97220b4687a5a6a273d955297ae0b98238a01e2f;hpb=99075373dab5cdd0a4305e9e7036c9e125579e0a;p=cascardo%2Fovs.git diff --git a/datapath-windows/ovsext/Flow.c b/datapath-windows/ovsext/Flow.c index 97220b468..69b546a58 100644 --- a/datapath-windows/ovsext/Flow.c +++ b/datapath-windows/ovsext/Flow.c @@ -31,7 +31,6 @@ #pragma warning( push ) #pragma warning( disable:4127 ) -extern PNDIS_SPIN_LOCK gOvsCtrlLock; extern POVS_SWITCH_CONTEXT gOvsSwitchContext; extern UINT64 ovsTimeIncrementPerTick; @@ -319,7 +318,7 @@ OvsFlowNlCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx, rc = OvsPutFlowIoctl(&mappedFlow, sizeof (struct OvsFlowPut), &stats); if (rc != STATUS_SUCCESS) { - OVS_LOG_ERROR("OvsFlowPut failed."); + OVS_LOG_ERROR("OvsPutFlowIoctl failed."); goto done; } @@ -1514,6 +1513,11 @@ OvsDeleteFlowTable(OVS_DATAPATH *datapath) DeleteAllFlows(datapath); OvsFreeMemoryWithTag(datapath->flowTable, OVS_FLOW_POOL_TAG); datapath->flowTable = NULL; + + if (datapath->lock == NULL) { + return NDIS_STATUS_SUCCESS; + } + NdisFreeRWLock(datapath->lock); return NDIS_STATUS_SUCCESS; @@ -1545,6 +1549,10 @@ OvsAllocateFlowTable(OVS_DATAPATH *datapath, } datapath->lock = NdisAllocateRWLock(switchContext->NdisFilterHandle); + if (!datapath->lock) { + return NDIS_STATUS_RESOURCES; + } + return NDIS_STATUS_SUCCESS; } @@ -1995,25 +2003,23 @@ OvsDoDumpFlows(OvsFlowDumpInput *dumpInput, BOOLEAN findNextNonEmpty = FALSE; dpNo = dumpInput->dpNo; - NdisAcquireSpinLock(gOvsCtrlLock); if (gOvsSwitchContext->dpNo != dpNo) { status = STATUS_INVALID_PARAMETER; - goto unlock; + goto exit; } rowIndex = dumpInput->position[0]; if (rowIndex >= OVS_FLOW_TABLE_SIZE) { dumpOutput->n = 0; *replyLen = sizeof(*dumpOutput); - goto unlock; + goto exit; } columnIndex = dumpInput->position[1]; datapath = &gOvsSwitchContext->datapath; ASSERT(datapath); - ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); - OvsAcquireDatapathRead(datapath, &dpLockState, TRUE); + OvsAcquireDatapathRead(datapath, &dpLockState, FALSE); head = &datapath->flowTable[rowIndex]; node = head->Flink; @@ -2062,8 +2068,7 @@ OvsDoDumpFlows(OvsFlowDumpInput *dumpInput, dp_unlock: OvsReleaseDatapath(datapath, &dpLockState); -unlock: - NdisReleaseSpinLock(gOvsCtrlLock); +exit: return status; } @@ -2124,21 +2129,18 @@ OvsPutFlowIoctl(PVOID inputBuffer, } dpNo = put->dpNo; - NdisAcquireSpinLock(gOvsCtrlLock); if (gOvsSwitchContext->dpNo != dpNo) { status = STATUS_INVALID_PARAMETER; - goto unlock; + goto exit; } datapath = &gOvsSwitchContext->datapath; ASSERT(datapath); - ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); - OvsAcquireDatapathWrite(datapath, &dpLockState, TRUE); + OvsAcquireDatapathWrite(datapath, &dpLockState, FALSE); status = HandleFlowPut(put, datapath, stats); OvsReleaseDatapath(datapath, &dpLockState); -unlock: - NdisReleaseSpinLock(gOvsCtrlLock); +exit: return status; } @@ -2170,7 +2172,6 @@ HandleFlowPut(OvsFlowPut *put, status = OvsPrepareFlow(&KernelFlow, put, hash); if (status != STATUS_SUCCESS) { - FreeFlow(KernelFlow); return STATUS_UNSUCCESSFUL; } @@ -2306,16 +2307,14 @@ OvsGetFlowIoctl(PVOID inputBuffer, } dpNo = getInput->dpNo; - NdisAcquireSpinLock(gOvsCtrlLock); if (gOvsSwitchContext->dpNo != dpNo) { status = STATUS_INVALID_PARAMETER; - goto unlock; + goto exit; } datapath = &gOvsSwitchContext->datapath; ASSERT(datapath); - ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); - OvsAcquireDatapathRead(datapath, &dpLockState, TRUE); + OvsAcquireDatapathRead(datapath, &dpLockState, FALSE); flow = OvsLookupFlow(datapath, &getInput->key, &hash, FALSE); if (!flow) { status = STATUS_INVALID_PARAMETER; @@ -2327,8 +2326,7 @@ OvsGetFlowIoctl(PVOID inputBuffer, dp_unlock: OvsReleaseDatapath(datapath, &dpLockState); -unlock: - NdisReleaseSpinLock(gOvsCtrlLock); +exit: return status; } @@ -2339,21 +2337,18 @@ OvsFlushFlowIoctl(UINT32 dpNo) OVS_DATAPATH *datapath = NULL; LOCK_STATE_EX dpLockState; - NdisAcquireSpinLock(gOvsCtrlLock); if (gOvsSwitchContext->dpNo != dpNo) { status = STATUS_INVALID_PARAMETER; - goto unlock; + goto exit; } datapath = &gOvsSwitchContext->datapath; ASSERT(datapath); - ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); - OvsAcquireDatapathWrite(datapath, &dpLockState, TRUE); + OvsAcquireDatapathWrite(datapath, &dpLockState, FALSE); DeleteAllFlows(datapath); OvsReleaseDatapath(datapath, &dpLockState); -unlock: - NdisReleaseSpinLock(gOvsCtrlLock); +exit: return status; }