[ovs-dev] [PATCH v4] datapath-windows: Incorrect assumption of the IRQL
Sorin Vinturis
svinturis at cloudbasesolutions.com
Mon Oct 6 15:19:23 UTC 2014
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 at cloudbasesolutions.com>
Reported-by: Sorin Vinturis <svinturis at cloudbasesolutions.com>
Reported-at: https://github.com/openvswitch/ovs-issues/issues/47
Acked-by: Nithin Raju <nithin at vmware.com>
Acked-by: Alin Gabriel Serdean <aserdean at cloudbasesolutions.com>
Acked-by: Eitan Eliahu <eliahue at vmware.com>
---
datapath-windows/ovsext/Datapath.c | 5 +++--
datapath-windows/ovsext/Flow.c | 12 ++++++++----
datapath-windows/ovsext/PacketIO.c | 2 +-
3 files changed, 12 insertions(+), 7 deletions(-)
diff --git a/datapath-windows/ovsext/Datapath.c b/datapath-windows/ovsext/Datapath.c
index 44cdfc9..8ab689a 100644
--- a/datapath-windows/ovsext/Datapath.c
+++ b/datapath-windows/ovsext/Datapath.c
@@ -1397,8 +1397,9 @@ OvsGetVportDumpNext(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
* it means we have an array of pids, instead of a single pid.
* ATM we assume we have one pid only.
*/
-
- NdisAcquireRWLockRead(gOvsSwitchContext->dispatchLock, &lockState, 0);
+ ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
+ NdisAcquireRWLockRead(gOvsSwitchContext->dispatchLock, &lockState,
+ NDIS_RWL_AT_DISPATCH_LEVEL);
if (gOvsSwitchContext->numVports > 0) {
/* inBucket: the bucket, used for lookup */
diff --git a/datapath-windows/ovsext/Flow.c b/datapath-windows/ovsext/Flow.c
index 5cab6e1..0648155 100644
--- a/datapath-windows/ovsext/Flow.c
+++ b/datapath-windows/ovsext/Flow.c
@@ -1150,7 +1150,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;
@@ -1297,7 +1298,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);
@@ -1489,7 +1491,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;
@@ -1524,7 +1527,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);
diff --git a/datapath-windows/ovsext/PacketIO.c b/datapath-windows/ovsext/PacketIO.c
index ac7862d..87d7037 100644
--- a/datapath-windows/ovsext/PacketIO.c
+++ b/datapath-windows/ovsext/PacketIO.c
@@ -268,7 +268,7 @@ OvsStartNBLIngress(POVS_SWITCH_CONTEXT switchContext,
}
ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
- OvsAcquireDatapathRead(datapath, &dpLockState, dispatch);
+ OvsAcquireDatapathRead(datapath, &dpLockState, TRUE);
flow = OvsLookupFlow(datapath, &key, &hash, FALSE);
if (flow) {
--
1.9.0.msysgit.0
More information about the dev
mailing list