summaryrefslogtreecommitdiff
path: root/datapath-windows/ovsext/Flow.c
diff options
context:
space:
mode:
authorSorin Vinturis <svinturis@cloudbasesolutions.com>2014-10-06 15:19:23 +0000
committerBen Pfaff <blp@nicira.com>2014-10-06 15:35:11 -0700
commit1ce4551c8c158e465734e26589d8444477cd5218 (patch)
tree7e86952e3111ff35b5127de82ee4c4e9f01cafe8 /datapath-windows/ovsext/Flow.c
parent52a524eb20462dd20d2e4e38d0fe97c07de040a7 (diff)
downloadopenvswitch-1ce4551c8c158e465734e26589d8444477cd5218.tar.gz
datapath-windows: Incorrect assumption of the IRQL
Acquiring a spin lock raises the IRQL to DISPATCH_LEVEL. But in many places of the code, while holding a spin lock, there are useless checks for the current IRQL against DISPATCH_LEVEL. Also, the dispatch flag is not correctly set when calling NdisAcquireRWLockXXX() functions, which causes an extra check of the current IRQL. Signed-off-by: Sorin Vinturis <svinturis@cloudbasesolutions.com> Reported-by: Sorin Vinturis <svinturis@cloudbasesolutions.com> Reported-at: https://github.com/openvswitch/ovs-issues/issues/47 Acked-by: Nithin Raju <nithin@vmware.com> Acked-by: Alin Gabriel Serdean <aserdean@cloudbasesolutions.com> Acked-by: Eitan Eliahu <eliahue@vmware.com> Signed-off-by: Ben Pfaff <blp@nicira.com>
Diffstat (limited to 'datapath-windows/ovsext/Flow.c')
-rw-r--r--datapath-windows/ovsext/Flow.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/datapath-windows/ovsext/Flow.c b/datapath-windows/ovsext/Flow.c
index ebcf005d6..50fa954c1 100644
--- a/datapath-windows/ovsext/Flow.c
+++ b/datapath-windows/ovsext/Flow.c
@@ -1935,7 +1935,8 @@ OvsDoDumpFlows(OvsFlowDumpInput *dumpInput,
datapath = &gOvsSwitchContext->datapath;
ASSERT(datapath);
- OvsAcquireDatapathRead(datapath, &dpLockState, FALSE);
+ ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
+ OvsAcquireDatapathRead(datapath, &dpLockState, TRUE);
head = &datapath->flowTable[rowIndex];
node = head->Flink;
@@ -2077,7 +2078,8 @@ OvsPutFlowIoctl(PVOID inputBuffer,
datapath = &gOvsSwitchContext->datapath;
ASSERT(datapath);
- OvsAcquireDatapathWrite(datapath, &dpLockState, FALSE);
+ ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
+ OvsAcquireDatapathWrite(datapath, &dpLockState, TRUE);
status = HandleFlowPut(put, datapath, stats);
OvsReleaseDatapath(datapath, &dpLockState);
@@ -2256,7 +2258,8 @@ OvsGetFlowIoctl(PVOID inputBuffer,
datapath = &gOvsSwitchContext->datapath;
ASSERT(datapath);
- OvsAcquireDatapathRead(datapath, &dpLockState, FALSE);
+ ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
+ OvsAcquireDatapathRead(datapath, &dpLockState, TRUE);
flow = OvsLookupFlow(datapath, &getInput->key, &hash, FALSE);
if (!flow) {
status = STATUS_INVALID_PARAMETER;
@@ -2289,7 +2292,8 @@ OvsFlushFlowIoctl(UINT32 dpNo)
datapath = &gOvsSwitchContext->datapath;
ASSERT(datapath);
- OvsAcquireDatapathWrite(datapath, &dpLockState, FALSE);
+ ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
+ OvsAcquireDatapathWrite(datapath, &dpLockState, TRUE);
DeleteAllFlows(datapath);
OvsReleaseDatapath(datapath, &dpLockState);